为何使用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
相关产品推荐
相关产品推荐

