VUE中setTimeout和setInterval自动销毁案例


Posted in Javascript onSeptember 07, 2020

在Vue的大型单页应用中,在某个路由下,经常会出现需要延迟执行(setTimeout)或者间隔之心(setInterval)的函数,但是每次在页面destroy之前,都必须手动清理掉。

正常代码如下:

beforeDestroy() {
  this._timer && clearTimeout(this._timer);
}

但是如果一不小心,就会忘记,会造成意想不到的情况,那么有什么办法能避免这种情况吗?

当然有,那就是重新写一个setTimeout的方法(或者干脆劫持window.setTimeout)。

var _pageTimer = []; 
Vue.prototype.setTimeout = (fn, time) => {
  let handler = window.setTimeout(fn, time);
  _pageTimer.push(handler);
  
  return handler;
}

在路由层面,当每次页面变更时,执行清理工作:

router.beforeEach((to, from, next) => { _pageTimer.map(handler => { window.clearTimeout(handler); }) })

再页面使用时,调用Vue的setTimeout,这样是不是方便多了呢? setInterval也是一样的。

该方法还适用于对于页面异步请求的ajax处理,可以通过获取ajax的handler,在切面切换时,调用handler.abort() 取消请求,避免对服务器资源的不必要的压力。

补充知识:在vue中使用 setTimeout ,退出页面后,计时器没有销毁

问题:页面在使用 setTimeout 定时循环某方法,或者在两个页面之间跳转时间小于定时器的时间间隔时,定时器还在运行。

原因:当我们刷新页面时,会将当前页面之前创建的 setTimeout 以及其他定时器都清除掉,但是仅仅是路由切换是不会清除的。

data (){
 return{
 clearTime: ''
 }
},
mounted () {
 randomGet () {
 // 在 1分钟到 2分钟之间 不定时执行
   var r = Math.random() * (2 - 1) + 1
   var t = Math.ceil(r * 60000)
   // console.log(t)
   this.clearTime = setTimeout(() => {
    this.submit()
    this.randomGet()
   }, t)
  },
  submit () {
   console.log('aaaa')
  }
},
destroyed () {
 clearTimeout(this.clearTime) // 清除
}

以上这篇VUE中setTimeout和setInterval自动销毁案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
理解Javascript_07_理解instanceof实现原理
Oct 15 Javascript
StringTemplate遇见jQuery冲突的解决方法
Sep 22 Javascript
自己动手实现jQuery Callbacks完整功能代码详解
Nov 25 Javascript
javascript中全局对象的parseInt()方法使用介绍
Dec 19 Javascript
JS禁用页面上所有控件的实现方法(附demo源码下载)
Dec 17 Javascript
JS模拟按钮点击功能的方法
Dec 22 Javascript
jQuery绑定事件的几种实现方式
May 09 Javascript
D3.js中强制异步文件读取同步的几种方法
Feb 06 Javascript
完美实现js选项卡切换效果(一)
Mar 08 Javascript
jQuery Validate表单验证插件实现代码
Jun 08 jQuery
JavaScript复制内容到剪贴板的两种常用方法
Feb 27 Javascript
用Javascript实现发送短信验证码间隔功能
Feb 08 Javascript
vue a标签点击实现赋值方式
Sep 07 #Javascript
JavaScript实现多球运动效果
Sep 07 #Javascript
JavaScript实现世界各地时间显示
Sep 07 #Javascript
VUE UPLOAD 通过ACTION返回上传结果操作
Sep 07 #Javascript
vue中element 的upload组件发送请求给后端操作
Sep 07 #Javascript
vue-simple-uploader上传成功之后的response获取代码
Sep 07 #Javascript
Vue.js暴露方法给WebView的使用操作
Sep 07 #Javascript
You might like
php addslashes及其他清除空格的方法是不安全的
2012/01/25 PHP
php使用curl检测网页是否被百度收录的示例分享
2014/01/31 PHP
jQuery 跨域访问解决原理案例详解
2016/07/09 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
VUE中v-model和v-for指令详解
2017/06/23 Javascript
使用Node.js实现简易MVC框架的方法
2017/08/07 Javascript
JS实现的简单表单验证功能示例
2017/10/13 Javascript
详解element-ui中form验证杂记
2019/03/04 Javascript
在 Vue 应用中使用 Netlify 表单功能的方法详解
2019/06/03 Javascript
Python中字符串的处理技巧分享
2016/09/17 Python
Python基础教程之浅拷贝和深拷贝实例详解
2017/07/15 Python
Python 中字符串拼接的多种方法
2018/07/30 Python
Python列表切片操作实例总结
2019/02/19 Python
pymysql模块的操作实例
2019/12/17 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
2020/04/13 Python
PyCharm最新激活码(2020/10/27全网最新)
2020/10/27 Python
Python+unittest+DDT实现数据驱动测试
2020/11/30 Python
Python 中如何使用 virtualenv 管理虚拟环境
2021/01/21 Python
Python datetime模块的使用示例
2021/02/02 Python
HTML5视频播放插件 video.js介绍
2018/09/29 HTML / CSS
Canvas图片分割效果的实现
2019/07/29 HTML / CSS
英国领先的男装设计师服装购物网站:Mainline Menswear
2018/02/04 全球购物
MYPROTEIN澳大利亚官方网站:欧洲运动营养品牌
2019/06/26 全球购物
豪华床上用品 :Jennifer Adams
2019/09/15 全球购物
Shop Apotheke瑞士:您的健康与美容网上商店
2019/10/09 全球购物
优秀学生干部个人的自我评价
2013/10/04 职场文书
岗位职责范本
2013/11/23 职场文书
售后专员岗位职责
2013/12/08 职场文书
班班通项目实施方案
2014/02/25 职场文书
银行主办会计岗位职责
2014/08/13 职场文书
社区两委对照检查材料
2014/08/23 职场文书
2014年国庆节演讲稿
2014/09/02 职场文书
2015年教师新年寄语
2014/12/08 职场文书
初中成绩单评语
2014/12/29 职场文书
趣味运动会开幕词
2015/01/28 职场文书
幼儿园托班开学寄语(2015秋季)
2015/05/27 职场文书