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高级程序设计阅读笔记(六) ECMAScript中的运算符(二)
Feb 27 Javascript
javascript使用appendChild追加节点实例
Jan 12 Javascript
angularJS 入门基础
Feb 09 Javascript
BootStrap实用代码片段之一
Mar 22 Javascript
Javascript 实现计算器时间功能详解及实例(二)
Jan 08 Javascript
xmlplus组件设计系列之网格(DataGrid)(10)
May 05 Javascript
微信小程序日期时间选择器使用方法
Feb 01 Javascript
vue-cli 打包使用history模式的后端配置实例
Sep 20 Javascript
深入浅析js原型链和vue构造函数
Oct 25 Javascript
vue实现简单瀑布流布局
May 28 Javascript
vue 动态组件(component :is) 和 dom元素限制(is)用法说明
Sep 04 Javascript
JavaScript实现10秒后再次获取验证码
Dec 02 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+mysql实现简单登录注册修改密码网页
2016/11/30 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
CI框架(CodeIgniter)实现的数据库增删改查操作总结
2018/05/23 PHP
JS 动态获取节点代码innerHTML分析 [IE,FF]
2009/11/30 Javascript
通过jQuery源码学习javascript(三)
2012/12/27 Javascript
javascript自动改变文字大小和颜色的效果的小例子
2013/08/02 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
JavaScript数据类型之基本类型和引用类型的值
2015/04/01 Javascript
基于Vue.js实现简单搜索框
2020/03/26 Javascript
Jquery Easyui选项卡组件Tab使用详解(10)
2016/12/18 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
2018/02/22 Javascript
JavaScript闭包原理与用法实例分析
2018/08/10 Javascript
详解JavaScript 新语法之Class 的私有属性与私有方法
2019/04/23 Javascript
vue实现简单的日历效果
2020/09/24 Javascript
es6中使用map简化复杂条件判断操作实例详解
2020/02/19 Javascript
Vue组件通信$attrs、$listeners实现原理解析
2020/09/03 Javascript
Python写的贪吃蛇游戏例子
2014/06/16 Python
python中迭代器(iterator)用法实例分析
2015/04/29 Python
使用Python来开发Markdown脚本扩展的实例分享
2016/03/04 Python
深入探究Django中的Session与Cookie
2017/07/30 Python
python队列通信:rabbitMQ的使用(实例讲解)
2017/12/22 Python
python 简单照相机调用系统摄像头实现方法 pygame
2018/08/03 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
2020/03/23 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
2020/04/08 Python
python3.7+selenium模拟淘宝登录功能的实现
2020/05/26 Python
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
PatPat香港:婴童服饰和亲子全家装在线购物
2020/09/27 全球购物
.NET里面如何取得当前的屏幕分辨率
2012/12/06 面试题
销售自我评价
2013/10/22 职场文书
网上卖盒饭创业计划书
2014/01/26 职场文书
如何写好优秀的创业计划书
2014/01/30 职场文书
法制报告会主持词
2014/04/02 职场文书
高二学生评语大全
2014/04/25 职场文书
环境卫生倡议书
2014/08/29 职场文书
车间主任岗位职责范本
2015/04/08 职场文书
整改通知书格式
2015/04/22 职场文书