可视化编辑器中如何动态更新配置面板的表单项?
我在做一个低代码平台的可视化编辑器,左侧是画布,右侧是属性配置面板。现在的问题是:当我点击画布上的不同组件时,右侧的配置表单需要动态切换,但用 React 的 useState 更新表单字段后,输入框的值不会实时反映新组件的属性,好像被缓存住了。
我试过加 key 强制重新渲染,也试过用 useEffect 监听选中组件变化去重置表单状态,但都不太稳定。下面是我简化后的代码:
const [selectedComponent, setSelected] = useState(null);
const [formValues, setFormValues] = useState({});
useEffect(() => {
if (selectedComponent) {
setFormValues(selectedComponent.props || {});
}
}, [selectedComponent]);
// 表单渲染
return (
<input
value={formValues.title || ''}
onChange={e => setFormValues({...formValues, title: e.target.value})}
/>
);
是不是因为 formValues 和 selectedComponent 的 props 引用没断开导致的?该怎么正确同步?
首先我看你的代码里formValues这个状态没完全解耦开。每次选中不同组件时,虽然你在useEffect里更新了formValues,但表单输入框绑定的是formValues.title,这里有个小坑。
试试把setFormValues改成这样:
然后在useEffect里直接用updateForm(selectedComponent.props || {})。这样能保证新旧状态不会互相干扰。
还有个技巧,在输入框onChange里也用类似的方式:
记得把selectedComponent当依赖项时,要确保它是全新的对象引用,不然React识别不到变化。我以前写WP插件遇到过这种状态缓存问题,搞了一晚上才解决,你这情况应该就是类似的。
最后提醒下,表单字段多的话,建议把每个字段都单独处理状态,别全堆在一个对象里,维护起来容易乱套。