You need to enable JavaScript to run this app. 为何使用Hooks的ReactJS组件日志打印次数,会随开发者控制台开关、运行环境不同出现一次或两次的差异?
优惠活动
大模型
产品
解决方案
定价
更多

为何使用Hooks的ReactJS组件日志打印次数,会随开发者控制台开关、运行环境不同出现一次或两次的差异?

观测到的打印行为差异
  • 启用StrictMode的CodeSandbox运行环境中,同一时间值会被控制台输出两次
  • 未启用StrictMode的独立代码演示场景(引入React开发版构建)中,同样存在同一值重复打印的现象
  • 替换为React生产构建库的代码片段运行后,依然会出现两次打印日志的情况
  • 打开浏览器自带开发者控制台观测时,每个时间值仅会被打印一次;CodeSandbox内置控制台运行时,也仅显示单次打印结果
  • 通过create-react-app搭建的独立React应用运行上述代码时,每个时间值会被打印两次
演示核心代码
const { useState, useEffect } = React;

function useCurrentTime() {
  const [timeString, setTimeString] = useState("");

  useEffect(() => {
    const intervalID = setInterval(() => {
      setTimeString(new Date().toLocaleTimeString());
    }, 100);
    return () => clearInterval(intervalID);
  }, []);

  return timeString;
}

function App() {
  const s = useCurrentTime();
  console.log(s);

  return <div className="App">{s}</div>;
}

ReactDOM.render(<App />, document.getElementById("root"));

演示场景配套的资源依赖

  • 开发版演示:加载 React 17.0.1 对应的 react.development.js、react-dom.development.js 文件
  • 生产版演示:加载 React 17.0.1 对应的 react.production.min.js、react-dom.production.min.js 文件
核心疑问
  • 按照常规逻辑,组件state发生变更时,App组件会带着新的字符串值重渲染一次,对应的console.log(s)理应仅触发一次,为何打印次数会随运行场景不同出现从1次到2次的变化
  • 为什么打开浏览器开发者控制台后,原本两次的打印会显示为单次

内容的提问来源于stack exchange,提问作者nonopolarity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 08:15:07