42 条回复  ·  3556 次点击
zhhbstudio 小成 2024-4-28 18:43:31
Vue2 还是 Vue3 ,数据量大概多少
PS:Vue2 可以通过 composition-api 使用类似 Vue3 的 API
xiangyuecn 初学 2024-4-28 18:56:37
你这点代码能泄露个啥,甩锅给 vue ,寿命+1 。
TKI 小成 2024-4-28 19:41:18
把 flightClient.subscribe 去掉,试了下也没有内存泄漏

https://codesandbox.io/p/sandbox/vant-3-issue-template-forked-vjkxqz?file=%2Fsrc%2FTest.vue%3A16%2C20
wellerman 小成 2024-4-28 19:45:26
1. setInterval 执行用了匿名函数,由于匿名函数定义在全局,可能会导致内存泄露

按 #4 楼给的方法,直接调用命名函数:
timer = setInterval(handleData, 300);

2. 防止 orderBy( 处理时间超过 300ms

var working = false;
function handleData() {
   if (working) {
      return;
  }
   working = true;
   ...
   working = false;
}
lulinchuanllc 小成 2024-4-28 20:54:03
flightClient.subscribe 在卸载时也应该 off 掉吧,否则这里的变量都被消息订阅列表里的订阅函数缓存了
DOLLOR 小成 2024-4-29 01:53:00
建议把 data 和 visibleData 都改成浅响应( shallowRef )。
我推测 orderBy 在处理 list 的时候,因为 vue 的响应式处理造成了过重的负担。
visper 小成 2024-4-29 09:47:21
这里代码应该没有什么内存泄露,猜测可能是因为 timeout 300 毫秒执行频率太高,然后数组又太大,orderby 里面每次又生成一个新的 list 重新给 vue 再重新处理初始化响应。造成浏览器内存回收没这么及时。
coderHu 小成 2024-4-29 09:47:32
现在解决了么?蹲个解决方案
ColdBird 小成 2024-4-29 09:52:32
如果 visibleData.value 不是 null ,说明 list 不是原来的 list 了,不然一定是 null
话说这代码写的也有点抽象
davin 限制会员 2024-4-29 11:30:05
变量作用域被污染。另外,可以使用 requestAnimationFrame 替代 setInterval 。
返回顶部