You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

迁移至@mui/x-date-pickers v7后,如何为DateTimeField添加endAdornment按钮?

问题:@mui/x-date-pickers v7中DateTimeField添加自定义endAdornment的TypeScript报错解决

将@mui/x-date-pickers从v6升级到v7后,DateTimeField组件因TypeScript报错无法正常工作。v6中可通过slotProps.textField.InputProps.endAdornment添加自定义按钮打开日历,但v7中该写法触发TypeScript错误。

原代码(v6可行,v7报错)

<DateTimeField
  className={classes.dateTimeField}
  value={value}
  onChange={handleDateTimeFieldChange}
  format={DATE_FORMAT}
  slotProps={{
    textField: {
      error: Boolean(errorMessage),
      InputProps: {
        endAdornment: (
          <IconButton
            className={classes.openCalendarButton}
            onClick={handleOpenCalendar}
            title="Open calendar"
            size="small"
          >
            <CalendarWithClockIcon />
          </IconButton>
        ),
      },
    },
  }}
/>

TypeScript错误信息

Type '{ className: string; value: Dayjs; onChange: (newDate: Dayjs) => void; format: string; slotProps: { textField: { error: boolean; InputProps: { endAdornment: Element; }; }; }; }' 
is not assignable to type 'Omit<Omit<FilledTextFieldProps | OutlinedTextFieldProps | StandardTextFieldProps, "select" | "type" | ... 7 more ... | "SelectProps">, keyof UseDateTimeFieldProps<...>>'.
  Types of property 'slotProps' are incompatible.
    Type '{ textField: { error: boolean; InputProps: { endAdornment: React.JSX.Element; }; }; }' 
    is not assignable to type '{ input?: SlotProps<ElementType<FilledInputProps, keyof IntrinsicElements>, {}, BaseTextFieldProps> | undefined; inputLabel?: SlotProps<...> | undefined; htmlInput?: SlotProps<...> | undefined; formHelperText?: SlotProps<...> | undefined; select?: SlotProps<...> | undefined; } | { ...; } | { ...; } | undefined'.ts(2322)

解决方法:调整slotProps结构

MUI X v7重构了日期选择器的slot层级,不再通过textField嵌套传递InputProps,而是直接将输入框相关配置放在slotProps.input中。同时,error属性需要直接提升到DateTimeField的顶层props中,而非嵌套在slotProps里。

修改后的代码:

<DateTimeField
  className={classes.dateTimeField}
  value={value}
  onChange={handleDateTimeFieldChange}
  format={DATE_FORMAT}
  error={Boolean(errorMessage)} // 直接传递error属性
  slotProps={{
    input: {
      endAdornment: (
        <IconButton
          className={classes.openCalendarButton}
          onClick={handleOpenCalendar}
          title="Open calendar"
          size="small"
        >
          <CalendarWithClockIcon />
        </IconButton>
      ),
    },
  }}
/>

关键变化说明

  • error属性:从slotProps.textField.error移到DateTimeField的顶层props,v7中日期选择器的错误状态由组件本身统一管理,无需通过textField子组件传递。
  • endAdornment:从slotProps.textField.InputProps.endAdornment移到slotProps.input.endAdornment,v7将输入框拆分为独立的input slot,直接配置其props即可。

内容的提问来源于stack exchange,提问作者Калдар Кайрат

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 20:45:08