name: 用 React Hook Form 和 Zod 处理表单 description: 使用 React Hook Form 进行状态管理和 Zod 进行模式验证,在 React 中构建类型安全、经过验证的表单。
用 React Hook Form 和 Zod 处理表单
概览
表单处理是收集用户数据的 Web 应用程序的关键部分。React Hook Form 和 Zod 提供了构建 React 表单的强大组合:React Hook Form 减少了重新渲染并提高了性能,而 Zod 提供了运行时安全和类型安全的验证。
这项技能涵盖了使用 React Hook Form 和 Zod 创建具有高质量验证、错误处理、异步验证、动态字段和与 UI 库集成的表单。
为什么这很重要
- 提高转化率:易于使用的表单和清晰的验证可以提高 20-30% 的转化率
- 减少表单放弃:实时验证和清晰的错误消息减少了表单放弃
- 提高数据质量:良好的验证防止错误的数据输入,减少了数据清洗时间
- 降低支持成本:清晰、有效的错误消息减少了混乱和支持工单
- 提高用户满意度:工作良好且响应迅速的表单创造了良好的用户体验
核心概念
1. React Hook Form
高效的表单状态管理:
- 减少重新渲染:优化以最小化不必要的重新渲染
- 性能:即使在大型表单中也很快
- 最小代码:比受控输入的样板代码更少
- 集成:与所有 UI 库兼容(Material UI, MUI, Chakra UI)
2. Zod 验证
类型安全的模式验证:
- 运行时验证:在运行时验证数据
- TypeScript 推断:从模式自动生成 TypeScript 类型
- 可组合:从简单的模式构建复杂的验证
- 错误消息:可定制的、本地化的错误消息
3. 表单验证类型
不同的验证方法:
- 客户端:即时反馈,更好的用户体验
- 服务器端:最终验证,安全关键
- 异步验证:API 调用以检查唯一性
- 字段级:验证单个字段
- 表单级:一起验证多个字段
4. 错误处理
有效管理表单错误:
- 显示错误:在字段旁边或表单级别显示错误
- 错误消息:清晰、可操作的错误文本
- 验证状态:显示异步检查的验证进行中
- 表单级错误:在顶部显示全表单错误
快速开始
- 安装依赖项:安装 React Hook Form 和 Zod(
npm install react-hook-form zod @hookform/resolvers) - 定义 Zod 模式:使用类型创建验证模式
- 设置表单:用 Zod 解析器初始化 React Hook Form
- 创建表单字段:用受控输入构建表单
- 添加错误显示:适当显示验证错误
- 处理提交:处理表单提交和错误处理
- 测试验证:验证所有验证规则正确工作
- 集成 UI:将表单样式化以匹配设计系统
import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { z } from 'zod';
const schema = z.object({
name: z.string().min(2, '名字至少需要2个字符'),
email: z.string().email('无效的电子邮件地址'),
age: z.number().min(18, '必须年满18岁'),
});
type FormData = z.infer<typeof schema>;
function MyForm() {
const { register, handleSubmit, formState: { errors } } = useForm<FormData>({
resolver: zodResolver(schema),
});
const onSubmit = (data: FormData) => {
console.log(data);
};
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register('name')} placeholder="名字" />
{errors.name && <p>{errors.name.message}</p>}
<input {...register('email')} placeholder="电子邮件" />
{errors.email && <p>{errors.email.message}</p>}
<button type="submit">提交</button>
</form>
);
}
生产清单
- [ ] 定义了所有验证规则的 Zod 模式
- [ ] 从模式推断 TypeScript 类型
- [ ] 用解析器配置了 React Hook Form
- [ ] 错误消息清晰且本地化
- [ ] 正确注册了表单字段
- [ ] 提交处理包含错误状态
- [ ] 需要时实现了异步验证
- [ ] 动态字段处理正常工作
- [ ] 表单可访问(标签、ARIA、键盘导航)
- [ ] 提交期间的加载状态
- [ ] 显示成功/错误反馈
- [ ] 优化了表单性能
- [ ] 跨浏览器测试
- [ ] 移动响应
反模式
- 无验证:跳过验证会导致数据错误和用户挫败感
- 错误消息差:含糊的错误无助于用户解决问题
- 阻塞提交:未经验证的表单提交会导致服务器错误
- 忽视可访问性:不可访问的表单排除了残疾人士
- 过度验证:过于严格的验证不必要地挫败用户
- 无加载状态:用户不知道表单正在处理
- 无声失败:表单失败没有任何用户反馈
集成点
- React Hook Form: https://react-hook-form.com/
- Zod: https://zod.dev/
- UI 库:Material UI, Chakra UI, Mantine 用于表单组件
- 验证:API 检查的异步验证模式