记录一次在React脚手架中使用setTimeout会导致输出两次console.log

本文探讨了在React项目中,由于严格模式(StrictMode)的影响,导致`console.log`在某些情况下被双调用的现象。具体表现为在Promise.all执行时,每个console.log语句执行了两次。文章解释了React17开始自动修改控制台方法以在生命周期函数的第二次调用中关闭日志,但不影响Promise回调中的console.log。严格模式的主要目的是帮助开发者识别不安全的生命周期、废弃的API以及意外的副作用,并提供了一个双调用的机制来辅助检测。
const task = [];
  function output(i) {
    return new Promise((resolve) => {
      setTimeout(() => {
        console.log(i, Math.random());
        resolve();
      }, i * 1000);
    });
  }
  for (var i = 0; i < 5; i++) {
    task.push(output(i));
  }
  Promise.all(task).then((res) => {
    setTimeout(() => {
      console.log(i, "i");
    }, 1000);
  });
  console.log(11111);

在执行上面的代码时输出为:

可以看出,每个console 都执行了两次

这是因为用脚手架创建项目,默认会自动启用严格模式,所以你会发现双调用现象 

 StrictMode 表示开启严格模式

某些情况下,React会修改console.log()等控制台方法以使日志静默。

从React 17开始,React会自动修改console.log()等控制台方法,在对生命周期函数的第二次调用中关闭日志。但是,在可以使用解决方案的某些情况下,它可能会导致不希望的行为。

显然,当从Promise回调调用console.log时,它不会这样做。但当从render调用时,它会这样做。

  • Strict Mode 的作用
  1. 识别不安全的生命周期
  2. 关于使用过时字符串 ref API 的警告
  3. 关于使用废弃的 findDOMNode 方法的警告
  4. 检测意外的副作用
  5. 检测过时(遗留)的 context API

因为严格模式不能自动检测到你的副作用, 但它可以帮助你发现它们, 使其更具确定性。这是通过有意地双调用以下方法来完成的,但是你可能不太习惯,那就关了它

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值