解决vue自定义指令导致的内存泄漏问题


Posted in Javascript onAugust 04, 2020

vue的自定义指令是一个比较容易引起内存泄漏的地方,原因就在于指令通常给元素绑定了事件,但是如果忘记了解绑,就会产生内存泄漏的问题。

看下面代码:

directives: {
  scroll: {
  inserted (el, cb) {
   // 不是元素节点 || 未设置回调函数
   if (el.nodeType !== 1 || !cb) return
   let direct = 'down'
   let rollHeight = 0

   let getScrollEventTarget = (target) => {
   while (target.nodeType === 1 && target.tagName !== 'BODY' && el.tagName !== 'HTML') {
    var overflowY = getComputedStyle(target).overflowY
    if (overflowY === 'scroll' || overflowY === 'auto') {
    return target
    }
    target = target.parentNode
   }
   return window
   }

   let targetNode = getScrollEventTarget(el)

   let scrollListener = () => {
   if (targetNode.scrollTop > rollHeight) {
    direct = 'down'
   } else {
    direct = 'up'
   }
   rollHeight = targetNode.scrollTop
   cb.value(rollHeight, direct)
   }

   el.unbindEventListener = () => {
   targetNode.removeEventListener('scroll', scrollListener)
   }
   targetNode.addEventListener('scroll', scrollListener)
  },
   // unbind (el) {
   // if (el.unbindEventListener) {
   // el.unbindEventListener()
   // }
  // }
  }
 }

起初,我忘记了些注释的unbind方法,导致出现了内存泄漏,给元素绑定的scroll方法,会一直存在内存里。

导致出的情况,就是比如我进了页面滚动到第3页,出去,再点一个页面,当滚动到第4页时,将会请求2次,一次是上个页面的第4页,一次是本次页面的第4页,当你退出,再进一个页面,当滚动到第5页时,将会请求3次(上上页,上页和本页),这就是典型的事件未解绑导致的内存泄漏。

所以需要给元素解绑,好在vue指令提供了unbind钩子函数,

但是这里依然有个技术巧点就是:

1、我们scroll的元素可能是绑定的元素的父级等等,需要一层一层往上找

2、就是解绑的时候我们也需要找到那个父级元素等等,然后还需要remove对应的方法,那么肯定不可能在unbind里再写一次,所以就可以在insert钩子函数里,给el绑定一个解绑事件el.unbindEventListener,在unbind钩子函数里直接调用即可。

以上这篇解决vue自定义指令导致的内存泄漏问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript中的绑定与解绑函数应用示例
Jun 24 Javascript
JavaScript Array对象扩展indexOf()方法
May 09 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
Jan 22 Javascript
JS显示下拉列表框内全部元素的方法
Mar 31 Javascript
基于jquery编写分页插件
Mar 07 Javascript
JavaScript获取IP获取的是IPV6 如何校验
Jun 12 Javascript
webpack实现热加载自动刷新的方法
Jul 30 Javascript
javascript+css3开发打气球小游戏完整代码
Nov 28 Javascript
js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解
Jan 19 Javascript
vue项目前端埋点的实现
Mar 06 Javascript
JQuery Ajax跨域调用和非跨域调用问题实例分析
Apr 16 jQuery
JQuery事件委托原理与用法实例分析
May 13 jQuery
vue中的v-model原理,与组件自定义v-model详解
Aug 04 #Javascript
详解JS深拷贝与浅拷贝
Aug 04 #Javascript
vue addRoutes路由动态加载操作
Aug 04 #Javascript
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
Aug 04 #Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
Aug 04 #Javascript
vue 解决uglifyjs-webpack-plugin打包出现报错的问题
Aug 04 #Javascript
浅谈在vue-cli3项目中解决动态引入图片img404的问题
Aug 04 #Javascript
You might like
phpQuery占用内存过多的处理方法
2013/11/13 PHP
PHP四舍五入精确小数位及取整
2014/01/14 PHP
php通过array_shift()函数移除数组第一个元素的方法
2015/03/18 PHP
php 判断字符串编码是utf-8 或gb2312实例
2016/11/01 PHP
jQuery 获取对象 根据属性、内容匹配, 还有表单元素匹配
2010/05/31 Javascript
javascript 学习笔记(六)浏览器类型及版本信息检测代码
2011/04/08 Javascript
EXTJS记事本 当CompositeField遇上RowEditor
2011/07/31 Javascript
js验证模型自我实现的具体方法
2013/06/21 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
2014/04/12 Javascript
JavaScript检查某个function是否是原生代码的方法
2014/08/20 Javascript
JavaScript面向对象之私有静态变量实例分析
2016/01/14 Javascript
JavaScript必知必会(五) eval 的使用
2016/06/08 Javascript
JavaScript实现多栏目切换效果
2016/12/12 Javascript
vue组件实例解析
2017/01/10 Javascript
原生JS获取元素的位置与尺寸实现方法
2017/10/18 Javascript
JS声明对象时属性名加引号与不加引号的问题及解决方法
2018/02/16 Javascript
Node.js使用cookie保持登录的方法
2018/05/11 Javascript
layui在form表单页面通过Validform加入简单验证的方法
2019/09/06 Javascript
vue 实现走马灯效果
2019/10/28 Javascript
Jquery属性的获取/设置及样式添加/删除操作技巧分析
2019/12/23 jQuery
JavaScript 常见的继承方式汇总
2020/09/17 Javascript
Django自定义分页与bootstrap分页结合
2021/02/22 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
2018/05/24 Python
pandas删除指定行详解
2019/04/04 Python
django ManyToManyField多对多关系的实例详解
2019/08/09 Python
python实现的多任务版udp聊天器功能案例
2019/11/13 Python
Python求解正态分布置信区间教程
2019/11/20 Python
如何基于Python + requests实现发送HTTP请求
2020/01/13 Python
Python优秀开源项目Rich源码解析的流程分析
2020/07/06 Python
超30万乐谱下载:Musicnotes.com
2016/09/24 全球购物
企业党员一句话承诺
2014/05/30 职场文书
张丽莉事迹观后感
2015/06/16 职场文书
2015年小学师德师风建设工作总结
2015/10/23 职场文书
小公司融资,商业计划书的8切记
2019/07/15 职场文书
Go中的条件语句Switch示例详解
2021/08/23 Golang
剧场版《转生恶役只好拔除破灭旗标》公开最新视觉图 2023年上映
2022/04/02 日漫