React+Hook+Form 中 register 、 control、 Controller 分别用来做什么?

278 阅读2分钟

在 React Hook Form (RHF) 中,registercontrolController 是用于管理表单状态和验证的重要工具。它们各自的作用如下:

1. register

  • 作用: register 用于将表单输入元素(如 <input><select>)注册到 React Hook Form 的内部管理系统中。它会将输入元素的值和验证规则绑定到表单状态中。

  • 用法:

    const { register, handleSubmit } = useForm();
    
    return (
      <form onSubmit={handleSubmit(onSubmit)}>
        <input {...register('firstName', { required: true })} />
        <button type="submit">Submit</button>
      </form>
    );
    
  • 说明: register 返回一个包含多个属性的对象,这些属性需要传递给输入元素。这些属性包括 namerefonChangeonBlur 等,确保 React Hook Form 可以跟踪和管理输入的值及其状态。

2. control

  • 作用: control 是一个对象,包含了管理表单状态的核心功能,通常用于与 Controller 组件配合使用。它提供了表单的控制和管理接口,尤其是在处理复杂组件或需要自定义表单控件时非常有用。

  • 用法:

    const { control, handleSubmit } = useForm();
    
    return (
      <form onSubmit={handleSubmit(onSubmit)}>
        <Controller
          name="firstName"
          control={control}
          render={({ field }) => <input {...field} />}
        />
        <button type="submit">Submit</button>
      </form>
    );
    
  • 说明: control 主要用于处理受控组件(如 Material-UI 的 TextField),它允许通过 Controller 组件将表单的状态和行为与输入控件连接起来。

3. Controller

  • 作用: Controller 是一个组件,用于包装和管理受控组件,提供了更强的控制能力。它允许你将表单状态、验证和其他功能与自定义或第三方 UI 组件(如 Material-UI 的 TextField)进行集成。

  • 用法:

    const { control, handleSubmit } = useForm();
    
    return (
      <form onSubmit={handleSubmit(onSubmit)}>
        <Controller
          name="firstName"
          control={control}
          rules={{ required: 'First Name is required' }}
          render={({ field, fieldState }) => (
            <>
              <input {...field} />
              {fieldState.error && <p>{fieldState.error.message}</p>}
            </>
          )}
        />
        <button type="submit">Submit</button>
      </form>
    );
    
  • 说明: Controller 组件的 render 方法提供了一个 field 对象,该对象包含了绑定到表单控制的输入字段的属性(如 valueonChangeonBlur 等)。Controller 还允许指定验证规则,并将错误信息传递给组件。

总结

  • register: 直接将输入元素注册到表单中,适用于简单的表单元素。
  • control: 提供表单控制功能,通常与 Controller 组件配合使用。
  • Controller: 用于将复杂或第三方 UI 组件与 React Hook Form 的表单管理功能连接起来。

选择使用 register 还是 Controller 主要取决于你的表单组件的复杂性和需求。对于简单的表单元素,register 足够使用;对于更复杂的组件或需要更精细的控制,Controller 是一个更合适的选择。