destroyed钩子在实例完全销毁后触发,此时dom已移除、$el/$refs/watcher失效、事件与子组件均已清理,仅适用于日志记录、外部状态同步等收尾确认操作,不可用于释放vue自身资源或访问已失效的实例属性。

Vue Options API 中,destroyed 钩子在实例完全销毁后触发,此时所有响应式数据、事件监听器、子组件、DOM 关联均已解除。它适合做纯“事后确认”类操作,比如日志记录、外部状态同步、或清理非 Vue 管理的副作用(如第三方库手动绑定的回调),但不能用于释放 Vue 自身资源——因为这些已在销毁过程中自动处理完毕。
destroyed 钩子的核心特点
它发生在 beforeDestroy 之后,且满足以下条件:
- 组件 DOM 已从页面移除(若曾挂载)
- $el、$refs、watcher、computed 缓存全部失效,访问会返回 undefined 或报错
- 所有事件监听器(包括 $on 绑定的)已被移除
- 子组件也已完成销毁流程
- 此时修改 data 不会触发响应,也不再有更新行为
典型适用场景与写法
重点不是“清理”,而是“收尾确认”或“外部系统通知”。例如:
- 向埋点系统上报组件卸载事件:
this.$analytics.track('component_unmounted', { name: 'UserProfile' }) - 通知父级或全局状态管理器该实例已退出:
Bus.emit('user-profile-closed') - 关闭仅由该组件开启、且未被 beforeDestroy 清理的独立通道(如某个特定 WebSocket 连接 ID 的注销请求)
- 清除 localStorage 中仅该实例生命周期内生成的临时标记:
localStorage.removeItem('temp_draft_id_123')
注意事项与常见误区
避免在 destroyed 中执行以下操作:
- 调用
this.$nextTick()—— 实例已不存在,不会生效 - 访问
this.$el或this.$refs.xxx—— 返回 null 或 undefined,可能报错 - 尝试重新赋值 data 属性(如
this.loading = false)—— 不会响应,无意义 - 重复清理定时器或事件监听器 —— 应在 beforeDestroy 中完成,destroyed 时它们早已被移除
- 发起新的异步请求并依赖 this 上下文 —— 实例已销毁,回调中 this 不可靠
对比 beforeDestroy 更适合做什么
真正需要“主动释放”的工作,必须放在 beforeDestroy:
- 清除 setInterval / setTimeout(保存了 id 的)
- 解绑 window 或 document 上的 addEventListener
- 取消未完成的 axios 请求(使用 CancelToken 或 AbortController)
- 调用第三方库的 destroy() 或 unmount() 方法(如 Map 实例、图表库)
- 手动调用 $off 解除自定义事件订阅(如果没用 $once)
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











