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网页侧边随页面滚动广告效果实现
Apr 14 Javascript
js超时调用setTimeout和间歇调用setInterval实例分析
Jan 28 Javascript
详解JavaScript中void语句的使用
Jun 04 Javascript
JS实现带鼠标效果的头像及文章列表代码
Sep 27 Javascript
关于JS变量和作用域详解
Jul 28 Javascript
jquery实现图片轮播器
May 23 jQuery
Vue实现类似Spring官网图片滑动效果方法
Mar 01 Javascript
JavaScript实现的联动菜单特效示例
Jul 08 Javascript
Vue全局loading及错误提示的思路与实现
Aug 09 Javascript
解决layer弹出层中表单不起作用的问题
Sep 09 Javascript
Vue开发环境跨域访问问题
Jan 22 Javascript
Node登录权限验证token验证实现的方法示例
May 25 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
在Zeus Web Server中安装PHP语言支持
2006/10/09 PHP
一个显示天气预报的程序
2006/10/09 PHP
destoon实现调用热门关键字的方法
2014/07/15 PHP
php实现登陆模块功能示例
2016/10/20 PHP
PHPCMS忘记后台密码的解决办法
2016/10/30 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
PHP队列场景以及实现代码实例详解
2021/02/26 PHP
实例:尽可能写友好的Javascript代码
2006/10/09 Javascript
使用JQuery库提供的扩展功能实现自定义方法
2014/09/09 Javascript
jquery制作漂亮的弹出层提示消息特效
2014/12/23 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
javascript中数组方法汇总
2015/07/07 Javascript
js按条件生成随机json:randomjson实现方法
2017/04/07 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
2018/04/12 Javascript
JavaScript创建对象方法实例小结
2018/09/03 Javascript
微信小程序实现点击效果
2019/06/21 Javascript
小程序实现搜索框
2020/06/19 Javascript
JavaScript数值类型知识汇总
2019/11/17 Javascript
封装Vue Element的table表格组件的示例详解
2020/08/19 Javascript
vue 获取url参数、get参数返回数组的操作
2020/11/12 Javascript
使用python调用zxing库生成二维码图片详解
2017/01/10 Python
Python中生成Epoch的方法
2017/04/26 Python
详解python 拆包可迭代数据如tuple, list
2017/12/29 Python
基于python神经卷积网络的人脸识别
2018/05/24 Python
Python之list对应元素求和的方法
2018/06/28 Python
[原创]Python入门教程5. 字典基本操作【定义、运算、常用函数】
2018/11/01 Python
Django REST framework 单元测试实例解析
2019/11/07 Python
Python学习之路之pycharm的第一个项目搭建过程
2020/06/18 Python
Django和Ueditor自定义存储上传文件的文件名
2021/02/25 Python
大学生学习2014全国两会心得体会
2014/03/13 职场文书
我的理想演讲稿
2014/04/30 职场文书
中国梦演讲稿范文
2014/08/28 职场文书
颐和园导游词400字
2015/01/30 职场文书
外出培训学习心得体会
2016/01/18 职场文书
matlab xlabel位置的设置方式
2021/05/21 Python