You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中useEffect首次执行时console.log打印两次的原因

为什么React组件首次渲染时useEffect会执行两次?

这是React 18严格模式的默认行为。在开发环境的严格模式下,React会故意重复执行以下操作两次:

  • 组件的渲染逻辑
  • useEffect、useLayoutEffect的回调函数
  • 状态更新相关的函数

这么做的目的是帮你提前排查代码里的副作用问题——比如那些没正确清理的定时器、订阅,或者重复执行会出问题的逻辑。这些问题在生产环境可能只会偶然触发,开发阶段的重复执行能让它们更早暴露出来,方便你修复。

如果想验证这个结论,你可以找到项目根组件的入口文件(通常是index.js),把包裹组件的<React.StrictMode>标签移除,此时首次渲染时useEffect就只会打印一次"render"了。不过开发阶段还是建议保留严格模式,它能帮你规避很多潜在的bug。

你的代码示例:

import { useState, useEffect } from "react";

function MyComponent() {
  const [resourceType, setResourceType] = useState("posts");

  useEffect(() => {
    console.log("render");
  }, [resourceType]);

  return (
    <>
      <div>
        <button onClick={() => setResourceType("posts")}>Posts</button>
        <button onClick={() => setResourceType("users")}>Users</button>
        <button onClick={() => setResourceType("comments")}>Comments</button>
      </div>
      <h1>{resourceType}</h1>
    </>
  );
}

export default MyComponent;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 05:42:10