我们使用 Reacts 功能组件样式开发了一个可重用的类表组件。该表使用 React.useReducer 保存、管理和验证其状态。在每一行中都有几个输入字段、复选框和操作按钮来修改行/表状态。
现在在 GUI 的其他地方有一个保存按钮(不是表的子项)。如何从表中检索状态,以便可以将其(连同其他一些数据)发送到 REST-Endpoint 以保持持久性?
我们实际的解决方案是一个回调函数,它将被设置为桌子上的道具。每次渲染后从 table-component 内部调用此函数以发布当前状态的副本。现在,此回调函数的所有者获取并保存此数据,以便它在保存按钮的范围内可用。
function ComponentWrapper(props)
{
const dataRef = React.useRef(props.initialData);
function onDataUpdate(newData) {
dataRef.current = newDate;
}
function saveData() {
// send dataRef.current to REST-Endpoint
}
return (
<div>
<MyTable onDataUpdate={onDataUpdate}></MyTable>
...
<button onClick={(e) => sendData()} name="save">Save</button>
</div>
);
}
function MyTable(props)
{
const [state, dispatch] = useReducer(..., props.initialData)
// ... some code to dispatch state changing actions
useEffect(() => {
const copyOfState = { ...state }
props.onDataUpdate(copyOfState);
});
return (
// table markup goes here ...
);
}
这确实有效,但我们相信对于此类用例可能有更好的方法。我们不想将状态从表格提升到 ComponentWrapper,因为表格应该是可重用的,并且保存按钮可能位于 GUI 中完全不同的位置(例如,在工具栏或菜单中)。
对此有什么想法吗?提前致谢。