Vue 中导致 detached 元素产生的常见行为

Vue 中导致 detached 元素产生的常见行为

在 Vue 应用中,detached 元素指的是已经从 DOM 树中移除但仍然被 JavaScript 引用着的 DOM 节点。这些元素会导致内存泄漏,因为它们占用的内存无法被垃圾回收机制回收。以下是 Vue 中常见会导致 detached 元素产生的行为:

1. 未正确清理的全局事件监听器

javascript 复制代码
mounted() {
  window.addEventListener('resize', this.handleResize)
},
beforeDestroy() {
  // 如果忘记移除监听器,相关元素可能保持引用
  // window.removeEventListener('resize', this.handleResize)
}

2. 第三方库未正确销毁

javascript 复制代码
mounted() {
  this.chart = new Chart(this.$refs.canvas, {...})
},
beforeDestroy() {
  // 如果忘记调用销毁方法
  // this.chart.destroy()
}

3. 未清理的定时器

javascript 复制代码
data() {
  return {
    timer: null
  }
},
mounted() {
  this.timer = setInterval(() => {
    // 一些操作
  }, 1000)
},
beforeDestroy() {
  // 如果忘记清除定时器
  // clearInterval(this.timer)
}

4. 未清理的 Vue 自定义事件

javascript 复制代码
mounted() {
  this.$on('custom-event', this.handleEvent)
},
beforeDestroy() {
  // 如果忘记移除事件监听
  // this.$off('custom-event', this.handleEvent)
}

5. 在组件销毁后仍然持有 DOM 引用

javascript 复制代码
data() {
  return {
    elements: []
  }
},
methods: {
  cacheElement() {
    this.elements.push(document.getElementById('some-element'))
  }
}
// 如果 elements 数组不清空,引用的 DOM 元素会保持
// 这时候包含some-element元素的组件被销毁,DOM的引用依然存在

6. 使用 v-if 切换组件时的引用保留

javascript 复制代码
// 父组件
<template>
  <child-component v-if="showChild" ref="child"/>
</template>

// 如果在其他地方保持了对 this.$refs.child 的引用
// 即使child-component组件被销毁,引用仍然存在
mounted() {
  this.detachedElement = this.$refs.child;
}

如何检测

方式一

  1. 使用 Chrome DevTools 的 Memory 工具
  2. 先手动触发垃圾回收
  3. 拍摄堆快照(Heap snapshot)
  4. 搜索 "detached" 来查找分离的 DOM 树

方式二

  1. 使用 Chrome DevTools 的 Memory 工具
  2. 先手动触发垃圾回收
  3. 拍摄分离的元素(Detached elements)

拍摄分离的元素可能导致原本被回收的 elements 没有被回收,所以多次拍摄会产生影响,关闭 DevTools 或刷新页面后引用会释放。拍摄堆快照无此问题。

相关推荐
莪_幻尘1 小时前
Skill 体检:30 个 Skill 全凭感觉?体检器先自曝了 8 个“假 0 分
前端·人工智能·llm
风骏时光牛马1 小时前
AI模型综合能力评测:性能、指令遵循与多场景实测对比
前端
Frag0ut1 小时前
Chrome与Chromium内核浏览器在Windows 11上的新特性全景解析
前端·chrome·windows·web安全·chromium·gemini ai·playready drm
hiahiahia1231 小时前
实现完整 Tool Dispatcher
开发语言·前端
IT_陈寒2 小时前
Java线程池这破玩意,差点让我周末加班排查到凌晨
前端·人工智能·后端
Mr_Mao2 小时前
告别选型困难!集 VueUse、ahooks、Mantine 于一身:286 个 Hook 的 ReaUse 来了
前端·javascript·react.js
泡海椒3 小时前
趋势分析报表:jquick-pdf折线图PDF生成实战
java·大数据·运维·服务器·前端·pdf
qwfy3 小时前
我要用 AI-native 架构,从零重建一套制造业 ERP/MES
vue.js·spring boot·架构
默_笙3 小时前
🚙 一条腿走路会摔:ES 关键词检索、混合召回与 ReRank 裁判
前端·javascript
YIAN3 小时前
从跨域代理到 WebSocket:梳理前端实时通信的底层逻辑与完整实践
前端·websocket