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

React+Electron(Vite-Electron)中useEffect清理函数生产环境失效问题

问题分析

你的代码在开发环境正常但打包后失效的核心原因是React严格模式的环境差异:

  • 开发环境下,React严格模式会重复调用useEffect(用于检测潜在副作用)。第一次执行时你设置firstUpdate.current = false并返回undefined;第二次执行时,firstUpdate.current已经是false,所以返回了清理函数,因此组件卸载时能执行重置逻辑。
  • 生产环境(Electron打包后)严格模式默认关闭,useEffect只会执行一次,此时你直接return没有返回清理函数,组件卸载时自然没有对应的逻辑触发。

另外原代码的逻辑设计存在问题:你试图在useEffect内部通过条件判断决定是否返回清理函数,但useEffect的清理函数是在执行该effect时就绑定的,后续无法动态变更。

解决方案

调整逻辑,确保useEffect始终返回清理函数,在清理函数内部判断是否为首次卸载即可:

const firstMount = useRef(true);

useEffect(() => {
  // 首次挂载后标记为已完成
  if (firstMount.current) {
    firstMount.current = false;
  }

  // 始终返回清理函数,仅在非首次卸载时执行重置
  return () => {
    if (!firstMount.current) {
      dispatch(resetTeethData());
      dispatch(resetChartingData());
      dispatch(resetConsultationData());
      dispatch(setDocumentPatient(null));
    }
  };
}, []);
补充说明
  • 使用ref标记首次挂载是高效且安全的方式,不会触发组件重新渲染。
  • 空依赖数组[]确保useEffect仅在组件挂载时执行一次,清理函数仅在组件卸载时执行一次。
  • 该写法在开发/生产环境下表现一致,不会因为严格模式的差异出现行为不一致的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 05:32:05