React-Admin v5中点击按钮更新ReferenceArrayInput值不生效的问题
嗨,我之前也碰到过类似的情况,咱们一步步来排查解决:
首先先确认最基础的匹配细节:你要保证ReferenceArrayInput的source属性确实是content,和你setValue里指定的字段名完全一致,这个小疏忽很容易导致值更新不生效。
接下来检查你的按钮是否在正确的表单上下文里——必须确保按钮是放在Edit/Create组件内部的SimpleForm(或其他Form类组件)之中,这样useFormContext才能拿到正确的表单实例,不然setValue根本找不到对应的目标字段。
如果上面两点都没问题,试试下面的几种针对性解决方案:
方案一:用reset代替setValue更新数组字段
有时候直接用setValue更新数组类型的字段,react-hook-form和react-admin的联动可能存在延迟,换成reset会更彻底地同步表单值:
const handleClick = () => { // 先获取当前所有表单值,避免覆盖其他字段 const currentValues = getValues(); reset({ ...currentValues, content: newIds }, { shouldDirty: true }); };
方案二:强制ReferenceArrayInput重新渲染
如果表单值已经更新,但组件没同步显示,可以给ReferenceArrayInput加个动态key,每次点击按钮时改变key,触发组件重新渲染读取最新值:
import { useState } from 'react'; // 新增一个用于刷新的状态key const [refreshKey, setRefreshKey] = useState(0); const handleClick = () => { setValue('content', newIds, { shouldDirty: true }); // 更新key,强制组件重新渲染 setRefreshKey(prev => prev + 1); }; // 给ReferenceArrayInput绑定动态key <ReferenceArrayInput key={refreshKey} resource={resource} reference={reference} source="content" />
方案三:检查dataProvider是否能获取到对应id的记录
另外要注意,ReferenceArrayInput需要通过dataProvider获取到你设置的这些id对应的后端记录,如果这些id不存在或者dataProvider没返回对应数据,组件可能不会正确显示选中状态,但这时候表单值其实已经更新了,你可以在点击按钮后再次打印getValues('content')确认。
最后如果以上方法都没用,建议检查react-admin和react-hook-form的版本,尽量升级到最新稳定版,避免版本兼容问题。
备注:内容来源于stack exchange,提问作者Luís Fernandes

