【发布时间】:2020-10-05 01:05:32
【问题描述】:
我在 React 中有一个包含十几个子组件的复杂表单。它还包括我自己的表单组件,这些组件不是由单个值操作的。表单的某些部分使用对象树作为数据。
我有一个主要组件(我们称之为 EditForm),它存储整个数据对象树。我假设这个表单的每个组件都应该使用这个主要对象的特定部分。我应该能够将整个表单数据存储到 JSON 中并从 JSON 中读取(并在 JSON 更改时自动更新所有子组件)。
我的想法是仅刷新我更改主 JSON 时所需的表单部分。但是处理这种行为的代码非常庞大和复杂。我必须在每个子组件中实现比较功能,并将部分主要 JSON 转换为每个子组件的 props。
const [testobj, setTestobj] = useState({'obj1': {......}, 'obj2': {.......}, .......});
function revalidateSub(sub_name, value)
{
let t2 = cloneDeep(testobj);
t2[sub_name] = value;
setTestobj(t2);
}
return (<MySubComponent subobj={testobj['sub1']} ident={"sub1"} onUpdateData={v => revalidateSub('sub1', v)}/>)
(subobj是由特定子组件控制的数据,onUpdateData是一个处理程序,每次对受控数据进行任何更改时都会在子组件内部调用)
但是,此方案无法按预期工作。因为 revalidateSub() 函数存储了自己的 testobj 副本和每个组件的 onUpdateData 重写其他子组件的更改...
说实话,我不太了解如何为这种类型的 React 应用正确存储数据。你有什么建议?也许我应该将数据存储从 React 组件中移出?或者也许 useMemo?
感谢您分享的经验和示例!
更新1:我已经在沙箱中编写了示例,请检查 https://codesandbox.io/s/thirsty-browser-xf4u0
要查看问题,请点击几次“点击我!”对象 1 中的按钮,您可以看到 obj1 的值正在发生变化,主对象的值也在发生变化(即正确)。然后单击一次到“单击我!” obj2 的。您将看到(BOOM!)obj1 的值被重置为其默认状态。这是不正确的。
【问题讨论】:
标签: javascript reactjs forms use-state