【问题标题】:mui autocomplete with react-hook-form: defaultValue in formDatamui 使用 react-hook-form 自动完成:formData 中的 defaultValue
【发布时间】:2022-01-25 14:49:04
【问题描述】:

我正在设置 Autocomplete 组件的 defaultValue 如下:

<Controller
  control={control}
  name={name}
  render={({field: {onChange, value}}) => (
    <Autocomplete
      freeSolo={freeSolo}
      options={options}
      renderInput={params => {
        return <TextField {...params} label={label} margin="normal" variant="outlined" onChange={onChange} />
      }}
      onChange={(event, values, reason) => onChange(values)}
      defaultValue={defaultValue}
    />
  )}
/>

根据默认值很好地显示该值。 但是,当我单击提交按钮时,如果我不使用自动完成组件,则自动完成字段的值始终未定义。 以下是我如何注册钩子和组件(简化代码)

const customerSchema = yup.object().shape({
  route: yup.string().nullable()
})
  
const {control, handleSubmit} = useForm({
    resolver: yupResolver(customerSchema)
  })

  const onSubmit = formData => {
    console.log(formData) // autocomplete is undefined if no action on the autocomplete 
  }

<form noValidate autoComplete="off" onSubmit={handleSubmit(onSubmit)}>
 <AutoCompleteInput
        control={control}
        name="route"
        label="route"
        options={customers_routes.map(option => option.route_name)}
        defaultValue={customer.route}
        freeSolo={false}
      />
  <Button type="submit">
        Update
      </Button>
  </form>

当我点击提交时,我应该怎么做才能让表单数据中的路由字段始终可用?

【问题讨论】:

    标签: reactjs material-ui next.js react-hook-form


    【解决方案1】:

    为什么不将defaultValues 选项与useForm 一起使用:

    const {control, handleSubmit} = useForm({
      resolver: yupResolver(customerSchema),
      defaultValues: { route: customer.route },
    });
    

    您可以使用value prop,而不是将defaultValue prop 发送到AutoComplete,如下所示:

    <Controller
      control={control}
      name={name}
      render={({ field: { onChange, value } }) => (
          <Autocomplete
            freeSolo={freeSolo}
            options={options}
            renderInput={(params) => {
              return (
                <TextField
                  {...params}
                  label={label}
                  margin="normal"
                  variant="outlined"
                  onChange={onChange}
                />
              );
            }}
            onChange={(event, values, reason) => onChange(values)}
            value={value}
          />
      )}
    />
    

    【讨论】:

    • 这很好用!谢谢。但是我对 TypeScript 有一些问题,我不确定如何解决: TS2322: Type 'Control' 不可分配给类型 'Control'。 '_options.resolver' 的类型在这些类型之间不兼容。类型'解析器' 不可分配给类型 'Resolver'。
    • 不客气,也许codesandbox.io/s/… 可以帮助解决 TypeScript 问题。
    猜你喜欢
    • 2021-03-20
    • 2021-10-24
    • 2020-09-26
    • 2020-09-24
    • 1970-01-01
    • 2021-10-08
    • 2022-12-02
    • 2020-11-23
    • 2022-07-24
    相关资源
    最近更新 更多