javascript - 在父组件状态中存储回调时过时的关闭
问题描述
我有以下情况。我想在父组件的状态下注册一个函数。该函数关闭子组件中的某些本地状态。该函数似乎总是history
在父组件中调用时获得一个陈旧的值。
import React, { useState, useCallback } from "react";
import ReactDOM from "react-dom";
const App = () => {
const [parentState, setParentState] = useState([]);
const [inc, setInc] = useState(0);
return (
<span>
<StaleList setParent={setParentState} />
Read from closures: {parentState.map(fn => fn())}
<br />
Rerenders from button press: {inc}
<button onClick={() => setInc(val => val + 1)}>Trigger rerender</button>
</span>
);
};
const StaleList = ({ setParent }) => {
const [history, setHistory] = useState([]);
const closure = () => history;
return (
<div>
History: {history}{" "}
<button
onClick={() => {
setHistory(["new history value"]);
setParent([closure]);
}}
>
Click me
</button>
</div>
);
};
ReactDOM.render(<App />, document.getElementById("container"));
我怎样才能在这里修复陈旧的闭包,并让闭包返回history
调用时的最新值?(即见“新的历史价值”反映在父)
解决方案
您的代码的问题是,当您在单击按钮时将其推送到 parentState 时,闭包函数具有历史记录的旧值。
您可以改为使用 useEffect 来更新父级
const StaleList = ({ setParent }) => {
const [history, setHistory] = useState([]);
useEffect(() => {
const closure = () => history;
setParent([closure]);
}, [history, setParent]);
return (
<div>
History: {history}{" "}
<button
onClick={() => {
setHistory(["new history value"]);
}}
>
Click me
</button>
</div>
);
};
推荐阅读
- javascript - 我需要在 javascript / jQuery 中获取嵌套对象中的值列表
- android - 从android中的Html标签重定向到链接
- python - Python Tkinter - 形状调整
- ng-bootstrap - 如何使用 Ng-Bootstrap 6 在 Angular 9 中正确实现 Tooltip
- python - 如何提取Json数据并导出为csv
- groovy - 如何在src下导入groovy文件
- npm - 如何使用 AWS Codecommit 存储库作为 npm 依赖项
- android - react-native-video 示例抛出“TypeError:undefined”错误
- java - 如何将资源池与机架系统连接?
- azure - 从 Windows 桌面应用程序调用具有 AD 授权的 Azure 函数