MUI - 单击 TextField 中的任意位置时打开日期选择器

MUI - Open datepicker when clicking anywhere in the TextField

我有一个日期选择器,我想在用户单击字段中的任意位置而不仅仅是日历图标时显示它。

这是选择器

export function DatePickerField(props) {
  ......

  return (
      <Grid container>
          <MuiPickersUtilsProvider utils={DateFnsUtils}>
              <KeyboardDatePicker
                  {...field}
                  {...props}
                  disableToolbar
                  inputVariant="outlined"
                  value={selectedDate}
                  onChange={_onChange}
                  error={isError}
                  autoOk
                  invalidDateMessage={isError && error}
                  helperText={isError && error}
              />
          </MuiPickersUtilsProvider>
      </Grid>
  );
}

我需要这样做,因为如果手动输入日期,它不会抛出任何错误,但我在表单数据中得到 invalid date

单击字段时如何显示选择器?

MUI v5 添加了 DatePicker component in the @mui/lab package. If you want a picker to be opened after when the user clicked inside the TextField, use MobileDatePicker, this doesn't have the calendar icon though, see 答案,如果你想要的话。

<MobileDatePicker
  {...}
  renderInput={(params) => <TextField {...params} />}
/>

但是 DesktopDatePicker 确实有日历图标,但是您必须编写额外的代码来控制 open 状态并告诉选择器在单击 TextField 时打开:

<DatePicker
  open={open}
  onOpen={() => setOpen(true)}
  onClose={() => setOpen(false)}
  renderInput={(params) => {
    return (
      <TextField
        {...params}
        onClick={(e) => setOpen(true)}
      />
    );
  }}
/>


原答案

您可以控制 KeyboardDatePickeropen 状态并在 TextField 被点击时将其设置为 true:

const [open, setOpen] = useState(false);

return (
  <KeyboardDatePicker
    open={open}
    onOpen={() => setOpen(true)}
    onClose={() => setOpen(false)}
    TextFieldComponent={(props) => (
      <TextField {...props} onClick={(e) => setOpen(true)} />
    )}
    {...other}
  />
);

现场演示