【问题标题】:How to manually re-render component using react-hook-form when validation errors are updated更新验证错误时如何使用 react-hook-form 手动重新渲染组件
【发布时间】:2021-10-21 05:10:10
【问题描述】:

面临挑战使用 React-Hook-Forms 使验证类自动反映在自定义日期选择器 Flatpickr 上,

const { register, handleSubmit, errors, control } = useForm({
  mode: 'onChange'
})

<FormGroup>
  <Controller
    name="dateControl"
    control={control}
    defaultValue={null}
    rules={{ required: true }}
    render={({ value, onChange }) => (
      <Flatpickr
        value={value}
        onChange={onChange}
        id="hf-picker"
        options={{
          altInput: true,
          altFormat: 'F j, Y',
          dateFormat: 'Y-m-d',
          altInputClass: classnames(
            'form-control flatpickr-input',
            {
              'is-invalid': errors.dateControl && true
            }
          )
        }}
      />
    )}
  />
</FormGroup>

在排除故障后,我意识到一切正常,除了当 react-hooks-form 更新验证错误时组件无法重新渲染,无论如何我可以强制手动重新渲染,谢谢

【问题讨论】:

    标签: css reactjs forms react-hook-form flatpickr


    【解决方案1】:

    我认为这与 RHF 无关,但不知何故,&lt;Flatpickr /&gt; 组件的 options 属性在配置更改时不会更新。

    我假设您使用 react-flatpickr 包 - 您可以简单地将 key 属性传递给该组件并将其设置为该控件的错误对象。每次该表单控件的错误发生变化时,这都会强制重新渲染。

    const isNotEmpty = (array) => array?.length > 0 || "Required";
    
    <Controller
      name="dateControl"
      control={control}
      defaultValue={null}
      rules={{ validate: isNotEmpty }}
      render={({ value, onChange }) => (
        <>
          <Flatpickr
            key={errors.dateControl}
            value={value}
            onChange={onChange}
            id="hf-picker"
            options={{
              altInput: true,
              altFormat: "F j, Y",
              dateFormat: "Y-m-d",
              altInputClass: classnames("form-control flatpickr-input", {
                "is-invalid": !!errors.dateControl
              })
            }}
          />
          {errors.dateControl && <p>{errors.dateControl.message}</p>}
        </>
      )}
    />
    

    【讨论】:

    • 感谢@knoefel,回答已接受,但您知道为什么它仅适用于首页加载,例如1-数据为空时,显示验证错误 2-提供数据时,隐藏验证错误 3-但数据清空时,不显示验证,但仍继续以空值提交
    • 发生这种情况是因为您将 defaultValue 属性设置为 null 但在选择日期并随后将其删除后,&lt;Flatpickr /&gt; 会将值设置为空数组。我对flatpickr 不太熟悉,但您可以使用RHF 的validate 函数并检查该值是否不是空数组而不是required 验证。我更新了我的答案和 CodeSandbox。
    猜你喜欢
    • 1970-01-01
    • 2022-06-22
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    相关资源
    最近更新 更多