useController
(props?: UseControllerProps) => { field: object, fieldState: object, formState: object }
此自定义 Hook 为 Controller
提供支持。此外,它与 Controller
共享相同的 props 和方法。它对于创建可重用的受控输入很有用。
Props
下表包含有关 useController
.
名称 | 类型 | 必需 | 描述 |
---|---|---|---|
name | FieldPath | ✓ | 输入的唯一名称。 |
control | Control | control 通过调用 useForm 提供的对象。在使用 FormProvider 时可选。 | |
defaultValue | unknown | 重要:不能应用
| |
rules | Object | 与 required、min、max、minLength、maxLength、pattern、validate
| |
shouldUnregister | boolean = false | 输入将在卸载后取消注册,默认值也将被移除。 注意:在与 | |
disabled | boolean = false |
|
返回
下表包含有关 useController
生成的属性的信息。
string
React.Ref
对象名称 | 名称 | 类型 | 描述 |
---|---|---|---|
field | onChange | (value: any) => void | 将输入的值发送到库的函数。 |
field | onBlur | () => void | 将输入的 onBlur 事件发送到库的函数。它应该被分配到输入的 |
field | value | unknown | 受控组件的当前值。 |
field | disabled | boolean | 输入的禁用状态。 |
field | name | ||
正在注册的输入名称。 | |||
field | ref | ||
用于将 Hook 表单连接到输入的 ref。分配 | |||
fieldState | invalid | boolean | 当前输入的无效状态。 |
fieldState | isTouched | boolean | 当前受控输入的已触碰状态。 |
fieldState | isDirty | boolean | 当前受控输入的脏状态。 |
fieldState | error | object | 此特定输入的错误。 |
formState | isDirty | boolean | 在用户修改任何输入后设置为
|
formState | dirtyFields | object | 包含用户修改的字段的对象。确保通过 useForm 提供所有输入的 defaultValues,以便库可以与
|
formState | touchedFields | object | 包含用户已交互的所有输入的对象。 |
formState | defaultValues | object | 在 useForm 的 defaultValues 或通过 reset API 更新的 defaultValues 中设置的值。 |
formState | isSubmitted | boolean | 在表单提交后设置为 true 。将保持 true 直到 reset 方法被调用。 |
formState | isSubmitSuccessful | boolean | 指示表单已成功提交,没有任何运行时错误。 |
formState | isSubmitting | boolean | 如果表单当前正在提交,则为 true 。 否则为 false 。 |
formState | isLoading | boolean | 如果表单当前正在加载异步默认值,则为 重要:此 prop 仅适用于异步
|
formState | submitCount | number | 表单提交的次数。 |
formState | isValid | boolean | 如果表单没有任何错误,则设置为 true 。
|
formState | isValidating | boolean | 在验证期间设置为 true 。 |
formState | validatingFields | boolean | 捕获正在进行异步验证的字段。 |
formState | errors | object | 包含字段错误的对象。还有一个 ErrorMessage 组件可以轻松检索错误消息。 |
示例
import { TextField } from "@material-ui/core";import { useController, useForm } from "react-hook-form";function Input({ control, name }) {const {field,fieldState: { invalid, isTouched, isDirty },formState: { touchedFields, dirtyFields }} = useController({name,control,rules: { required: true },});return (<TextFieldonChange={field.onChange} // send value to hook formonBlur={field.onBlur} // notify when input is touched/blurvalue={field.value} // input valuename={field.name} // send down the input nameinputRef={field.ref} // send input ref, so we can focus on input when error appear/>);}
技巧
在使用外部受控组件(如 MUI、AntD、Chakra UI)时,了解每个 prop 的职责很重要。它的工作是监视输入、报告和设置其值。
onChange:将数据发送回 Hook 表单
onBlur:报告输入已交互(聚焦和模糊)
value:设置输入的初始值和更新后的值
ref:允许输入聚焦错误
name:为输入提供一个唯一的名称
可以托管您的状态并与之结合
useController
.const { field } = useController();const [value, setValue] = useState(field.value);onChange={(event) => {field.onChange(parseInt(event.target.value)) // data send back to hook formsetValue(event.target.value) // UI state}}不要再次
register
输入。此自定义 Hook 旨在处理注册过程。const { field } = useController({ name: 'test' })<input {...field} /> // ✅<input {...field} {...register('test')} /> // ❌ double up the registration理想情况下,每个组件只使用一个
useController
。如果需要使用多个,请确保重命名 prop。可能需要考虑使用Controller
代替。const { field: input } = useController({ name: 'test' })const { field: checkbox } = useController({ name: 'test1' })<input {...input} /><input {...checkbox} />
感谢您的支持
如果您发现 React Hook Form 在您的项目中很有用,请考虑为它点赞和支持。