今天我们要深入剖析一个在企业级项目中被广泛使用的表单神器——React Hook Form。 不止会用,我们还要搞懂它为什么快、怎么配合 TypeScript 保证类型安全,以及如何在业务表单中落地得漂漂亮亮。
想象一个 HR 系统的“简历提交”页面,字段多达 10+,有 select、有 textarea、有文件上传,还有“是否愿意 relocate”这样的条件验证……
你会发现:
useState?太冗余这种时候,RHF 就是我们梦寐以求的“表单自动驾驶系统”。
一句话概括:它是一个基于 React Hooks 的表单解决方案,专注于高性能、灵活验证、极简 API。
技术上来说,它通过非受控组件方式操作 DOM,避免了 React 的频繁重渲染,在 TypeScript 下更是如鱼得水,字段类型一目了然。
我们来构建一个业务常见的“用户反馈表单”,包含姓名、邮箱、反馈类型、留言说明、是否同意隐私政策👇
type FeedbackForm = {
name: string;
email: string;
type: 'bug' | 'feature' | 'other';
message: string;
agree: boolean;
};
const { register, handleSubmit, formState: { errors, isSubmitting } } = useForm<FeedbackForm>();
✨ useForm<FeedbackForm>() 用泛型自动绑定字段类型
✨ register 负责连接 input
✨ errors 存放验证错误(自动识别 key)
✨ isSubmitting 可用于 loading 控制按钮状态
我们来看看完整的 JSX:
<form onSubmit={handleSubmit(onSubmit)} noValidate>
<input type="text" placeholder="Your Name" {...register('name', { required: '姓名必填' })} />
{errors.name && <span>{errors.name.message}</span>}
<input type="email" placeholder="Email" {...register('email', {
required: '邮箱必填',
pattern: { value: /\S+@\S+\.\S+/, message: '邮箱格式错误' }
})} />
{errors.email && <span>{errors.email.message}</span>}
<select {...register('type', { required: '请选择反馈类型' })}>
<option value="">-- Select --</option>
<option value="bug">Bug</option>
<option value="feature">Feature Request</option>
<option value="other">Other</option>
</select>
{errors.type && <span>{errors.type.message}</span>}
<textarea {...register('message')} placeholder="Tell us more..." />
<label>
<input type="checkbox" {...register('agree', { required: '请同意隐私协议' })} />
我已阅读并同意隐私政策
</label>
{errors.agree && <span>{errors.agree.message}</span>}
<button disabled={isSubmitting}>提交</button>
</form>
const onSubmit = async (data: FeedbackForm) => {
setLoading(true);
await sendFeedback(data); // 提交 API
toast.success('提交成功!');
router.push(`/thanks?user=${data.name}`);
};
✅ handleSubmit(onSubmit) 会自动在数据通过验证后调用
✅ 无需你手动阻止表单默认事件
✅ data 是类型安全对象,字段名称、类型全自动补全
默认情况下,验证在提交时一次性触发。 但我们想要在输入过程就提示怎么办?配置 mode👇
useForm({
mode: 'onBlur', // 第一次验证:失焦触发
reValidateMode: 'onChange', // 后续验证:值变化触发
})
业务场景推荐配置:
场景 | 推荐验证模式 |
|---|---|
简单登录表单 | onSubmit |
动态注册/编辑表单 | onBlur + onChange |
用户体验敏感表单(如注册) | onChange |
❌ 常见错误写法:
<input name="email" /> // 没注册!RHF无法控制
✅ 推荐写法:
<input {...register('email')} />
🧠 字段必须通过 register() 注册,否则 RHF 接管不了。
✅ useForm 管理状态、验证、提交的核心入口
✅ register 让 input 成为 RHF 受控对象
✅ formState.errors 提供类型安全的错误提示
✅ handleSubmit 自动处理验证 + 提交逻辑
✅ 配置 mode 可实现实时验证体验优化
#React #React播客 #前端播客 #前端达人 #TypeScript