【问题标题】:incrementation goes haywire when performed in `setState` callback [duplicate]在`setState`回调中执行时,增量变得混乱[重复]
【发布时间】:2021-04-18 16:07:35
【问题描述】:

我有一个代码,其中state 应该每 2 秒增加 1。 setStatesetInterval 回调中被调用,但我没有使用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}
-------- 

这太奇怪了。发生了什么?

游乐场:codesandbox

【问题讨论】:

  • 您在index.js 中启用了<React.StrictMode>
  • 我真的不明白为什么它被关闭为重复...这不是那个问题的重复,它是相关的但不是重复的。

标签: javascript reactjs react-hooks


【解决方案1】:

发生这种情况是因为您的 App<React.StrictMode> 包裹。 Strict Mode 在开发中两次渲染你的组件以发现任何问题,这可能会导致一些类似的副作用。

如果您删除包装 <React.StrictMode> 标记,您的组件将呈现一次,您的代码将按预期工作。

【讨论】:

  • 在严格模式下,React 两次调用传递给setState 的函数,因此增量加倍,但为什么我从这些额外调用中看不到console.logs?
  • 好的,我在文档中找到了答案:“从 React 17 开始,React 会自动修改控制台方法,如 console.log(),以在第二次调用生命周期函数时使日志静音。”。这很奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
  • 1970-01-01
  • 2015-05-28
相关资源
最近更新 更多