[英]React hook stale closure: setState only triggers twice in callback function of a subscription
我正在尝试为 React 构建一个 toast 消息 API。 我的目标是提供一个fireNotification()
api,它可以在应用程序的任何地方调用,并让 React 渲染 toast 组件。
我用 sub/pub 模式构建了这个简单的通知管理器,并希望能够在useEffect
挂钩中订阅新通知
const notifications = [];
const listeners = new Set();
function subscribe(callback) {
listeners.add(callback);
}
function publish() {
listeners.forEach((cb) => {
cb(notifications);
});
}
export function fireNotification(content) {
notifications.push(content);
publish();
}
export default function App() {
const [state, setState] = React.useState();
React.useEffect(() => {
subscribe((updated) => {
setState(updated);
});
}, []);
// state will be logged correctly 2 times
// won't be updated after that
console.log("state", state);
return (
<div className="App">
<button onClick={() => {fireNotification('test')}}>fire</button>
</div>
);
}
然而, fireNotification()
只会触发两次setState
从第三次开始,state 根本没有更新。
我可以通过将setState(updated)
更改为setState([...updated])
来使 state 更新工作,但不确定它为什么有效。
有人可以解释为什么setState(updated);
只触发两次? 谢谢!
您需要向 useEffect 提供数据以观察变化
React.useEffect(() => {
subscribe((updated) => {
setState(updated);
});
}, [updated]);
否则 useEffect 将只运行两次
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.