【发布时间】:2021-07-27 06:52:03
【问题描述】:
我在尝试从 setInterval() 每隔一段时间调用的函数更新状态时发现 react 的意外行为。目的是让一个按钮调用一个 setInterval,该 setInterval 调用一个从我的 MySQL 数据库请求数据的函数,然后将第一个结果数组设置为我的状态。我希望同一个按钮在再次按下时也能清除间隔。一直开着。
我注意到,如果您注释掉 setData 函数,代码可以正常工作。我希望有人能解释为什么代码按预期工作,直到您尝试使用 setInterval 函数设置状态。
我猜这与没有立即更新的反应状态有关,或者甚至可能与 aysnc 有关?希望有人对正在发生的事情有更好的了解。
当前代码永远不会到达 else 块,只是设置另一个调用 getData 函数的间隔。
此代码不在 UseEffect Hook 内,该按钮具有 OnClick={toggleLive}。这个按钮在 Return() 里面
const [data, setData] = useState({});
const getData = async () => {
const lastEntry = await API.getLastEntry("rig08");
console.log(lastEntry);
setData(lastEntry[0] || 0);
}
var dataUpdate = null;
const toggleLive = async () => {
console.log(dataUpdate);
if (!dataUpdate) {
console.log("Condition");
dataUpdate = setInterval(getData, 1000);
} else {
console.log("Else");
clearInterval(dataUpdate);
dataUpdate = null;
}
}
return (
<Button onClick={toggleLive} className={liveBtn}>Live</Button>
)
这是所有相关代码,如果需要我可以提供更多。
【问题讨论】:
-
这是否发生在
useEffect挂钩中?你能分享更多代码吗 -
我猜你的代码永远不会去 else 块并调用
clearInterval。如果是这样,那么您需要使用useState来存储dataUpdate的值。 -
我已经进行了编辑以回答您的问题,您是对的,当我尝试使用 setData(lastEntry) 设置状态时,代码永远不会进入 else 块,但是当我将其注释掉时,代码按我的预期工作。
标签: javascript reactjs asynchronous state