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 相关文章推荐
js弹出层包含flash 不能关闭隐藏的2种处理方法
Jun 17 Javascript
javascript实现复选框选中属性
Mar 25 Javascript
JQuery插入DOM节点的方法
Jun 11 Javascript
js实现具有高亮显示效果的多级菜单代码
Sep 01 Javascript
Web开发必知Javascript技巧大全
Feb 23 Javascript
jQuery ztree实现动态树形多选菜单
Aug 12 Javascript
jQuery Easyui加载表格出错时在表格中间显示自定义的提示内容
Dec 08 Javascript
AngularJS基于ngInfiniteScroll实现下拉滚动加载的方法
Dec 14 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
Dec 26 Javascript
微信小程序 引入es6 promise
Apr 12 Javascript
JavaScript创建表格的方法
Apr 13 Javascript
微信小程序自定义modal弹窗组件的方法详解
Dec 20 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
乱谈我对耳机、音箱的感受
2021/03/02 无线电
php获取通过http协议post提交过来xml数据及解析xml
2012/12/16 PHP
IIS+fastcgi下PHP运行超时问题的解决办法详解
2013/06/20 PHP
php制作unicode解码工具(unicode编码转换器)代码分享
2013/12/24 PHP
PHP 5.3新增魔术方法__invoke概述
2014/07/23 PHP
PHP与服务器文件系统的简单交互
2016/10/21 PHP
php获取微信openid方法总结
2019/10/10 PHP
用JavaScript对JSON进行模式匹配(Part 1-设计)
2010/07/17 Javascript
Dom与浏览器兼容性说明
2010/10/25 Javascript
Javascript下判断是否为闰年的Datetime包
2010/10/26 Javascript
js中获取事件对象的方法小结
2011/03/13 Javascript
JS 精确统计网站访问量的实例代码
2013/07/05 Javascript
jquery制作弹窗提示窗口代码分享
2014/03/02 Javascript
如何获取网站icon有哪些可行的方法
2014/06/05 Javascript
使用JavaScript进行进制转换将字符串转换为十进制
2014/09/21 Javascript
什么是JavaScript注入攻击?
2016/09/14 Javascript
详解js动态获取浏览器或页面等容器的宽高
2019/03/13 Javascript
基于vue 动态菜单 刷新空白问题的解决
2020/08/06 Javascript
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
python3.3实现乘法表示例
2014/02/07 Python
python 实时得到cpu和内存的使用情况方法
2018/06/11 Python
python爬虫租房信息在地图上显示的方法
2019/05/13 Python
python实现五子棋小程序
2019/06/18 Python
PyQt QCombobox设置行高的方法
2019/06/20 Python
python数据分析工具之 matplotlib详解
2020/04/09 Python
python利用pytesseract 实现本地识别图片文字
2020/12/14 Python
thinkphp5 路由分发原理
2021/03/18 PHP
幼师岗位求职简历的自荐信格式
2013/09/21 职场文书
大学生饮食连锁店创业计划书
2014/01/17 职场文书
便利店投资创业计划书
2014/02/08 职场文书
2014年公司植树节活动方案
2014/03/04 职场文书
办公室员工岗位工作职责
2014/03/10 职场文书
公务员检讨书
2014/11/01 职场文书
学雷锋感言
2015/08/03 职场文书
Django中的JWT身份验证的实现
2021/05/07 Python
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
2021/05/25 Python