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 相关文章推荐
通过jquery的$.getJSON做一个跨域ajax请求试验
May 03 Javascript
jquery分页插件jpaginate在IE中不兼容问题
Apr 22 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
Sep 22 Javascript
jQuery Ajax()方法使用指南
Nov 19 Javascript
jquery中ready()函数执行的时机和window的load事件比较
Jun 22 Javascript
JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例
Jan 26 Javascript
微信小程序如何获取手机验证码
Nov 04 Javascript
弱类型语言javascript开发中的一些坑实例小结【变量、函数、数组、对象、作用域等】
Aug 07 Javascript
Vue的v-model的几种修饰符.lazy,.number和.trim的用法说明
Aug 05 Javascript
Vuejs通过拖动改变元素宽度实现自适应
Sep 02 Javascript
echarts饼图各个板块之间的空隙如何实现
Dec 01 Javascript
实用的 vue tags 创建缓存导航的过程实现
Dec 03 Vue.js
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模块部分功能的简单封装
2011/09/30 PHP
第二章 PHP入门基础之php代码写法
2011/12/30 PHP
解析PHP正则提取或替换img标记属性
2013/06/26 PHP
php实现模拟post请求用法实例
2015/07/11 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
php表单处理操作
2017/11/16 PHP
PHP观察者模式实例分析【对比JS观察者模式】
2019/05/22 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
CSS3画一个阴阳八卦图
2021/03/09 HTML / CSS
js模拟类继承小例子
2010/07/17 Javascript
8个超棒的学习 jQuery 的网站 推荐收藏
2011/04/02 Javascript
Jquery显示、隐藏元素以及添加删除样式
2013/08/09 Javascript
获取当前点击按钮的id用this.id实现
2014/03/17 Javascript
JQuery做的一个简单的点灯游戏分享
2014/07/16 Javascript
Javascript中String的常用方法实例分析
2015/06/13 Javascript
使用AngularJS编写较为优美的JavaScript代码指南
2015/06/19 Javascript
jQuery选择器及jquery案例详解(必看)
2016/05/20 Javascript
浅谈js常用内置方法和对象
2016/09/24 Javascript
ES6中module模块化开发实例浅析
2017/04/06 Javascript
javascript 中的继承实例详解
2017/05/05 Javascript
JavaScript方法_动力节点Java学院整理
2017/06/28 Javascript
ES6 javascript的异步操作实例详解
2017/10/30 Javascript
JavaScript设计模式之单例模式简单实例教程
2018/07/02 Javascript
python实现支持目录FTP上传下载文件的方法
2015/06/03 Python
运动检测ViBe算法python实现代码
2018/01/09 Python
解决Keras中CNN输入维度报错问题
2020/06/29 Python
Pycharm的Available Packages为空的解决方法
2020/09/18 Python
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS
美国紧身牛仔裤品牌:NYDJ
2017/05/24 全球购物
Groupon法国官方网站:特卖和网上购物高达-70%
2019/09/02 全球购物
大学生的网上创业计划书
2013/12/31 职场文书
环保建议书作文
2014/03/12 职场文书
2014年端午节演讲稿范文
2014/05/23 职场文书
解除劳动合同证明书模板
2014/11/20 职场文书
趣味运动会标语口号
2015/12/26 职场文书