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

为何useEffect返回的清理函数提前执行?组件日志异常求解

问题原因与解决方案

你这里的核心问题是useEffect的清理函数写法错误。

在你的Slider.tsx代码里,useEffect的返回值直接写了return store.destroy(),这会导致:

  • 组件挂载时,执行store.init()后,立刻调用store.destroy()并返回它的返回值(此处为undefined),所以控制台会连续输出i init和i destroyed。
  • 当组件卸载时,因为没有返回真正的清理函数,所以不会执行任何操作,也就没有日志输出。

正确的写法应该是返回一个函数,这个函数会在组件卸载时被调用:

const [store] = useState(() => new SliderStore())
useEffect(() => {
  store.init()
  // 返回一个函数,组件卸载时执行该函数
  return () => store.destroy()
}, [])

修改后,组件挂载时只会执行store.init()输出i init,当你离开组件(组件卸载)时,才会执行store.destroy()输出i destroyed,完全符合你的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:32:19