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

Vue3组合式API:组件卸载时如何注销回调函数

Vue3组合式组件中清理副作用的正确方式

直接给结论:完全应该用onUnmounted,这是Vue3官方组合式API里专门用于组件销毁/卸载阶段执行清理逻辑的钩子,也是处理这类场景的标准做法。

场景一:注销需要清理的回调函数

比如注册了全局事件监听、第三方库的回调等,都可以在onMounted里注册,onUnmounted里注销:

<script setup>
import { onMounted, onUnmounted } from 'vue'

// 定义需要注册的回调
const handleWindowResize = () => {
  console.log('窗口尺寸变化了')
}

// 组件挂载完成后注册回调
onMounted(() => {
  window.addEventListener('resize', handleWindowResize)
})

// 组件卸载时注销回调,避免内存泄漏
onUnmounted(() => {
  window.removeEventListener('resize', handleWindowResize)
})
</script>

场景二:清理setInterval/setTimeout

定时器这类异步任务,必须在组件卸载时手动清除,同样用onUnmounted:

<script setup>
import { onMounted, onUnmounted } from 'vue'

let timerId = null

onMounted(() => {
  // 启动定时器
  timerId = setInterval(() => {
    console.log('每隔2秒执行一次任务')
  }, 2000)
})

onUnmounted(() => {
  // 组件卸载时清除定时器
  clearInterval(timerId)
})
</script>

自定义组合式函数中的清理逻辑

如果把这些逻辑封装成自定义组合式函数,也可以直接在函数内部使用onUnmounted,Vue会自动将这个钩子关联到调用该函数的组件上,无需额外处理:

// 自定义组合式函数:useTimer.js
import { onMounted, onUnmounted } from 'vue'

export function useTimer(callback, interval) {
  let timer = null

  onMounted(() => {
    timer = setInterval(callback, interval)
  })

  onUnmounted(() => {
    clearInterval(timer)
  })
}

// 在组件中使用
<script setup>
import { useTimer } from './useTimer'

useTimer(() => {
  console.log('自定义函数管理的定时器')
}, 1500)
</script>

不用刻意对标React的useEffect,Vue3的组合式API是通过生命周期钩子来清晰划分不同阶段的逻辑,onUnmounted就是卸载阶段的专属工具,直接用就对了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 07:02:10