为何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。
为什么不推荐这么做?
- 依赖未公开的内部细节:React团队没有承诺会一直保持这个执行逻辑,未来版本可能修改,导致代码直接失效。
- 失去Strict Mode的意义:Strict Mode的双渲染是为了帮你发现潜在问题(比如未正确清理的副作用),强行规避会让你错过这些风险提示。
内容的提问来源于stack exchange,提问作者Kipnoedels
相关产品推荐
相关产品推荐

