React Hook Form 中如何动态设置默认值?
我用 React Hook Form 做一个编辑表单,想根据接口返回的数据动态设置默认值,但 useForm 的 defaultValues 似乎只在初始化时生效一次,后续数据变了也不更新。试过用 reset(),但总感觉哪里不对。
比如下面这样写,user 初始是 null,等异步加载完后 setDefaultValues 没反应:
const { control, reset } = useForm({
defaultValues: {
name: user?.name || '',
email: user?.email || ''
}
});
useEffect(() => {
if (user) {
reset({ name: user.name, email: user.email });
}
}, [user]);
你的代码思路是对的,但可能漏了一个关键点。标准写法应该是这样:
重点有两个:
1. 不要在useForm里初始化defaultValues,空着就行
2. useEffect的依赖数组必须包含reset,不然闭包问题会导致reset不更新
另外如果你需要保留部分表单值只更新某些字段,可以用reset的第二个参数:
reset({ name: user.name }, { keepDefaultValues: true })这个坑我去年也踩过,后来在React Hook Form的issue区找到解决方案。他们文档里reset的说明确实不太显眼。
如果你非要渲染表单然后用 reset,记得把 reset 放进依赖数组里,不然会有闭包坑: