跳到内容
+

从 v6 迁移到 v7

本指南描述了将日期和时间选择器从 v6 迁移到 v7 所需的更改。

介绍

这是一个将 @mui/x-date-pickers 从 v6 升级到 v7 的参考指南。要了解有关新主要版本更改的更多信息,请查看关于 MUI X v7 版本发布的博客文章

开始使用新版本

package.json 中,将日期选择器包的版本更改为 ^7.0.0

-"@mui/x-date-pickers": "^6.0.0",
+"@mui/x-date-pickers": "^7.0.0",

由于 v7 是一个主要版本发布,因此它包含影响公共 API 的更改。这些更改是为了提高一致性、改进稳定性和为新功能腾出空间而进行的。下面描述了从 v6 迁移到 v7 所需的步骤。

更新 @mui/material

为了能够选择使用 @mui/material 的最新 API,包对等依赖版本已更新为 ^5.15.14。这只是小版本更改,因此不应导致任何重大变更。请将您的 @mui/material 包更新到此版本或更高版本。

更新许可证包

如果您正在使用 Pickers 的商业版本(Pro 计划),则需要更新导入路径

-import { LicenseInfo } from '@mui/x-license-pro';
+import { LicenseInfo } from '@mui/x-license';

如果您的 package.jsondependencies 部分中有 @mui/x-license-pro,请重命名并将许可证包更新到最新版本

-"@mui/x-license-pro": ^6.0.0",
+"@mui/x-license": "^7.0.0",

运行代码转换

preset-safe 代码转换将自动调整您的大部分代码,以适应 v7 中的重大变更。您可以运行 v7.0.0/pickers/preset-safe,仅以日期和时间选择器为目标,或者运行 v7.0.0/preset-safe,以同时以其他 MUI X 组件(如数据网格)为目标。

选择 <path> 参数时,您可以选择在特定文件、文件夹或整个代码库上运行它。

// Date and Time Pickers specific
npx @mui/x-codemod@latest v7.0.0/pickers/preset-safe <path>

// Target other MUI X components as well
npx @mui/x-codemod@latest v7.0.0/preset-safe <path>

由该代码转换处理的重大变更在屏幕右侧的目录中用 ✅ emoji 符号表示。

如果您已应用 v7.0.0/pickers/preset-safe(或 v7.0.0/preset-safe)代码转换,则您应该无需对这些项目采取任何进一步的操作。

所有其他更改都必须手动处理。

重大变更

由于 v7 是一个主要版本发布,因此它包含一些影响公共 API 的更改。这些更改是为了提高一致性、改进稳定性和为新功能腾出空间而进行的。

放弃旧版捆绑包

所有 MUI X 包都已移除对 IE 11 的支持。不再包含用于支持 IE 11 等旧版浏览器的 legacy 捆绑包。

放弃 Webpack 4 支持

放弃对旧版浏览器的支持也意味着我们不再转译某些现代浏览器原生支持的功能,例如 Nullish CoalescingOptional Chaining

Webpack 4 不支持这些功能,因此如果您正在使用 Webpack 4,您将需要自行转译这些特性或升级到 Webpack 5。

以下是如何在 Webpack 4 上使用 @babel/preset-env 预设转译这些特性的示例

 // webpack.config.js

 module.exports = (env) => ({
   // ...
   module: {
     rules: [
       {
         test: /\.[jt]sx?$/,
-        exclude: /node_modules/,
+        exclude: [
+          {
+            test: path.resolve(__dirname, 'node_modules'),
+            exclude: [
+              // Covers @mui/x-date-pickers and @mui/x-date-pickers-pro
+              path.resolve(__dirname, 'node_modules/@mui/x-date-pickers'),
+              path.resolve(__dirname, 'node_modules/@mui/x-license'),
+            ],
+          },
+        ],
       },
     ],
   },
 });

组件插槽

components 重命名为 slots

componentscomponentsProps 属性已分别重命名为 slotsslotProps 属性。这是 MUI 维护的所有不同库之间缓慢且持续的努力。为了平滑过渡,它们在 v6 期间已被弃用。并且已从 v7 中移除。

如果尚未完成,则可以通过代码转换处理此修改

npx @mui/x-codemod@latest v7.0.0/pickers/ <path>

查看 RFC 以获取更多信息。

✅ 重命名插槽类型

插槽接口已重命名以与 @mui/base 命名约定匹配。后缀 SlotsComponentSlots 替换,SlotsComponentsPropsSlotProps 替换。如果您不依赖代码转换,请考虑检查 此文件 中所有重命名的类型。以下是 DateCalendar 类型化的示例。

-DateCalendarSlotsComponent
+DateCalendarSlots
-DateCalendarSlotsComponentsProps
+DateCalendarSlotProps

shortcuts 插槽 onChange 回调添加新参数

在选择快捷方式时触发的 onChange 回调现在需要两个新参数(以前它们是可选的)

 const CustomShortcuts = (props) => {
   return (
     <React.Fragment>
       {props.items.map(item => {
         const value = item.getValue({ isValid: props.isValid });
         return (
           <button
-            onClick={() => onChange(value)}
+            onClick={() => onChange(value, props.changeImportance ?? 'accept', item)}
           >
             {value}
           </button>
         )
       }}
     </React.Fragment>
   )
 }

 <DatePicker slots={{ shortcuts: CustomShortcuts }} />

更改 calendarHeader 插槽的导入

calendarHeader 插槽相关的导入已从 @mui/x-date-pickers/DateCalendar 移动到 @mui/x-date-pickers/PickersCalendarHeader

 export {
   pickersCalendarHeaderClasses,
   PickersCalendarHeaderClassKey,
   PickersCalendarHeaderClasses,
   PickersCalendarHeader,
   PickersCalendarHeaderProps,
   PickersCalendarHeaderSlotsComponent,
   PickersCalendarHeaderSlotsComponentsProps,
   ExportedPickersCalendarHeaderProps,
-} from '@mui/x-date-pickers/DateCalendar';
+} from '@mui/x-date-pickers/PickersCalendarHeader';

已移除的属性

shouldDisableClock 替换为 shouldDisableTime

已弃用的 shouldDisableClock 属性已被移除,建议使用更灵活的 shouldDisableTime 属性。shouldDisableClock 属性接收 value 作为小时、分钟或秒的 number。相反,shouldDisableTime 属性接收日期对象(基于使用的适配器)。您可以在 v6 迁移指南 中阅读有关此属性弃用的更多信息。

 <DateTimePicker
-  shouldDisableClock={(timeValue, view) => view === 'hours' && timeValue < 12}
+  shouldDisableTime={(value, view) => view === 'hours' && value.hour() < 12}
 />

✅ 将 defaultCalendarMonth 替换为 referenceDate

已弃用的 defaultCalendarMonth 属性已被移除,建议使用更灵活的 referenceDate 属性。

-<DateCalendar defaultCalendarMonth={dayjs('2022-04-01')};
+<DateCalendar referenceDate={dayjs('2022-04-01')} />

已修改的属性

移除 dayOfWeekFormatter 属性的字符串参数

dayOfWeekFormatter 属性的字符串参数已被替换,建议使用日期对象以允许更大的灵活性。

 <DateCalendar
   // If you were still using the day string, you can get it back with your date library.
-  dayOfWeekFormatter={dayStr => `${dayStr}.`}
+  dayOfWeekFormatter={day => `${day.format('dd')}.`}

   // If you were already using the day object, just remove the first argument.
-  dayOfWeekFormatter={(_dayStr, day) => `${day.format('dd')}.`
+  dayOfWeekFormatter={day => `${day.format('dd')}.`}
 />

所有日期相关属性现在都是严格类型的,仅接受您的适配器支持的日期格式(date-fnsDate 对象,days-jsdaysjs.Dayjs 对象等)。

字段组件

更新 selectedSections 的格式

selectedSections 属性不再接受开始和结束索引。当选择多个但并非全部部分时,字段组件的行为不正确,您现在只能选择一个或所有部分

 <DateField
-  selectedSections={{ startIndex: 0, endIndex: 0 }}
+  selectedSections={0}

   // If the field has 3 sections
-  selectedSections={{ startIndex: 0, endIndex: 2 }}
+  selectedSections="all"
 />

替换 section 的 hasLeadingZeros 属性

属性 hasLeadingZeros 已从 sections 中移除,建议使用更精确的 hasLeadingZerosInFormathasLeadingZerosInInput 属性。要保持相同的行为,您可以将其替换为 hasLeadingZerosInFormat

 const fieldRef = React.useRef<FieldRef<FieldSection>>(null);

 React.useEffect(() => {
   const firstSection = fieldRef.current!.getSections()[0];
-  console.log(firstSection.hasLeadingZeros);
+  console.log(firstSection.hasLeadingZerosInFormat);
 }, []);

 return <DateField unstableFieldRef={fieldRef} />;

无头字段

inputRef 移至传递给 hook 的 props 内部

字段 hook 现在仅接收 props,而不是包含 props 和 inputRef 的对象。

-const { inputRef, ...otherProps } = props
-const fieldResponse = useDateField({ props: otherProps, inputRef });
+const fieldResponse = useDateField(props);

如果您正在使用多输入范围字段 hook,则 startInputRefendInputRef 参数也适用

- const { inputRef: startInputRef, ...otherStartTextFieldProps } = startTextFieldProps
- const { inputRef: endInputRef, ...otherEndTextFieldProps } = endTextFieldProps

  const fieldResponse = useMultiInputDateRangeField({
    sharedProps,
-   startTextFieldProps: otherStartTextFieldProps,
-   endTextFieldProps: otherEndTextFieldProps,
-   startInputRef
-   endInputRef,
+   startTextFieldProps,
+   endTextFieldProps
  });

重命名 hook 返回的 ref 为 inputRef

当与 v6 TextField 方式(输入是 <input /> HTML 元素)一起使用时,字段 hook 返回一个 ref,该 ref 需要传递给 <input /> 元素。此 ref 以前名为 ref,为了更清晰,已重命名为 inputRef

  const fieldResponse = useDateField(props);

- return <input ref={fieldResponse.ref} />
+ return <input ref={fieldResponse.inputRef} />

如果您正在使用多输入范围字段 hook,则 startDateendDate 对象中的 ref 也适用

  const fieldResponse = useDateField(props);

  return (
    <div>
-     <input ref={fieldResponse.startDate.ref} />
+     <input ref={fieldResponse.startDate.inputRef} />
      <span>–</span>
-     <input ref={fieldResponse.endDate.ref} />
+     <input ref={fieldResponse.endDate.inputRef} />
    </div>
  )

重构 useClearableField 的 API

useClearableField hook API 已简化,现在接受 props 参数,而不是 fieldPropsInputPropsclearableonClearslotsslotProps 参数。

您现在应该能够直接将字段 hook(例如:useDateField)的返回值传递给 useClearableField

  const fieldResponse = useDateField(props);

- const { InputProps, onClear, clearable, slots, slotProps, ...otherFieldProps } = fieldResponse
- const { InputProps: ProcessedInputProps, fieldProps: processedFieldProps } = useClearableField({
-   fieldProps: otherFieldProps,
-   InputProps,
-   clearable,
-   onClear,
-   slots,
-   slotProps,
- });
-
-  return <MyCustomTextField {...processedFieldProps} InputProps={ProcessedInputProps} />

+ const processedFieldProps = useClearableField(fieldResponse);
+
+ return <MyCustomTextField {...processedFieldProps} />

不要将 enableAccessibleFieldDOMStructure 属性转发到 DOM

无头字段 hook(例如:useDateField)现在返回一个名为 enableAccessibleFieldDOMStructure 的新属性。这用于了解当前期望的 UI 是否是使用可访问的 DOM 结构构建的。

在构建自定义 UI 时,您很可能只支持一种 DOM 结构,因此您可以在将 enableAccessibleFieldDOMStructure 传递到 DOM 之前将其移除

  function MyCustomTextField(props) {
    const {
+     // Should be ignored
+     enableAccessibleFieldDOMStructure,

      // ... rest of the props you are using
    }

    return ( /* Some UI to edit the date */ )
  }

  function MyCustomField(props) {
    const fieldResponse = useDateField<Dayjs, false, typeof textFieldProps>({
      ...props,
+     // If you only support one DOM structure, we advise you to hardcode it
+     // here to avoid unwanted switches in your application.
+     enableAccessibleFieldDOMStructure: false,
    });

    return <MyCustomTextField ref={ref} {...fieldResponse} />;
  }

  function App() {
    return <DatePicker slots={{ field: MyCustomField }} />;
  }

日期管理

使用带有 luxon 的本地化周

当安装 Luxon v3.4.4 或更高版本时,AdapterLuxon 现在使用本地化周。此改进使 AdapterLuxon 与其他适配器的行为保持一致。

如果您想要保持每周的第一天为星期一,即使您的区域设置另有说明。您可以按如下方式硬编码周设置

import { Settings, Info } from 'luxon';

Settings.defaultWeekSettings = {
  firstDay: 1,
  minimalDays: Info.getMinimumDaysInFirstWeek(),
  weekend: Info.getWeekendWeekdays(),
};

移除 monthAndYear 格式

monthAndYear 格式已被移除。它用于日历视图的头部。您可以将其替换为 calendarHeader 插槽的新 format 属性

 <LocalizationProvider
   adapter={AdapterDayJS}
-  formats={{ monthAndYear: 'MM/YYYY' }}
 />
   <DatePicker
+    slotProps={{ calendarHeader: { format: 'MM/YYYY' }}}
   />
   <DateRangePicker
+    slotProps={{ calendarHeader: { format: 'MM/YYYY' }}}
   />
 <LocalizationProvider />

已重命名的变量

✅ 将 dayPickerClasses 变量重命名为 dayCalendarClasses

dayPickerClasses 变量已重命名为 dayCalendarClasses,以与 v6.0.0 中引入的 DayCalendar 组件的新名称保持一致。

-import { dayPickerClasses } from '@mui/x-date-pickers/DateCalendar';
+import { dayCalendarClasses } from '@mui/x-date-pickers/DateCalendar';

与 Day.js 一起使用

使用带有 Day.js 适配器的 UTC

LocalizationProviderdateLibInstance 属性不再与 AdapterDayjs 一起使用。在组件中实现正确的时区支持之前,此属性用于将选择器设置为 UTC 模式。

 // When a `value` or a `defaultValue` is provided
 <LocalizationProvider
   adapter={AdapterDayjs}
-  dateLibInstance={dayjs.utc}
 >
   <DatePicker value={dayjs.utc('2022-04-17')} />
 </LocalizationProvider>

 // When no `value` or `defaultValue` is provided
 <LocalizationProvider
   adapter={AdapterDayjs}
-  dateLibInstance={dayjs.utc}
 >
-  <DatePicker />
+  <DatePicker timezone="UTC" />
 </LocalizationProvider>

customParseFormat 一起使用

dayjs.extend(customParseFormatPlugin) 的调用已移动到 AdapterDayjs 构造函数。这允许用户在适配器使用它之前将自定义选项传递给此插件。

如果您在渲染第一个 LocalizationProvider 组件之前使用此插件,并且未在您自己的代码库中调用 dayjs.extend,则您需要手动扩展 dayjs

import dayjs from 'dayjs';
import customParseFormatPlugin from 'dayjs/plugin/customParseFormat';

dayjs.extend(customParseFormatPlugin);

其他插件仍然在适配器初始化之前添加。

移除根级别 locales 导出

locales 导出已从包的根目录中移除。为了减小捆绑包大小,现在只能从 @mui/x-date-pickers/locales@mui/x-date-pickers-pro/locales 路径访问 locales。如果您仍然依赖于根级别导出,请更新您的代码。

在 v7 之前,可以从包根目录导入 locales(即 import { frFR } from '@mui/x-date-pickers')。

-import { frFR } from '@mui/x-date-pickers';
+import { frFR } from '@mui/x-date-pickers/locales';

移除 dateTimeViewRenderers 导出

dateTimeViewRenderers 导出已被移除,建议重用现有的时间视图渲染器(renderTimeViewClockrenderDigitalClockTimeViewrenderMultiSectionDigitalClockTimeView)和日期视图渲染器(renderDateViewCalendar)来渲染 DesktopDateTimePicker

如果您依赖于此导入,您可以参考 DesktopDateTimePicker 的实现,以了解如何自己组合渲染器。

适配器内部更改

已移除的方法

显示重大变更

移除 dateWithTimezone 方法

dateWithTimezone 方法已被移除,其内容已移动到 date 方法。您可以改为使用 date 方法

-adapter.dateWithTimezone(undefined, 'system');
+adapter.date(undefined, 'system');

移除 getDiff 方法

getDiff 方法已被移除。您可以直接使用您的日期库

 // For Day.js
-const diff = adapter.getDiff(value, comparing, unit);
+const diff = value.diff(comparing, unit);

 // For Luxon
-const diff = adapter.getDiff(value, comparing, unit);
+const getDiff = (value: DateTime, comparing: DateTime | string, unit?: AdapterUnits) => {
+  const parsedComparing = typeof comparing === 'string'
+    ? DateTime.fromJSDate(new Date(comparing))
+    : comparing;
+  if (unit) {
+    return Math.floor(value.diff(comparing).as(unit));
+  }
+  return value.diff(comparing).as('millisecond');
+};
+
+const diff = getDiff(value, comparing, unit);

 // For DateFns
-const diff = adapter.getDiff(value, comparing, unit);
+const getDiff = (value: Date, comparing: Date | string, unit?: AdapterUnits) => {
+  const parsedComparing = typeof comparing === 'string' ? new Date(comparing) : comparing;
+  switch (unit) {
+    case 'years':
+      return dateFns.differenceInYears(value, parsedComparing);
+    case 'quarters':
+      return dateFns.differenceInQuarters(value, parsedComparing);
+    case 'months':
+      return dateFns.differenceInMonths(value, parsedComparing);
+    case 'weeks':
+      return dateFns.differenceInWeeks(value, parsedComparing);
+    case 'days':
+      return dateFns.differenceInDays(value, parsedComparing);
+    case 'hours':
+      return dateFns.differenceInHours(value, parsedComparing);
+    case 'minutes':
+      return dateFns.differenceInMinutes(value, parsedComparing);
+    case 'seconds':
+      return dateFns.differenceInSeconds(value, parsedComparing);
+    default: {
+      return dateFns.differenceInMilliseconds(value, parsedComparing);
+    }
+  }
+};
+
+const diff = getDiff(value, comparing, unit);

 // For Moment
-const diff = adapter.getDiff(value, comparing, unit);
+const diff = value.diff(comparing, unit);

移除 getFormatHelperText 方法

getFormatHelperText 方法已被移除。您可以改为使用 expandFormat

-const expandedFormat = adapter.getFormatHelperText(format);
+const expandedFormat = adapter.expandFormat(format);

如果您需要完全相同的输出。您可以应用以下转换

 // For Day.js
-const expandedFormat = adapter.getFormatHelperText(format);
+const expandedFormat = adapter.expandFormat(format).replace(/a/gi, '(a|p)m').toLocaleLowerCase();

 // For Luxon
-const expandedFormat = adapter.getFormatHelperText(format);
+const expandedFormat = adapter.expandFormat(format).replace(/(a)/g, '(a|p)m').toLocaleLowerCase();

 // For DateFns
-const expandedFormat = adapter.getFormatHelperText(format);
+const expandedFormat = adapter.expandFormat(format).replace(/(aaa|aa|a)/g, '(a|p)m').toLocaleLowerCase();

 // For Moment
-const expandedFormat = adapter.getFormatHelperText(format);
+const expandedFormat = adapter.expandFormat(format).replace(/a/gi, '(a|p)m').toLocaleLowerCase();

移除 getMeridiemText 方法

getMeridiemText 方法已被移除。您可以使用 setHoursdateformat 方法来重新创建其行为

-const meridiem = adapter.getMeridiemText('am');
+const getMeridiemText = (meridiem: 'am' | 'pm') => {
+  const date = adapter.setHours(adapter.date()!, meridiem === 'am' ? 2 : 14);
+  return utils.format(date, 'meridiem');
+};
+
+const meridiem = getMeridiemText('am');

移除 getMonthArray 方法

getMonthArray 方法已被移除。您可以使用 startOfYearaddMonths 方法来重新创建其行为

-const monthArray = adapter.getMonthArray(value);
+const getMonthArray = (year) => {
+  const firstMonth = utils.startOfYear(year);
+  const months = [firstMonth];
+
+  while (months.length < 12) {
+    const prevMonth = months[months.length - 1];
+    months.push(utils.addMonths(prevMonth, 1));
+  }
+
+  return months;
+}
+
+const monthArray = getMonthArray(value);

移除 getNextMonth 方法

getNextMonth 方法已被移除。您可以改为使用 addMonths 方法

-const nextMonth = adapter.getNextMonth(value);
+const nextMonth = adapter.addMonths(value, 1);

移除 getPreviousMonth 方法

getPreviousMonth 方法已被移除。您可以改为使用 addMonths 方法

-const previousMonth = adapter.getPreviousMonth(value);
+const previousMonth = adapter.addMonths(value, -1);

移除 getWeekdays 方法

getWeekdays 方法已被移除。您可以改为使用 startOfWeekaddDays 方法

-const weekDays = adapter.getWeekdays(value);
+const getWeekdays = (value) => {
+  const start = adapter.startOfWeek(value);
+  return [0, 1, 2, 3, 4, 5, 6].map((diff) => utils.addDays(start, diff));
+};
+
+const weekDays = getWeekdays(value);

移除 isNull 方法

isNull 方法已被移除。您可以使用非常基本的检查来替换它

-const isNull = adapter.isNull(value);
+const isNull = value === null;

移除 mergeDateAndTime 方法

mergeDateAndTime 方法已被移除。您可以使用 setHourssetMinutessetSeconds 方法来重新创建其行为

-const result = adapter.mergeDateAndTime(valueWithDate, valueWithTime);
+const mergeDateAndTime = <TDate>(
+   dateParam,
+   timeParam,
+ ) => {
+   let mergedDate = dateParam;
+   mergedDate = utils.setHours(mergedDate, utils.getHours(timeParam));
+   mergedDate = utils.setMinutes(mergedDate, utils.getMinutes(timeParam));
+   mergedDate = utils.setSeconds(mergedDate, utils.getSeconds(timeParam));
+
+   return mergedDate;
+ };
+
+const result = mergeDateAndTime(valueWithDate, valueWithTime);

移除 parseISO 方法

parseISO 方法已被移除。您可以直接使用您的日期库

 // For Day.js
-const value = adapter.parseISO(isoString);
+const value = dayjs(isoString);

 // For Luxon
-const value = adapter.parseISO(isoString);
+const value = DateTime.fromISO(isoString);

 // For DateFns
-const value = adapter.parseISO(isoString);
+const value = dateFns.parseISO(isoString);

 // For Moment
-const value = adapter.parseISO(isoString);
+const value = moment(isoString, true);

移除 toISO 方法

toISO 方法已被移除。您可以直接使用您的日期库

 // For Day.js
-const isoString = adapter.toISO(value);
+const isoString = value.toISOString();

 // For Luxon
-const isoString = adapter.toISO(value);
+const isoString = value.toUTC().toISO({ format: 'extended' });

 // For DateFns
-const isoString = adapter.toISO(value);
+const isoString = dateFns.formatISO(value, { format: 'extended' });

 // For Moment
-const isoString = adapter.toISO(value);
+const isoString = value.toISOString();

getYearRange 方法过去接受两个参数,现在接受一个元组,以便与 isWithinRange 方法保持一致

-adapter.getYearRange(start, end);
+adapter.getYearRange([start, end])

已修改的方法

显示重大变更

限制 date 方法的输入格式

date 方法现在具有 v6 dateWithTimezone 方法的行为。它不再接受 any 作为值,而只接受 string | null | undefined

-adapter.date(new Date());
+adapter.date();

-adapter.date(new Date('2022-04-17');
+adapter.date('2022-04-17');

-adapter.date(new Date(2022, 3, 17, 4, 5, 34));
+adapter.date('2022-04-17T04:05:34');

-adapter.date(new Date('Invalid Date'));
+adapter.getInvalidDate();

限制 isEqual 方法的输入格式

isEqual 方法过去接受任何类型的值作为其两个输入,并尝试解析它们,然后检查它们是否相等。该方法已简化,现在仅接受已解析的日期或 null(即:选择器中 value 属性使用的相同格式)

 const adapterDayjs = new AdapterDayjs();
 const adapterLuxon = new AdapterLuxon();
 const adapterDateFns = new AdapterDateFns();
 const adapterMoment = new AdapterMoment();

 // Supported formats
 const isEqual = adapterDayjs.isEqual(null, null); // Same for the other adapters
 const isEqual = adapterLuxon.isEqual(DateTime.now(), DateTime.fromISO('2022-04-17'));
 const isEqual = adapterMoment.isEqual(moment(), moment('2022-04-17'));
 const isEqual = adapterDateFns.isEqual(new Date(), new Date('2022-04-17'));

 // Non-supported formats (JS Date)
-const isEqual = adapterDayjs.isEqual(new Date(), new Date('2022-04-17'));
+const isEqual = adapterDayjs.isEqual(dayjs(), dayjs('2022-04-17'));

-const isEqual = adapterLuxon.isEqual(new Date(), new Date('2022-04-17'));
+const isEqual = adapterLuxon.isEqual(DateTime.now(), DateTime.fromISO('2022-04-17'));

-const isEqual = adapterMoment.isEqual(new Date(), new Date('2022-04-17'));
+const isEqual = adapterMoment.isEqual(moment(), moment('2022-04-17'));

 // Non-supported formats (string)
-const isEqual = adapterDayjs.isEqual('2022-04-16', '2022-04-17');
+const isEqual = adapterDayjs.isEqual(dayjs('2022-04-17'), dayjs('2022-04-17'));

-const isEqual = adapterLuxon.isEqual('2022-04-16', '2022-04-17');
+const isEqual = adapterLuxon.isEqual(DateTime.fromISO('2022-04-17'), DateTime.fromISO('2022-04-17'));

-const isEqual = adapterMoment.isEqual('2022-04-16', '2022-04-17');
+const isEqual = adapterMoment.isEqual(moment('2022-04-17'), moment('2022-04-17'));

-const isEqual = adapterDateFns.isEqual('2022-04-16', '2022-04-17');
+const isEqual = adapterDateFns.isEqual(new Date('2022-04-17'), new Date('2022-04-17'));

限制 isValid 方法的输入格式

isValid 方法过去接受任何类型的值,并尝试解析它们,然后检查其有效性。该方法已简化,现在仅接受已解析的日期或 null。这与组件 value 属性接受的类型相同。

 const adapterDayjs = new AdapterDayjs();
 const adapterLuxon = new AdapterLuxon();
 const adapterDateFns = new AdapterDateFns();
 const adapterMoment = new AdapterMoment();

 // Supported formats
 const isValid = adapterDayjs.isValid(null); // Same for the other adapters
 const isValid = adapterLuxon.isValid(DateTime.now());
 const isValid = adapterMoment.isValid(moment());
 const isValid = adapterDateFns.isValid(new Date());

 // Non-supported formats (JS Date)
-const isValid = adapterDayjs.isValid(new Date('2022-04-17'));
+const isValid = adapterDayjs.isValid(dayjs('2022-04-17'));

-const isValid = adapterLuxon.isValid(new Date('2022-04-17'));
+const isValid = adapterLuxon.isValid(DateTime.fromISO('2022-04-17'));

-const isValid = adapterMoment.isValid(new Date('2022-04-17'));
+const isValid = adapterMoment.isValid(moment('2022-04-17'));

 // Non-supported formats (string)
-const isValid = adapterDayjs.isValid('2022-04-17');
+const isValid = adapterDayjs.isValid(dayjs('2022-04-17'));

-const isValid = adapterLuxon.isValid('2022-04-17');
+const isValid = adapterLuxon.isValid(DateTime.fromISO('2022-04-17'));

-const isValid = adapterMoment.isValid('2022-04-17');
+const isValid = adapterMoment.isValid(moment('2022-04-17'));

-const isValid = adapterDateFns.isValid('2022-04-17');
+const isValid = adapterDateFns.isValid(new Date('2022-04-17'));

已移除的内部类型

以下内部类型被错误地导出,并已从公共 API 中移除

  • UseDateFieldDefaultizedProps
  • UseTimeFieldDefaultizedProps
  • UseDateTimeFieldDefaultizedProps
  • UseSingleInputDateRangeFieldComponentProps
  • UseSingleInputTimeRangeFieldComponentProps
  • UseSingleInputDateTimeRangeFieldComponentProps