解决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中的原型和继承详解(图文)
Jul 18 Javascript
jquery获取radio值实例
Oct 16 Javascript
Javascript实现获取窗口的大小和位置代码分享
Dec 04 Javascript
手机端实现Bootstrap简单图片轮播效果
Oct 13 Javascript
AngularJS入门教程之数据绑定原理详解
Nov 02 Javascript
AngularJs表单验证实例代码解析
Nov 29 Javascript
详解JavaScript中js对象与JSON格式字符串的相互转换
Feb 14 Javascript
详解vue-cli下ESlint 配置说明
Sep 03 Javascript
element vue Array数组和Map对象的添加与删除操作
Nov 14 Javascript
Vue 进阶之路(三)
Apr 18 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
May 14 Javascript
使用layui 的layedit定义自己的toolbar方法
Sep 18 Javascript
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 UTF8 文件的签名问题
2009/10/30 PHP
基于php缓存的详解
2013/05/15 PHP
深入Memcache的Session数据的多服务器共享详解
2013/06/13 PHP
解析phpstorm + xdebug 远程断点调试
2013/06/20 PHP
PHP中isset()和unset()函数的用法小结
2014/03/11 PHP
PHP Include文件实例讲解
2019/02/15 PHP
用Javascript 和 CSS 实现脚注(Footnote)效果
2009/09/09 Javascript
JQuery给元素添加/删除节点比如select
2013/04/02 Javascript
JavaScript定时器详解及实例
2013/08/01 Javascript
输入自动提示搜索提示功能的javascript:sugggestion.js
2013/09/02 Javascript
js动态添加onclick事件可传参数与不传参数
2014/07/29 Javascript
JavaScript实现动态创建CSS样式规则方案
2014/09/06 Javascript
浅谈JavaScript中的Math.atan()方法的使用
2015/06/14 Javascript
浅谈Javascript数组的使用
2015/07/29 Javascript
JS实现选择TextArea内文本的方法
2015/08/03 Javascript
阻止表单提交按钮多次提交的完美解决方法
2016/05/16 Javascript
仿百度换肤功能的简单实例代码
2016/07/11 Javascript
一篇文章搞定JavaScript类型转换(面试常见)
2017/01/21 Javascript
jQuery中clone()函数实现表单中增加和减少输入项
2017/05/13 jQuery
angular2+node.js express打包部署的实战
2017/07/27 Javascript
JS/jQuery实现简单的开关灯效果【案例】
2019/02/19 jQuery
微信小程序进入广告实现代码实例
2019/09/19 Javascript
vue 解除鼠标的监听事件的方法
2019/11/13 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
2020/02/17 Javascript
jQuery实现动态操作table行
2020/11/23 jQuery
python多重继承新算法C3介绍
2014/09/28 Python
Python 转换文本编码实现解析
2019/08/27 Python
python设置随机种子实例讲解
2019/09/12 Python
关于tf.reverse_sequence()简述
2020/01/20 Python
ZWILLING双立人英国网上商店:德国刀具锅具厨具品牌
2018/05/15 全球购物
西部世纪面试题
2014/12/05 面试题
教师工作总结范文2014
2014/11/10 职场文书
2015年助残日活动总结
2015/03/27 职场文书
行政处罚事先告知书
2015/07/01 职场文书
社区宣传标语口号
2015/12/26 职场文书
springboot创建的web项目整合Quartz框架的项目实践
2022/06/21 Java/Android