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
相关产品推荐
相关产品推荐

