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 或刷新页面后引用会释放。拍摄堆快照无此问题。

相关推荐
不像程序员的程序媛3 分钟前
Nginx日志切分
服务器·前端·nginx
北原_春希12 分钟前
如何在Vue3项目中引入并使用Echarts图表
前端·javascript·echarts
JY-HPS12 分钟前
echarts天气折线图
javascript·vue.js·echarts
尽意啊14 分钟前
echarts树图动态添加子节点
前端·javascript·echarts
吃面必吃蒜14 分钟前
echarts 极坐标柱状图 如何定义柱子颜色
前端·javascript·echarts
O_oStayPositive15 分钟前
Vue3使用ECharts
前端·javascript·echarts
竹秋…15 分钟前
echarts自定义tooltip中的内容
前端·javascript·echarts
宝贝露.15 分钟前
Axure引入Echarts图无法正常显示问题
前端·javascript·echarts
shmily麻瓜小菜鸡16 分钟前
前端文字转语音
前端
人良爱编程19 分钟前
Hugo的Stack主题配置记录03-背景虚化-导航栏-Apache ECharts创建地图
前端·javascript·apache·echarts·css3·html5