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 相关文章推荐
event对象的方法 兼容多浏览器
Jun 27 Javascript
jQuery 源码分析笔记(4) Ready函数
Jun 02 Javascript
node在两个div之间移动,用ztree实现
Mar 06 Javascript
Jquery实现搜索框提示功能示例代码
Aug 13 Javascript
javascript阻止浏览器后退事件防止误操作清空表单
Nov 22 Javascript
jquery实现的导航固定效果
Apr 28 Javascript
黑帽seo劫持程序,js劫持搜索引擎代码
Sep 15 Javascript
jquery判断input值不为空的方法
Jun 05 Javascript
详解JS中遍历语法的比较
Apr 07 Javascript
微信小程序日历组件calendar详解及实例
Jun 08 Javascript
67 个节约开发时间的前端开发者的工具、库和资源
Sep 12 Javascript
JS实现面向对象继承的5种方式分析
Jul 21 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 中英文混合排版中处理字符串常用的函数
2007/04/12 PHP
PHP extract 将数组拆分成多个变量的函数
2010/06/30 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
2014/11/03 PHP
PHP实现自动识别Restful API的返回内容类型
2015/02/07 PHP
Laravel 5框架学习之表单
2015/04/08 PHP
PHP实现操作redis的封装类完整实例
2015/11/14 PHP
Yii rules常用规则示例
2016/03/15 PHP
php 输入输出流详解及示例代码
2016/08/25 PHP
php解析base64数据生成图片的方法
2016/12/06 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/01/13 Javascript
javascript事件模型代码
2007/07/01 Javascript
jQuery实现响应浏览器缩放大小并改变背景颜色
2014/10/31 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
2015/06/09 Javascript
jQuery+HTML5实现图片上传前预览效果
2015/08/20 Javascript
分享有关jQuery中animate、slide、fade等动画的连续触发、滞后反复执行的bug
2016/01/10 Javascript
ReactNative页面跳转Navigator实现的示例代码
2017/08/02 Javascript
jQuery动态添加li标签并添加属性和绑定事件方法
2018/02/24 jQuery
深入解析Vue源码实例挂载与编译流程实现思路详解
2019/05/05 Javascript
bootstrap Table实现合并相同行
2019/07/19 Javascript
微信小程序 WXML节点信息查询详解
2019/07/29 Javascript
weui上传多图片,压缩,base64编码的示例代码
2020/06/22 Javascript
JavaScript实现拖拽和缩放效果
2020/08/24 Javascript
给Python的Django框架下搭建的BLOG添加RSS功能的教程
2015/04/08 Python
python单元测试unittest实例详解
2015/05/11 Python
详解Python编程中time模块的使用
2015/11/20 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
TensorFlow设置日志级别的几种方式小结
2020/02/04 Python
基于打开pycharm有带图片md文件卡死问题的解决
2020/04/24 Python
Python如何在bool函数中取值
2020/09/21 Python
小结Python的反射机制
2020/09/28 Python
加大码胸罩、内裤和服装:Just My Size
2019/03/21 全球购物
销售自荐信
2013/10/22 职场文书
快餐店的创业计划书范文
2014/01/29 职场文书
大三学生英语考试作弊检讨书
2015/01/01 职场文书
Java实现二维数组和稀疏数组之间的转换
2021/06/27 Java/Android
JavaScript异步操作中串行和并行
2021/11/20 Javascript