【发布时间】:2023-03-06 19:09:01
【问题描述】:
我遇到了父子组件之间的通信问题。
我希望父母(主机)保持自己的状态。我希望孩子(来宾)通过该状态并对其进行修改。孩子有他的本地版本的状态,可以改变孩子想要的任何东西。然而,一旦孩子玩完状态,他就会将它传递给父母以实际“保存”实际状态。 我将如何正确实现这一点?
我的代码中的问题:
在 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);
【问题讨论】:
-
RonH 尽管您的问题已被搁置,但我可能会为您解答。请按照上面的要求编辑问题,我将提供解决方案。
-
我做到了。希望它很快就会停止,您可以与我分享解决方案
-
@ravibagul91 你能否取消这个问题的“等待”状态?答案已被编辑。提前致谢!
标签: reactjs react-hooks use-effect