解决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 相关文章推荐
Web Inspector:关于在 Sublime Text 中调试Js的介绍
Apr 18 Javascript
如何使Chrome控制台支持多行js模式——意外发现
Jun 13 Javascript
JavaScript中的getDay()方法使用详解
Jun 09 Javascript
学习JavaScript设计模式之迭代器模式
Jan 19 Javascript
jquery树形菜单效果的简单实例
Jun 06 Javascript
AngularJS基础 ng-switch 指令简单示例
Aug 03 Javascript
canvas实现爱心和彩虹雨效果
Mar 09 Javascript
xmlplus组件设计系列之图标(ICON)(1)
May 05 Javascript
js获取元素的偏移量offset简单方法(必看)
Jul 05 Javascript
jquery实现下拉菜单的手风琴效果
Jul 23 jQuery
微信小程序生成海报分享朋友圈的实现方法
May 06 Javascript
vue使用nprogress实现进度条
Dec 09 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 date与gmdate的获取日期的区别
2010/02/08 PHP
php简单生成一组与多组随机字符串的方法
2017/05/09 PHP
Laravel 框架控制器 Controller原理与用法实例分析
2020/04/14 PHP
jQuery ajax提交Form表单实例(附demo源码)
2016/04/06 Javascript
深入解析jQuery中Deferred的deferred.promise()方法
2016/05/03 Javascript
jQuery中get方法用法分析
2016/12/07 Javascript
jQuery实现联动下拉列表查询框
2017/01/04 Javascript
微信小程序开发之Tabbar实例详解
2017/01/09 Javascript
微信小程序wx.uploadfile 本地文件转base64的实现代码
2018/06/28 Javascript
微信小程序中换行空格(多个空格)写法详解
2018/07/10 Javascript
学习LayUI时自研的表单参数校验框架案例分析
2019/07/29 Javascript
layui 根据后台数据动态创建下拉框并同时默认选中的实例
2019/09/02 Javascript
Python里disconnect UDP套接字的方法
2015/04/23 Python
Python中join函数简单代码示例
2018/01/09 Python
Python 查找list中的某个元素的所有的下标方法
2018/06/27 Python
利用Python进行数据可视化常见的9种方法!超实用!
2018/07/11 Python
Selenium(Python web测试工具)基本用法详解
2018/08/10 Python
python通过tcp发送xml报文的方法
2018/12/28 Python
使用coverage统计python web项目代码覆盖率的方法详解
2019/08/05 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
2020/11/28 Python
html5 制作地图当前定位箭头的方法示例
2020/01/10 HTML / CSS
芬兰汽车配件商店:Autonvaraosat24
2017/01/30 全球购物
教育实习生的自我评价分享
2013/11/21 职场文书
计算机专业毕业生自我鉴定
2014/01/16 职场文书
优秀老师事迹材料
2014/02/05 职场文书
数控专业自荐书范文
2014/03/16 职场文书
共产党员公开承诺书
2014/03/25 职场文书
省级优秀班集体申报材料
2014/05/25 职场文书
2014年幼儿园老师工作总结
2014/12/05 职场文书
戒赌保证书
2015/05/11 职场文书
集结号观后感
2015/06/08 职场文书
高中班主任培训心得体会
2016/01/07 职场文书
2016民族团结先进个人事迹材料
2016/02/26 职场文书
2019年新郎保证书3篇
2019/10/17 职场文书
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
2021/04/12 Python
Linux系统下MySQL配置主从分离的步骤
2022/03/21 MySQL