我遇到了父组件和子组件之间的通信问题。
我希望父母(主机)保持自己的状态。我希望孩子(来宾)通过该状态并对其进行修改。孩子有他的本地版本的状态,可以改变孩子想要的任何东西。然而,一旦孩子玩完状态,他就会将它传递给父母以实际“保存”实际状态。我将如何正确实现这一点?
我的代码中的问题:
在 updateGlobalData 处理程序上,我记录了 data 和 newDataFromGuest ,它们是相同的。我希望 data 代表旧版本的数据, newDataFromGuest 代表新版本
updateGlobalData 被称为 2X。我可以通过从 useEffect 内部的 deps 数组中删除 updateGlobalData ref 来解决这个问题,但我不想搞砸它。
我想要的结果应该是:
- 数据状态应该保留旧数据,直到调用 updateGlobalData
- 当我单击按钮时,我希望 updateGlobalData 只被触发一次
来自 Codesandbox 的代码:
import React, { useState, useEffect } from "react";
import ReactDOM from "react-dom";
const Host = () => {
const [data, setData] = useState({ foo: { bar: 1 } });
const updateGlobalData = newDataFromGuest => {
console.log(data);
console.log(newDataFromGuest);
setData(newDataFromGuest);
};
return <Guest data={data} updateGlobalData={updateGlobalData} />;
};
const Guest = ({ data, updateGlobalData }) => {
const [localData, setLocalData] = useState(data);
const changeLocalData = newBarNumber => {
localData.foo = { bar: newBarNumber };
setLocalData({ ...localData });
};
useEffect(() => {
updateGlobalData(localData);
}, [localData, updateGlobalData]);
return (
<div>
<span>{localData.foo.bar}</span> <br />
<button onClick={() => changeLocalData(++localData.foo.bar)}>
Increment
</button>
</div>
);
};
const rootElement = document.getElementById("root");
ReactDOM.render(<Host />, rootElement);