React Hook Form 入门指南:基于 Hooks 的表单状态管理与验证(俄语文档版)
【免费下载链接】react-hook-form📋 React Hooks for form state management and validation (Web + React Native)项目地址: https://gitcode.com/gh_mirrors/re/react-hook-form
本指南以仓库 docs/README.ru-RU.md 为主体展开。它是 react-hook-form 的俄语介绍文档,对应 V6 时代的 API 形态(
ref={register}与顶层errors解构)。文章将完整继承该文档的核心内容,并结合仓库源码与示例目录,深入讲解安装、快速开始、字段注册、验证规则与底层实现,帮助你在一篇文章内掌握这套"高性能、可扩展、易用的表单验证方案"。
文档定位与版本说明
docs/README.ru-RU.md是 react-hook-form 官方文档的俄语版本,与仓库根目录 README.md(当前 V7 语法)不同,它演示的是V6 时代的用法:通过ref={register}注册输入框,直接从useForm()返回值中解构出errors对象。仓库同时保留了 V6 的完整说明文档 docs/README.V6.md,两者 API 形态一致,可以互为参照。
文中所有代码示例均可在 examples/V6 目录下找到对应实现,例如 examples/V6/basic.tsx 与 examples/V6/basicValidation.tsx。
核心特性
原文档将 react-hook-form 的核心卖点概括为以下几点:
- 以性能与开发体验(DX)为目标:采用非受控(uncontrolled)表单校验方式,减少不必要的组件重渲染;
- 受控表单性能更优:即使配合受控组件使用,也能通过内部订阅机制控制渲染范围;
- 体积小巧、零依赖:整个库在打包后仅数 KB,且不依赖任何第三方运行时库;
- 遵循 HTML 标准做验证:底层复用浏览器原生的表单校验语义;
- 兼容 React Native:同一套 Hooks API 可用于 Web 与移动端;
- 支持 Yup、Joi、Superstruct 及自定义校验实现:通过 resolver 机制接入 Schema 校验库;
- 支持原生浏览器校验:可将校验结果同步到 DOM 的
setCustomValidity与reportValidity; - 可借助表单构建器快速搭建表单。
其中"体积小巧、零依赖"可以从 package.json 中直接验证:dependencies为空,库本身不引入任何外部包。"遵循 HTML 标准做验证"这一点在源码中有充分体现,见下文"验证规则的实现原理"。
安装
在项目中使用以下命令安装:
npm install react-hook-form安装完成后即可在组件中引入:
import { useForm } from 'react-hook-form';useForm是库的核心 Hook,其类型定义与默认行为位于 src/useForm.ts。从源码结构看,它通过createFormControl(实现在 src/logic/createFormControl.ts)构建表单控制对象,内部默认配置为mode: onSubmit、reValidateMode: onChange、shouldFocusError: true(见 createFormControl.ts)。
快速开始
原文档给出了一个可直接运行的入门示例,这里完整继承并补充注释:
import React from 'react'; import { useForm } from 'react-hook-form'; function App() { const { register, handleSubmit, errors } = useForm(); // 初始化 Hook const onSubmit = (data) => { console.log(data); }; return ( <form onSubmit={handleSubmit(onSubmit)}> <input name="firstname" ref={register} /> {/* 注册输入框 */} <input name="lastname" ref={register({ required: true })} /> {errors.lastname && 'Last name is required.'} <input name="age" ref={register({ pattern: /\d+/ })} /> {errors.age && 'Please enter number for age.'} <input type="submit" /> </form> ); }要点拆解:
useForm():初始化表单,返回register、handleSubmit、errors等 API;ref={register}:将输入框注册到表单控制中,name属性是字段的唯一标识;register({ required: true }):注册的同时声明验证规则;handleSubmit(onSubmit):校验通过后调用onSubmit,参数为包含所有字段值的data对象;errors.lastname:当对应字段校验失败时,该对象存在错误信息,可用于条件渲染。
仓库中的 examples/V6/basic.tsx 提供了一个更完整的版本,包含firstName、lastName、email三个字段,提交时通过alert(JSON.stringify(data))输出表单值;examples/V6/basicValidation.tsx 则演示了带required、maxLength、minLength、pattern规则的完整校验表单,覆盖文本输入、select下拉框、radio单选等常见控件。
注册字段与验证规则
可用的验证规则
在 V6 API 中,所有验证规则都通过register({ ... })的参数对象声明。规则类型定义在 src/constants.ts 的INPUT_VALIDATION_RULES中,包括:
| 规则 | 说明 | 示例 |
|---|---|---|
required | 必填校验,可传true或错误消息字符串 | register({ required: true })/register({ required: '此项必填' }) |
min/max | 数值最小/最大值 | register({ min: 18, max: 60 }) |
minLength/maxLength | 字符串最小/最大长度 | register({ minLength: 8, maxLength: 11 }) |
pattern | 正则表达式匹配 | register({ pattern: /\d+/ }) |
validate | 自定义验证函数或对象 | register({ validate: v => v === 'ok' \|\| '不合法' }) |
此外,register还支持valueAsNumber、valueAsDate、setValueAs等取值转换选项,用于在取值阶段将字符串转换为目标类型。
验证规则如何被执行
验证逻辑的核心实现在 src/logic/validateField.ts,其关键行为包括:
required的"空值"判定:对于普通输入框,空字符串、null、undefined均视为缺失;对于checkbox,使用 getCheckboxValue 判断勾选状态;对于radio,使用 getRadioValue 判断是否有选中项;min/max数值比较:优先读取 DOM 的valueAsNumber,否则对字符串做+inputValue数值转换后比较(见 validateField.ts);- 错误对象结构:每个字段错误形如
{ type: 'required' | 'pattern' | ..., message, ref };在criteriaMode: 'all'下,通过 src/logic/appendErrors.ts 将多条规则错误合并进types字段; - 原生校验同步:当开启原生校验时,会调用
setCustomValidity与reportValidity将消息同步给浏览器(见 validateField.ts),这正是"遵循 HTML 标准、支持原生浏览器验证"的源码级体现。
校验时机与错误处理
useForm支持通过mode与reValidateMode控制校验触发时机。合法的模式值定义在 src/constants.ts 的VALIDATION_MODE中:
| 模式 | 触发时机 |
|---|---|
onSubmit | 提交时(默认) |
onChange | 字段值变化时 |
onBlur | 字段失焦时 |
onTouched | 字段首次被触碰后 |
all | 所有上述时机 |
默认配置为mode: 'onSubmit'、reValidateMode: 'onChange',且出错后自动聚焦第一个错误字段(shouldFocusError: true),这些默认值定义在 src/logic/createFormControl.ts。
errors对象随表单状态实时更新,handleSubmit仅在全部校验通过后触发回调;若校验失败,可配合setError、clearErrors、trigger等 API 手动控制错误状态,仓库测试中 src/tests/useForm/setError.test.tsx 与 src/tests/useForm/trigger.test.tsx 覆盖了这些交互。
生态集成与适用场景
- Schema 校验库:文档提到支持 Yup、Joi、Superstruct 以及自定义校验实现。仓库根 README.md 补充说明了当前版本还支持 Zod、AJV 等更多方案,它们统一通过 resolver 接口接入,测试用例见 src/tests/useForm/resolver.test.tsx;
- React Native:核心逻辑不依赖浏览器 DOM(仅在 Web 环境使用
isWeb判断,见 src/utils/isWeb.ts),因此同一套 Hooks 可用于 React Native 表单; - 受控组件:对于 UI 库组件(如 Ant Design、Material UI 等),V6 提供
Controller组件桥接(见 src/controller.tsx),可在保持非受控核心的同时接入受控组件,仓库测试 src/tests/controller.test.tsx 对其进行了完整验证。
深入学习路径
原文档还列出了学习资源,由于本仓库只读,建议按以下顺序在仓库内继续深入:
- 多语言文档:README.V6.md(英文 V6)、README.zh-CN.md(简中)、README.ja-JP.md(日文)、README.zh-TW.md(繁中)、README.fr-FR.md、README.de-DE.md、README.pt-BR.md、README.es-ES.md、README.tr-TR.md、README.ko-KR.md;
- V6 可运行示例:examples/V6,涵盖异步校验、条件字段、动态字段数组、表单重置、Schema 校验等 30 余个场景;
- 核心源码:src/logic/createFormControl.ts(表单控制中枢)、src/logic/validateField.ts(字段验证)、src/utils(工具函数集合);
- 测试用例:src/tests目录下按
logic、useForm、useFieldArray、utils分类存放了覆盖完整的单元测试与组件测试,是理解各 API 行为的最佳参考; - 贡献指南见 CONTRIBUTING.md。
小结
围绕docs/README.ru-RU.md,本文完整梳理了 react-hook-form 的特性、安装方式与 V6 快速开始示例,并从源码层面印证了验证规则、校验时机、原生校验同步等关键机制。如果你正为 React(Web 或 React Native)项目选择表单方案,可以在此基础上直接参考 examples/V6 中的示例代码落地实践,也可对照 docs/README.V6.md 获取英文原版的完整说明。
【免费下载链接】react-hook-form📋 React Hooks for form state management and validation (Web + React Native)项目地址: https://gitcode.com/gh_mirrors/re/react-hook-form
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考