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里使用Dom操作Xml
Sep 20 Javascript
Javascript 按位取反运算符 (~)
Feb 04 Javascript
jquery中的$(document).ready()使用小结
Feb 14 Javascript
一个不错的字符串转码解码函数(自写)
Jul 31 Javascript
js实现鼠标感应向下滑动隐藏菜单的方法
Feb 20 Javascript
简介JavaScript中valueOf()方法的使用
Jun 05 Javascript
vue项目中用cdn优化的方法
Jan 03 Javascript
Vue中的slot使用插槽分发内容的方法
Mar 01 Javascript
layui表格内放置图片,并点击放大的实例
Sep 10 Javascript
对layui数据表格动态cols(字段)动态变化详解
Oct 25 Javascript
微信小程序实现canvas分享朋友圈海报
Jun 21 Javascript
JavaScript代码模拟鼠标自动点击事件示例
Aug 07 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
Zend公司全球首推PHP认证
2006/10/09 PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
2014/09/24 PHP
使用PHP编写发红包程序
2015/07/22 PHP
php实现遍历多维数组的方法
2015/11/25 PHP
PHP实现的蚂蚁爬杆路径算法代码
2015/12/03 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
2016/09/26 PHP
大家未必知道的Js技巧收藏
2008/04/07 Javascript
JavaScript 对话框和状态栏使用说明
2009/10/25 Javascript
原生javascript图片自动或手动切换示例附演示源码
2013/09/04 Javascript
JavaScript原型链示例分享
2014/01/26 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
Blocksit插件实现瀑布流数据无限( 异步)加载
2014/06/20 Javascript
javascript实现随机生成DIV背景色
2016/06/20 Javascript
js中json处理总结之JSON.parse
2016/10/14 Javascript
js中删除数组中的某一元素实例(无下标时)
2017/02/28 Javascript
在JS中如何把毫秒转换成规定的日期时间格式实例
2017/05/11 Javascript
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
2020/08/04 Javascript
Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
2013/12/04 Python
Python查看多台服务器进程的脚本分享
2014/06/11 Python
Python有序字典简单实现方法示例
2017/09/28 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
2018/08/25 Python
python获取依赖包和安装依赖包教程
2020/02/13 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
2020/04/03 Python
python之pygame模块实现飞机大战完整代码
2020/11/29 Python
anello泰国官方网站:日本流行包包品牌
2019/08/08 全球购物
万代美国官网:PREMIUM BANDAI USA
2020/09/11 全球购物
商业项目策划方案
2014/06/05 职场文书
车间安全生产标语
2014/06/06 职场文书
药品营销策划方案
2014/06/15 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
2015年电工工作总结
2015/04/10 职场文书
百年孤独读书笔记
2015/06/29 职场文书
幼儿园大班教师随笔
2015/08/14 职场文书
pytorch中的model.eval()和BN层的使用
2021/05/22 Python
vue3引入highlight.js进行代码高亮的方法实例
2022/04/08 Vue.js