javascript - 在`setState`回调中执行时,增量变得混乱
问题描述
我有一个代码state
应该每 2 秒递增 1。setState
在回调内部setInterval
调用,但没有使用典型的setState
:形式,setState(newState)
我使用了回调形式setState(() => {...})
,奇怪的事情开始发生。状态不是递增 1,而是递增 2。
这是有问题的代码的简化:
const handler = () => {
let val = 0;
setInterval(() => {
setState(() => {
console.log("before inc", { val });
val = val + 1;
console.log("after inc\n--------", { val });
return val;
});
}, 2000);
}
预期的日志将是:
before inc {val: 0}
after inc {val: 1}
--------
before inc {val: 1}
after inc {val: 2}
--------
但相反,我有:
before inc{val: 0}
after inc {val: 1}
--------
before inc {val: 2}
after inc {val: 3}
--------
这太奇怪了。怎么了?
游乐场:密码箱
解决方案
发生这种情况是因为你App
的包裹着<React.StrictMode>
. 严格模式会在开发中两次渲染您的组件以发现任何问题,这可能会导致一些类似的副作用。
如果您删除包装<React.StrictMode>
标签,您的组件将呈现一次,您的代码将按预期工作。
推荐阅读
- colors - NetSuite - 基于值的颜色字段
- python - 麻烦在二十一点中将卡片对象发给玩家对象的手
- vb.net - 如何在此 Linq 查询中处理空合并?
- python - 为什么我不能从 mplfinance 导入烛台_ohlc
- reactjs - 如果我使用 res.send 文件,我是否需要 express.static
- android - androidstudio - Could not find out the created layout.xml form the fragment
- python - Web2Py.exe Will Not Open
- javascript - 无法解析键值名称周围带有单引号的字符串数组
- cluster-computing - Node Compute 0-0- already exist. Select different host name or rank value. IN Rocks Centos 7
- angular - How to use a custom HttpClient with Angular Universal?