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

React中componentDidMount方法为何执行两次?

为什么React的componentDidMount会执行两次?

最常见原因:React 18开发环境的严格模式(Strict Mode)

在React 18的开发环境中,Strict Mode会刻意重复调用部分生命周期方法(包括componentDidMount),目的是帮你检测代码中潜在的副作用问题。这种重复执行仅存在于开发阶段,生产环境打包后不会出现该现象。

你可以检查项目入口文件(比如index.js),看是否包裹了<React.StrictMode>:

ReactDOM.createRoot(document.getElementById('root')).render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

如果注释掉<React.StrictMode>后重新运行,componentDidMount就只会执行一次。

其他可能的排查方向

  • 组件重复挂载:检查路由配置或父组件逻辑,是否存在组件被卸载后重新挂载的情况(比如路由切换触发重复渲染、条件渲染导致组件反复挂载/卸载)。
  • 上下文(Context)异常更新:你使用了AuthContext,如果上下文的token等值在组件挂载前后发生突变,导致父组件重新渲染并触发当前组件的二次挂载,也会引发该问题。可以在componentDidMount中打印this.context,观察挂载前后的上下文变化。

避免重复请求的优化方案

即使是开发环境的Strict Mode导致的重复请求,也可以通过代码调整避免接口重复调用:

  1. 添加请求状态标记,确保同一时间只有一个请求在执行:
state = {
  clients: [],
  isFetching: false,
};

fetchClients() {
  // 已有请求在执行时直接返回
  if (this.state.isFetching) return;
  
  this.setState({ isFetching: true });
  
  let requestBody = {
    query: `
      query{
        users{
          _id
          name
        }
      }
    `,
  };

  fetch("http://localhost:8000/api", {
    method: "POST",
    body: JSON.stringify(requestBody),
    headers: {
      "Content-Type": "application/json",
      Authorization: "Bearer " + this.context.token,
    },
  })
  .then((res) => {
    if (res.status !== 200) {
      throw new Error("Failed");
    }
    return res.json();
  })
  .then((resData) => {
    const clients = resData.data.users;
    this.setState({ clients: clients, isFetching: false });
    console.log(resData);
  })
  .catch((err) => {
    console.log(err);
    this.setState({ isFetching: false });
  });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:01:15