React Hook Form 嵌套表单Controller的name不生效如何解决
问题根因定位
- 字段路径完全错配
你定义的FormInputs数据结构中,仅声明了顶级字段config,但Controller绑定的字段路径是daoConfig.test。两者从数据树的根节点开始就不匹配,RHF内部维护的受控字段映射表中,压根不存在daoConfig.test这个注册路径,自然没办法把对应的值同步到绑定的输入组件上。 - 对取值接口的认知偏差
你打印getValues('config')和getValues('config.test')能拿到正确值,是因为RHF的取值方法本身支持任意嵌套路径的对象属性解析——只要内存中存的config对象上有test属性,不管这个路径有没有被注册为受控字段,都能从存储对象里把值读出来。但这不代表这个路径已经和绑定的组件建立了双向同步关系,能自动把值渲染到输入框。 - 字段赋值时机偏差
你在组件渲染流程中直接同步调用setValue('config', config),如果这行代码的执行时机早于Controller组件挂载完成,会出现RHF还没完成字段注册的情况,后续即使数据写入了存储对象,也没法同步给已经挂载的受控组件。
排查解决步骤
- 对齐所有字段路径和类型定义
把Controller的绑定路径和实际存储的数据路径统一,替换原来错误的daoConfig.test为实际存在的config.test,同时补全类型声明中的嵌套结构:
对应Controller配置修改为:interface Config { test: string // 按业务实际字段类型补充即可 } interface FormInputs { config: Config; }<Controller name="config.test" control={control} defaultValue={''} // 其余原有渲染逻辑保持不变 /> - 调整setValue的调用时机
不要在组件同步渲染流程里直接执行赋值操作,把初始化赋值的逻辑迁移到useEffect钩子中,确保所有Controller组件挂载、完成字段注册后再执行值写入:// 移除渲染流中直接写的setValue('config', config) useEffect(() => { setValue('config', config) }, [config, setValue]) - 给渲染逻辑加边界兜底
现有render逻辑中直接使用value.toString(),如果遇到值为undefined的情况,会直接触发类型错误,中断输入框的渲染流程。可以补充空值兜底逻辑,避免渲染异常:value={value?.toString() ?? ''}
快速验证技巧:修改完路径后,可以在Controller的render函数入口处打印value值,如果打印结果和你用
getValues('config.test')拿到的值一致,就说明字段同步链路已经打通;如果打印为空,说明还是存在路径不匹配、字段未注册的问题,可以逐一核对name字段的拼写和层级。
内容的提问来源于stack exchange,提问作者Nika Kurashvili
相关产品推荐
相关产品推荐

