跳到內容
+

從 v6 遷移到 v7

本指南描述了將 Date and Time Pickers 從 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,套件的 peer dependency 版本已更新為 ^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",

執行 codemods

preset-safe codemod 將自動調整您的大部分程式碼,以處理 v7 中的重大變更。您可以執行 v7.0.0/pickers/preset-safe,僅針對 Date and Time Pickers,或執行 v7.0.0/preset-safe,以同時針對其他 MUI X 元件,例如 Data Grid。

您可以選擇 <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>

由這個 codemod 處理的重大變更在螢幕右側的目錄中以 ✅ 表情符號表示。

如果您已應用 v7.0.0/pickers/preset-safe(或 v7.0.0/preset-safe)codemod,則您應該不需要對這些項目採取任何進一步的措施。

所有其他變更都必須手動處理。

重大變更

由於 v7 是一個主要版本,因此它包含一些影響公共 API 的變更。這些變更是為了保持一致性、提高穩定性並為新功能騰出空間而進行的。

捨棄舊版 bundle

所有 MUI X 套件都已移除對 IE 11 的支援。不再包含用於支援 IE 11 等舊瀏覽器的 legacy bundle。

捨棄 Webpack 4 支援

捨棄舊瀏覽器支援也表示我們不再轉換現代瀏覽器原生支援的某些功能 – 例如 Nullish CoalescingOptional Chaining

Webpack 4 不支援這些功能,因此如果您正在使用 Webpack 4,則需要自行轉換這些功能或升級到 Webpack 5。

以下是如何在 Webpack 4 上使用 @babel/preset-env preset 轉換這些功能的範例

 // 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'),
+            ],
+          },
+        ],
       },
     ],
   },
 });

元件 slots

components 重新命名為 slots

componentscomponentsProps props 分別重新命名為 slotsslotProps props。這是 MUI 維護的所有不同程式庫之間緩慢且持續的努力。為了順利過渡,它們在 v6 期間已被棄用。並從 v7 中移除。

如果尚未完成,此修改可以由 codemod 處理

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

查看 RFC 以取得更多資訊。

✅ 重新命名 slots 類型

slot 介面已重新命名,以符合 @mui/base 命名慣例。後綴 SlotsComponentSlots 取代,而 SlotsComponentsPropsSlotProps 取代。如果您不依賴 codemod,請考慮查看 此檔案 中的所有重新命名類型。以下是 DateCalendar 類型的範例。

-DateCalendarSlotsComponent
+DateCalendarSlots
-DateCalendarSlotsComponentsProps
+DateCalendarSlotProps

將新參數新增至 shortcuts slot onChange 回調

選擇 shortcut 時觸發的 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 slot 的匯入

calendarHeader slot 相關的匯入已從 @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';

已移除的 props

shouldDisableClock 替換為 shouldDisableTime

已棄用的 shouldDisableClock prop 已被移除,取而代之的是更靈活的 shouldDisableTime prop。shouldDisableClock prop 接收 value 作為小時、分鐘或秒的 number。相反,shouldDisableTime prop 接收日期物件(基於使用的 adapter)。您可以在 v6 遷移指南 中閱讀有關此 prop 棄用的更多資訊。

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

✅ 將 defaultCalendarMonth 替換為 referenceDate

已棄用的 defaultCalendarMonth prop 已被移除,取而代之的是更靈活的 referenceDate prop。

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

已修改的 props

移除 dayOfWeekFormatter prop 的字串引數

dayOfWeekFormatter prop 的字串引數已被日期物件取代,以允許更大的靈活性。

 <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')}.`}
 />

所有日期相關的 props 現在都經過嚴格類型檢查,僅接受您的 adapter 支援的日期格式(date-fnsDate 物件、days-jsdaysjs.Dayjs 物件等)。

Field 元件

更新 selectedSections 的格式

selectedSections prop 不再接受開始和結束索引。當選擇幾個 — 但不是全部 — 區段時,field 元件的行為不正確,您現在只能選擇一個或所有區段

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

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

替換區段 hasLeadingZeros 屬性

屬性 hasLeadingZeros 已從區段中移除,取而代之的是更精確的 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} />;

Headless fields

inputRef 移至傳遞給 hook 的 props 內部

field hooks 現在只接收 props,而不是包含 props 和 inputRef 的物件。

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

如果您正在使用多個輸入範圍 field 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 元素)一起使用時,field hooks 會傳回需要傳遞到 <input /> 元素的 ref。此 ref 之前名為 ref,為了更清晰起見,已重新命名為 inputRef

  const fieldResponse = useDateField(props);

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

如果您正在使用多個輸入範圍 field 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 參數。

您現在應該能夠直接將 field 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 prop 轉發到 DOM

headless field hooks(例如:useDateField)現在傳回一個名為 enableAccessibleFieldDOMStructure 的新 prop。這用於了解目前的 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 與其他 adapters 的行為保持一致。

如果您希望即使您的 locale 另有說明,也將每週的第一天保持在星期一。您可以按如下方式硬編碼週設定

import { Settings, Info } from 'luxon';

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

移除 monthAndYear 格式

已移除 monthAndYear 格式。它用於日曆視圖的標頭中。您可以將其替換為 calendarHeader slot 的新 format prop

 <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 一起使用

將 UTC 與 Day.js adapter 一起使用

LocalizationProviderdateLibInstance prop 不再適用於 AdapterDayjs。在元件中實作適當的時區支援之前,此 prop 用於將 pickers 設定為 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 建構函式。這允許使用者在 adapter 使用此 plugin 之前將自訂選項傳遞給它。

如果您在第一個 LocalizationProvider 元件的渲染之前使用此 plugin,並且未在您自己的程式碼庫中呼叫 dayjs.extend,則您需要手動擴展 dayjs

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

dayjs.extend(customParseFormatPlugin);

其他 plugins 仍然在 adapter 初始化之前新增。

移除根層級 locales 匯出

locales 匯出已從套件的根目錄中移除。為了減小 bundle 大小,locales 現在僅可從 @mui/x-date-pickers/locales@mui/x-date-pickers-pro/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 的實作,以了解如何自行組合渲染器。

Adapters 內部變更

已移除的方法

顯示重大變更

移除 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(即:pickers 中 value prop 使用的相同格式)

 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 prop 接受的類型相同。

 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