vue自定义指令导致的内存泄漏问题解决
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自定义指令导致的内存泄漏问题解决的更多相关文章
- vue自定义指令,比onerror更优雅的方式实现当图片加载失败时使用默认图,提供三种方法
首先,来看下效果图(演示一下图片正常加载与加载失败时的效果) 在线体验地址:https://hxkj.vip/demo/vueImgOnerror/ 一.常规方法解决 我们都知道,img标签支持one ...
- vue自定义指令要点
vue自定义指令的基础使用这里就不阐述,看官网文档:https://cn.vuejs.org/v2/guide/custom-directive.html 本文用一个实例描述自定义指令的要点,自定义一 ...
- vue自定义指令
Vue自定义指令: Vue.directive('myDr', function (el, binding) { el.onclick =function(){ binding.value(); } ...
- vue 自定义指令的使用案例
参考资料: 1. vue 自定义指令: 2. vue 自定义指令实现 v-loading: v-loading,是 element-ui 组件库中的一个用于数据加载过程中的过渡动画指令,项目中也很少需 ...
- vue自定义指令(Directive中的clickoutside.js)的理解
阅读目录 vue自定义指令clickoutside.js的理解 回到顶部 vue自定义指令clickoutside.js的理解 vue自定义指令请看如下博客: vue自定义指令 一般在需要 DOM 操 ...
- 使用block的时候,导致的内存泄漏
明确,只要在block里边用到我们自己的东西,成员变量,self之类的,我们都需要将其拿出来,把它做成弱指针以便之后进行释放. 在ZPShareViewController这个控制器中,由如下代码: ...
- Vue自定义指令报错:Failed to resolve directive: xxx
Vue自定义指令报错 Failed to resolve directive: modle 这个报错有2个原因: 1.指令单词拼错 2.Vue.directive() 这个方法没有写在 new Vue ...
- 精华阅读第 13 期 |常见的八种导致 APP 内存泄漏的问题
本期是移动开发精英俱乐部的第13期文章,都是以技术为主,所以这里就不过多的进行赘述了,我们直接看干货内容吧!本文系ITOM管理平台OneAPM整理. 实际项目中的MVVM(积木)模式–序章 导读:开篇 ...
- 在Activity中使用Thread导致的内存泄漏
https://github.com/bboyfeiyu/android-tech-frontier/tree/master/issue-7/%E5%9C%A8Activity%E4%B8%AD%E4 ...
随机推荐
- kvm虚拟化之virt-install
1. 常用参数 -n --name= 客户端虚拟机名称 -r --ram= 客户端虚拟机分配的内存 -u --uuid= 客户端UUID 默认不写时,系统会自动生成 --vcpus= 客户端的vcpu ...
- 一步一步实现kbmmw的httpsys使用https功能
kbmmw的httpsys的功能已经实现了好长时间,但是现在各个平台都要求使用https来提供服务. 今天一步一步来说一下如何使用kbmmw 的httpsys功能支持https. 首先为了获得证书,我 ...
- git merge origin master git merge origin/master区别
git merge origin master //将origin merge 到 master 上 git merge origin/master //将origin上的master分支 merge ...
- 大数据调度工具oozie详细介绍
背景 之前项目中的sqoop等离线数据迁移job都是利用shell脚本通过crontab进行定时执行,这样实现的话比较简单,但是随着多个job复杂度的提升,无论是协调工作还是任务监控都变得麻烦,我们选 ...
- com.mysql.jdbc.MysqlDataTruncation: Data truncation异常
Exception in thread "main" com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too l ...
- utf8mb4版本设置django
'OPTIONS':{ 'init_command':"SET sql_mode='STRICT_TRANS_TABLES'", 'charset':'utf8mb4',
- go mod 使用
go modules 是 golang 1.11 新加的特性.现在1.12 已经发布了,是时候用起来了.Modules官方定义为: 模块是相关Go包的集合.modules是源代码交换和版本控制的单元. ...
- O2O项目之一 环境搭配
技术栈:vue全家桶(使用nuxtjs:https://zh.nuxtjs.org/guide/installation ) + ssr + redis + mongodb + wabpack + ...
- Codechef July Challenge 2019 Snake and Apple Tree
费用流.把每个方格拆成 $T$ 个点,$t$ 时刻一个方格向周围四个方格的 $t + 1$ 的点连一条容量为 $1$ 费用为 $0$ 的边,向自身的 $t + 1$ 连一条容量为 $1$ 费用为该方格 ...
- [ARC064F] Rotated Palindromes
题意 给定一个整数N,请你求出有多少字符集为1到K之间整数的字符串,使得该字符串可以由一个长度为N的回文串循环移位后得到.所谓循环移位,就是把字符串的某个前缀(可以为空)移到字符串末尾,如" ...