当前位置: 首页 > news >正文

【学一点儿前端】单页面点击前进或后退按钮导致的内存泄露问题(history.listen监听器清除)

今天测试分配了一个比较奇怪的问题,在单页面应用中,反复点击“上一步”和“下一步”按钮时,界面表现出逐渐变得卡顿。为分析这一问题,我用Chrome的性能监控工具进行了浏览器性能录制。结果显示,每次点击“上一步”按钮时,JavaScript堆内存(JS Heap)和事件监听器(listener)的数量显著增加,并且随着点击次数的增加,这种增长趋势变得越来越明显,所需的时间也逐渐延长。如图所示:
在这里插入图片描述
于是我开始查找代码里的监听器,发现了这个监听代码

history.listen((_,type)=>{if (type==='POP'){setMchInfo({...mchInfo})}
})

这是一个用于监听浏览器历史记录变化的方法。当历史记录发生变化时,传递给listen方法的回调函数会被调用。
而我点击上一步时,会触发这么一个函数

const prevStep = () => {history.go(-1);
};

而这个函数就会触发history.listen,从而增加监听器数量
这样,我们需要在监听器用完的时候直接移除添加的监听器

useEffect(() => {const unlisten = history.listen((_, type) => {if (type === 'POP') {setMchInfo({ ...mchInfo });}});return () => {unlisten();};
}, [history]);

unlisten是history.listen返回的函数,用于移除之前添加的监听器,useEffect钩子的清理函数机制保证了在history变化时,只有旧的监听器会被移除,而新的监听器会在清理之后重新添加,避免内存泄漏。
重试了一次,问题完美解决。

http://www.lryc.cn/news/379774.html

相关文章:

  • vue跳转页面 如果登录了直接跳转 没有登录登录完以后直接跳转,使用vuex管理登录状态
  • 渗透测试-若依框架的杀猪交易所系统管理后台
  • 【免费】中国电子学会2024年03月份青少年软件编程Python等级考试试卷一级真题(含答案)
  • 深入了解RTMP推流技术:视频汇聚EasyCVR低延迟与高稳定性分析
  • containerd手动配置容器网络
  • 数据迁移到 Django 模型表:详尽指南
  • 代码随想三刷二叉树篇4
  • 『大模型笔记』如何让小型语言模型发挥作用!
  • jnp.diag
  • bert文本分类微调笔记
  • 运维:k8s常用命令大全
  • PHP基础之错误与异常
  • 详解Spring AOP(一)
  • 读者写者问题(读者优先、公平竞争、写者优先)
  • Springboot开发之 Excel 处理工具(二)-- Easyexcel
  • 6月27日云技术研讨会 | 中央集中架构新车型功能和网络测试解决方案
  • 微信小程序生命周期
  • 【JS重点15】原型对象概述
  • Java之Hutool/Guava/Apache Commons工具包项目实践
  • 哈喽GPT-4o——对GPT-4o 提示词的思考与看法
  • 《计算机英语》 Unit 3 Software Engineering 软件工程
  • 2024-6-18(沉默Spring,Springboot)
  • Java热部署:让应用更新如丝般顺滑,告别繁琐重启!
  • 微信小程序毕业设计-小区疫情防控系统项目开发实战(附源码+论文)
  • PyTorch -- RNN 快速实践
  • SpringBoot 快速入门(保姆级详细教程)
  • 【第18章】Vue实战篇之登录界面
  • [C++]使用C++部署yolov10目标检测的tensorrt模型支持图片视频推理windows测试通过
  • 分享uniapp + Springboot3+vue3小程序项目实战
  • Ubuntu 24.04安装zabbix7.0.0图形中文乱码