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

为何React Strict Mode中该useEffect的API调用仅执行一次?

为什么这段规避Strict Mode双Effect的代码能生效?

首先明确:React Strict Mode在开发环境下会同步执行两次组件渲染、Effect回调和清理函数,目的是帮你检测不安全的副作用或配置错误。你提到的这段代码能生效,完全依赖React的一个内部执行细节,而且绝对不推荐在生产代码中使用——原因后面说明。

具体执行流程拆解:

  • 第一次渲染:调用useApiDemo时,声明strictModeRerun = false,同时注册Effect。这个Effect的回调和清理函数都会闭包这个strictModeRerun变量。
  • 执行第一次Effect:因为strictModeRerun是false,所以触发fetchApi(param)。
  • 同步执行清理函数:Strict Mode会立即执行Effect的清理逻辑,把闭包里的strictModeRerun改成true。
  • 第二次渲染:虽然useApiDemo被再次调用,重新声明了strictModeRerun = false,但React在Strict Mode下,对于依赖项完全相同(param没变化)的Effect,会复用第一次渲染时创建的Effect闭包,而不是生成新的Effect。
  • 执行第二次Effect:此时回调里引用的是第一次渲染中已经被改成true的strictModeRerun,!strictModeRerun为false,自然不会调用fetchApi。

为什么不推荐这么做?

  1. 依赖未公开的内部细节:React团队没有承诺会一直保持这个执行逻辑,未来版本可能修改,导致代码直接失效。
  2. 失去Strict Mode的意义:Strict Mode的双渲染是为了帮你发现潜在问题(比如未正确清理的副作用),强行规避会让你错过这些风险提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 12:55:58