React Hook Form 入门指南:基于 Hooks 的表单状态管理与验证(俄语文档版)
2026/9/19 12:38:33 网站建设 项目流程

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 的setCustomValidityreportValidity
  • 可借助表单构建器快速搭建表单

其中"体积小巧、零依赖"可以从 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: onSubmitreValidateMode: onChangeshouldFocusError: 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> ); }

要点拆解:

  1. useForm():初始化表单,返回registerhandleSubmiterrors等 API;
  2. ref={register}:将输入框注册到表单控制中,name属性是字段的唯一标识;
  3. register({ required: true }):注册的同时声明验证规则;
  4. handleSubmit(onSubmit):校验通过后调用onSubmit,参数为包含所有字段值的data对象;
  5. errors.lastname:当对应字段校验失败时,该对象存在错误信息,可用于条件渲染。

仓库中的 examples/V6/basic.tsx 提供了一个更完整的版本,包含firstNamelastNameemail三个字段,提交时通过alert(JSON.stringify(data))输出表单值;examples/V6/basicValidation.tsx 则演示了带requiredmaxLengthminLengthpattern规则的完整校验表单,覆盖文本输入、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还支持valueAsNumbervalueAsDatesetValueAs等取值转换选项,用于在取值阶段将字符串转换为目标类型。

验证规则如何被执行

验证逻辑的核心实现在 src/logic/validateField.ts,其关键行为包括:

  • required的"空值"判定:对于普通输入框,空字符串、nullundefined均视为缺失;对于checkbox,使用 getCheckboxValue 判断勾选状态;对于radio,使用 getRadioValue 判断是否有选中项;
  • min/max数值比较:优先读取 DOM 的valueAsNumber,否则对字符串做+inputValue数值转换后比较(见 validateField.ts);
  • 错误对象结构:每个字段错误形如{ type: 'required' | 'pattern' | ..., message, ref };在criteriaMode: 'all'下,通过 src/logic/appendErrors.ts 将多条规则错误合并进types字段;
  • 原生校验同步:当开启原生校验时,会调用setCustomValidityreportValidity将消息同步给浏览器(见 validateField.ts),这正是"遵循 HTML 标准、支持原生浏览器验证"的源码级体现。

校验时机与错误处理

useForm支持通过modereValidateMode控制校验触发时机。合法的模式值定义在 src/constants.ts 的VALIDATION_MODE中:

模式触发时机
onSubmit提交时(默认)
onChange字段值变化时
onBlur字段失焦时
onTouched字段首次被触碰后
all所有上述时机

默认配置为mode: 'onSubmit'reValidateMode: 'onChange',且出错后自动聚焦第一个错误字段(shouldFocusError: true),这些默认值定义在 src/logic/createFormControl.ts。

errors对象随表单状态实时更新,handleSubmit仅在全部校验通过后触发回调;若校验失败,可配合setErrorclearErrorstrigger等 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目录下按logicuseFormuseFieldArrayutils分类存放了覆盖完整的单元测试与组件测试,是理解各 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询