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

为何React中useEffect传入空依赖数组仍执行两次?

React useEffect 依赖为空数组却执行两次的原因与解决

核心原因:React Strict Mode

在开发环境中,React Strict Mode会主动重复调用useEffect(以及其他部分生命周期方法),目的是检测代码中潜在的副作用问题(比如意外修改原数据、非幂等操作)。这种重复执行仅存在于开发环境,生产环境下不会触发。

解决方式

  1. 临时关闭Strict Mode(调试场景)
    找到项目入口文件(通常是index.js),移除<React.StrictMode>的包裹即可消除开发环境下的重复执行。但不建议长期关闭,因为Strict Mode能帮你提前发现隐藏的代码问题。

  2. 修正代码中的副作用问题
    你的代码存在直接修改原数据的错误:incorrect_answers.push(...)会改变allQuestion的原数组,既违反React不可变数据原则,还可能引发意外重渲染;同时push方法返回的是数组长度,并非你需要的新数组,导致compeleteArray的值不符合预期。

    修正后的代码:

    useEffect(() => {
      // 通过扩展运算符创建新数组,避免修改原数据
      const completeArray = [
        ...allQuestion[questionIndex].incorrect_answers,
        allQuestion[questionIndex].correct_answer
      ];
      setAllOptions(completeArray);
      console.log(completeArray);
      console.log("running");
      console.log(
        "addCorrect:",
        completeArray,
        "allQuestion.correct_answer:",
        allQuestion[questionIndex].correct_answer
      );
    }, []);
    
  3. 排查其他重渲染触发点
    若移除Strict Mode后仍出现两次执行,需检查组件是否被父组件强制重渲染,或是否有其他useState/useReducer的更新操作触发了组件重新渲染。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:01:19