当前位置: 首页 > 知识库问答 >
问题:

前端 - Vue 中 vuex 内存泄露问题如何处理?

姬乐
2024-06-03

关于 vue 内存泄露问题?
我有 A B 两个页面,互相切换(未使用 keep-alive)
发现在 B 页面,会有内存泄露的问题
看下大致代码

  • B.vue

    mounted () {const list = [...this.$store.state.list]list.push({  vm: this})this.$store.dispatch('updateList', list)}

    问题原因应该是, 把当前 vue 实例 push 到了 store,导致数组劫持了 this 的引用

我的解决方案如下

  • B.vue

    mounted () {  const list = [...this.$store.state.list]  list.push({    vm: this  })  this.$store.dispatch('updateList', list)},beforeDestroy () {  const list = this.$store.state.list  const index = list.findIndex(item => item.vm === this)  if (index !== -1) {    list.splice(index, 1)  }  this.$store.dispatch('updateList', list)}

    image.png

这样能成功释放内存,我用 chrome devtools 手动回收后, DOM 节点也能成功降下来 511

但是后来发现说不要直接操作 store 所以我改成了下面的形式

  • B.vue

    mounted () {  const list = [...this.$store.state.list]  list.push({    vm: this  })  this.$store.dispatch('updateList', list)},beforeDestroy () {  this.$store.dispatch('spliceVm', this)},
  • store.js

    mutations: {  SET_LIST (state, data) {    state.list = data  },  SPLICE_VM (state, vm) {    const list = state.list    const index = list.findIndex(item => item.vm === vm)    if (index !== -1) {      list.splice(index, 1)    }    state.list = list  }},actions: {  spliceVm ({ commit }, data) {    commit('SPLICE_VM', data)  },  updateList ({ commit }, data) {    commit('SET_LIST', data)  }},

这样却释放不了内存,DOM 节点也在持续上升到了557, 请问我问题出在哪里?

image.png

共有1个答案

慕高格
2024-06-03
B.vuemounted () {  const list = [...this.$store.state.list]  list.push({    vm: this  })  this.$store.dispatch('updateList', list)},beforeDestroy () {  this.$nextTick(() => {    this.$store.dispatch('spliceVm', this)  })}store.jsmutations: {  SET_LIST (state, data) {    state.list = data  },  SPLICE_VM (state, vm) {    const list = state.list    const index = list.findIndex(item => item.vm === vm)    if (index !== -1) {      list.splice(index, 1)    }    state.list = [...list] // 用浅拷贝状态更新  }},actions: {  spliceVm ({ commit }, data) {    commit('SPLICE_VM', data)  },  updateList ({ commit }, data) {    commit('SET_LIST', data)  }}
 类似资料:
  • 本文向大家介绍ThreadLocal 内存泄露问题?相关面试题,主要包含被问及ThreadLocal 内存泄露问题?时的应答技巧和注意事项,需要的朋友参考一下 ThreadLocalMapThreadLocalThreadLocalThreadLocalMapset()get()remove()ThreadLocalremove()`方法 弱引用介绍: 如果一个对象只具有弱引用,那就类似于可有可无

  • 本文向大家介绍解决Tensorflow 内存泄露问题,包括了解决Tensorflow 内存泄露问题的使用技巧和注意事项,需要的朋友参考一下 使用tensorflow进行编程时,经常遇到操作不当,带来的内存泄露问题,这里有一个可以帮助debug问题所在方法: https://stackoverflow.com/questions/51175837/tensorflow-runs-out-of-mem

  • 本文向大家介绍Android中Handler引起的内存泄露问题解决办法,包括了Android中Handler引起的内存泄露问题解决办法的使用技巧和注意事项,需要的朋友参考一下 在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用。通常我们的代码会这样实现。 但是,其实上面的代码可能导致内存泄露,当你使用Android lint工具的话,会得到这样的警告 看到这里,可能

  • 我有一个课程调度问题,带有用于分数计算的约束流。当求解分配的堆时,它会不断增加,因此在几个小时后甚至超过8GB,我得到了一个java.lang.OutOfMemoryError:java堆空间。正如optaplanner文档中所述,堆大小在求解器阶段应保持不变。我需要关于这种行为的问题以及如何调试的建议。 optaplanners toList ConstraintCollector中提供的复制器

  • 问题 在使用海康h5player播放视频的时候,出现了内存泄露 版本2.12 链接 内存泄露监听,但是不知道怎么处理 期望 可以一直播放视频,但是不知道怎么处理监听的内存泄露(重新刷新也不行,内存依旧,不是很0开始) 代码

  • 手动创建vue组件的方法: 手动销毁组件的方法 在组件销毁后,仍然能检测到大量的detached DOM,检测过没有全局的事件绑定,有哪位大佬遇到过类似的问题,望不吝赐教!