解决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 addBookmark 加入收藏 多浏览器兼容
Aug 15 Javascript
javascript实现div的显示和隐藏的小例子
Jun 25 Javascript
浏览器打开层自动缓慢展开收缩实例代码
Jul 04 Javascript
JS实现闪动的title消息提醒效果
Jun 20 Javascript
详谈javascript中的cookie
Jun 03 Javascript
vue.js入门教程之基础语法小结
Sep 01 Javascript
JS实现的简易拖放效果示例
Dec 29 Javascript
vue 自定义 select内置组件
Apr 10 Javascript
mpvue中使用flyjs全局拦截的实现代码
Sep 13 Javascript
基于vue+axios+lrz.js微信端图片压缩上传方法
Jun 25 Javascript
javascript 原型与原型链的理解及应用实例分析
Feb 10 Javascript
基于JQuery实现页面定时弹出广告
May 08 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
解析PHP自带的进位制之间的转换函数
2013/06/08 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
PHP代码实现表单数据验证类
2015/07/28 PHP
PHP根据session与cookie用户登录状态操作类的代码
2016/05/13 PHP
轻松掌握php设计模式之访问者模式
2016/09/23 PHP
Laravel框架实现redis集群的方法分析
2017/09/14 PHP
jQuery 学习入门篇附实例代码
2010/03/16 Javascript
jQuery的Ajax时无响应数据的解决方法
2010/05/25 Javascript
单击和双击事件的冲突处理示例代码
2014/04/03 Javascript
nodejs实现的一个简单聊天室功能分享
2014/12/06 NodeJs
javascript实现简单的鼠标拖动效果实例
2015/04/10 Javascript
javascript计时器编写过程与实现方法
2016/02/29 Javascript
微信小程序 使用canvas制作K线实例详解
2017/01/12 Javascript
写一个移动端惯性滑动&回弹Vue导航栏组件 ly-tab
2018/03/06 Javascript
express默认日志组件morgan的方法
2018/04/05 Javascript
vue自定义组件实现双向绑定
2021/01/13 Vue.js
[03:48]大碗DOTA
2019/07/25 DOTA
[47:31]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.12
2020/12/16 DOTA
python 实现单通道转3通道
2019/12/03 Python
用python3读取python2的pickle数据方式
2019/12/25 Python
Python中Yield的基本用法
2020/10/18 Python
Python xlwings插入Excel图片的实现方法
2021/02/26 Python
button在IE6/7下的黑边去除方案
2012/12/24 HTML / CSS
5个你不知道的HTML5的接口介绍
2013/08/07 HTML / CSS
HTML5页面无缝闪开的问题及解决方案
2020/06/11 HTML / CSS
工程师自我评价怎么写
2013/09/19 职场文书
儿子婚宴答谢词
2014/01/09 职场文书
班级德育工作实施方案
2014/02/21 职场文书
解除劳动合同协议书
2014/09/17 职场文书
夫妻房产协议书的格式
2014/10/11 职场文书
2014年售票员工作总结
2014/11/19 职场文书
2014年市场部工作总结
2014/11/25 职场文书
Python实现简繁体转换
2021/06/07 Python
Java spring单点登录系统
2021/09/04 Java/Android
《仙剑客栈2》第一弹正式宣传片公开 年内发售
2022/04/07 其他游戏
HTML实现仿Windows桌面主题特效的实现
2022/06/28 HTML / CSS