解决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 相关文章推荐
js实现鼠标移到链接文字弹出一个提示层的方法
May 11 Javascript
javascript实现3D变换的立体圆圈实例
Aug 06 Javascript
基于socket.io+express实现多房间聊天
Mar 17 Javascript
Javascript中内建函数reduce的应用详解
Oct 20 Javascript
node.js中grunt和gulp的区别详解
Jul 17 Javascript
Angular在模板驱动表单中自定义校验器的方法
Aug 09 Javascript
jQuery中ajax请求后台返回json数据并渲染HTML的方法
Aug 08 jQuery
element-ui表格列金额显示两位小数的方法
Aug 24 Javascript
vue自定义指令用法经典实例小结
Mar 16 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
Apr 26 Javascript
详细讲解如何创建, 发布自己的 Vue UI 组件库
May 29 Javascript
element-ui 中使用upload多文件上传只请求一次接口
Jul 19 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
解析dedeCMS验证码的实现代码
2013/06/07 PHP
php关联数组快速排序的方法
2015/04/17 PHP
php微信公众平台交互与接口详解
2016/11/28 PHP
PHP处理bmp格式图片的方法分析
2017/07/04 PHP
PHP crc32()函数讲解
2019/02/14 PHP
PHP连接SQL server数据库测试脚本运行实例
2020/08/24 PHP
Prototype使用指南之string.js
2007/01/10 Javascript
javascript常见用法总结
2014/05/22 Javascript
jquery进行数组遍历如何跳出当前的each循环
2014/06/05 Javascript
JavaScript中number转换成string介绍
2014/12/31 Javascript
举例讲解JavaScript中关于对象操作的相关知识
2015/11/16 Javascript
jQuery为动态生成的select元素添加事件的方法
2016/08/29 Javascript
jQuery中的一些小技巧
2017/01/18 Javascript
Bootstrap多级菜单的实现代码
2017/05/23 Javascript
用React-Native+Mobx做一个迷你水果商城APP(附源码)
2017/12/25 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
2018/05/04 Javascript
Vue表情输入组件 微信face表情组件
2019/02/11 Javascript
ES6 let和const定义变量与常量的应用实例分析
2019/06/27 Javascript
node.js通过url读取文件
2020/10/16 Javascript
原生JavaScript实现贪吃蛇游戏
2020/11/04 Javascript
[54:09]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
python 域名分析工具实现代码
2009/07/15 Python
python实现的简单抽奖系统实例
2015/05/22 Python
python使用筛选法计算小于给定数字的所有素数
2018/03/19 Python
Python中list查询及所需时间计算操作示例
2018/06/21 Python
python 实现list或string按指定分段
2019/12/25 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
css3学习系列之移动属性详解
2017/07/04 HTML / CSS
中文系师范生自荐信
2013/10/01 职场文书
初三新学期计划书
2014/05/03 职场文书
个人收入证明模板
2014/09/18 职场文书
欢迎家长标语
2014/10/08 职场文书
购房个人委托书范本
2014/10/11 职场文书
工伤事故赔偿协议书
2014/10/27 职场文书
JavaScript 原型与原型链详情
2021/11/02 Javascript
浅谈JavaScript作用域
2021/12/06 Javascript