vue组件卸载是分阶段资源回收过程:先递归卸载子vnode,再触发beforeunmount/unmounted钩子,最后移除dom;onunmounted是最安全清理入口,需显式销毁第三方库、清除定时器、解绑事件、终止请求;effectscope和watcheffect的oninvalidate可自动化管理副作用。

Vue.js 组件卸载不是简单地删掉 DOM,而是渲染管线中一个有明确顺序、分阶段执行的资源回收过程。它依赖 vnode 的 diff 和卸载流程提供清理时机,真正释放资源靠的是开发者在正确位置写清理逻辑。
卸载流程:vnode 递归卸载 → 钩子触发 → DOM 移除
当组件因 v-if 为 false、路由切换或手动调用 unmount() 而退出时,Vue 渲染器启动卸载流程:
- 先递归卸载所有子 vnode,确保嵌套组件、动态内容、过渡节点等全部完成退出
- 再执行指令的
beforeUnmount和unmounted钩子,让自定义指令(如拖拽、焦点管理)有机会解绑事件、清除定时器 - 最后调用平台层移除操作(
hostRemove(el)),清空vnode.el和vnode.component引用,真实 DOM 节点才被移除
onUnmounted 是最常用也最安全的清理入口
这个钩子在 vnode 从树中移出、DOM 尚未被移除时执行,此时组件实例仍完整可用,能安全访问 ref、调用 unwatch、关闭第三方实例:

