如何使用 react-hook-form 为 KeyboardDatePicker 设置条件默认值?

How to set a conditional default value for a KeyboardDatePicker with react-hook-form?

我有一个包含来自 material UIKeyboardDatePicker 的表单,我希望它有一个空字符串值 ("") 作为默认值,当没有值传递给useForm 此字段的挂钩。

到目前为止,这是我的实现:

日期选择器输入字段:

                <MuiPickersUtilsProvider utils={DateFnsUtils}>
                    <Controller
                        name="date"
                        control={control}
                        rules={{ required: true }}
                        defaultValue={getValues().date || ""}
                        as={
                            <KeyboardDatePicker
                                autoOk
                                inputVariant="outlined"
                                format="yyyy-MM-dd"
                                margin="normal"
                                id="date-picker-inline"
                                label="Date"
                                placeholder="yyyy-mm-dd"
                                required
                                error={!!errors.date}
                                helperText={errors.date && "Incorrect entry."}
                                onChange={() => {}}
                                value={() => {}}
                                KeyboardButtonProps={{
                                    "aria-label": "change date",
                                }}
                            />
                        }
                    />
                </MuiPickersUtilsProvider>

这是我的表单钩子:

const { handleSubmit, getValues, control, register, errors, setValue } = useForm<Project>({
    submitFocusError: false,
    mode: "onBlur",
    defaultValues: project,
});

我正在使用 project 设置我的表单的默认值,但 project 可以是 null or undefineddate 属性 [=16] =]也可以是null。如果是这种情况,我希望默认值为空字符串。

遗憾的是,通过这个实现,当我 select 一个空字段的日期变成 Date 时,我收到一条警告,告诉我我不应该将文本类型的不受控制的输入更改为控制一个和输入堆栈的 label 上面的值 :

是否可以在不破坏所有内容的情况下将空字符串作为 DatePicker 的默认值?如果可能应该如何实施?

为了使日期选择器的值为空,您需要将 null 作为默认值传递。此 codesandbox 确认了此行为 https://codesandbox.io/s/relaxed-poitras-5eohr?file=/src/App.jsx

您的问题是这 2 个值的使用不正确

  onChange={() => {}}
  value={() => {}}

这些值应该完全接受 value 的表单输入和无事件更改此值的回调。

刚才我遇到了类似的情况,通过在我的 Controller.

上最初将 defaultValueinitialFocusedDate 设置为 null 来解决它
  const [helperText, isError] = useHelperText(name, errors);
  const defaultValue = useDefaultValue(getValues, name, watch);

  return (
    <Controller
      name={name}
      rules={isRequired}
      control={control}

      // here the magic happens
      initialFocusedDate={null} 
      defaultValue={null} 

      as={
        <KeyboardDatePicker
          disableFuture
          {...rest}
          name={name}
          error={isError}
          helperText={helperText}
          required={Boolean(isRequired?.required)}
          disableToolbar
          variant="inline"
          inputVariant={rest.variant}
          format="dd.MM.yyyy"
          id={name}
          label={label}
          invalidDateMessage=""
          KeyboardButtonProps={{
            "aria-label": "change date",
          }}
        />
      }
    />
  );

这样,如果 useForm 中不存在 defaultValues,该组件将显示一个空的 MUI 输入。