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图片不完全按比例自动缩小的简单代码
Jul 29 Javascript
JQuery创建DOM节点的方法
Jun 11 Javascript
js中javascript:void(0) 真正含义
Nov 05 Javascript
浅谈 Vue v-model指令的实现原理
Jun 08 Javascript
Angularjs 事件指令详细整理
Jul 27 Javascript
分享5个顶级的JavaScript Ajax组件库
Sep 16 Javascript
JS中的算法与数据结构之二叉查找树(Binary Sort Tree)实例详解
Aug 16 Javascript
vue之debounce属性被移除及处理详解
Nov 13 Javascript
JavaScript 中的无穷数(Infinity)详解
Feb 13 Javascript
JavaScript运动原理基础知识详解
Apr 02 Javascript
Ajax是什么?Ajax高级用法之Axios技术
Apr 21 Javascript
vue实现可拖拽的dialog弹框
May 13 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实现图片添加水印功能
2014/02/13 PHP
ThinkPHP中自定义错误页面和提示页面实例
2014/11/22 PHP
ecshop后台编辑器替换成ueditor编辑器
2015/03/03 PHP
Eclipse PHPEclipse 配置的具体步骤
2017/08/08 PHP
Laravel+Intervention实现上传图片功能示例
2019/07/09 PHP
js 加载并解析XML字符串的代码
2009/12/13 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
2013/04/01 Javascript
JavaScript中创建对象和继承示例解读
2014/02/12 Javascript
网站繁简切换的JS遇到页面卡死的解决方法
2014/03/12 Javascript
jquery实现一个简单好用的弹出框
2014/09/26 Javascript
jquery获取radio值实例
2014/10/16 Javascript
JavaScript中split() 使用方法汇总
2015/04/17 Javascript
整理Javascript函数学习笔记
2015/12/01 Javascript
微信小程序 swiper组件轮播图详解及实例
2016/11/16 Javascript
JS根据生日月份和日期计算星座的简单实现方法
2016/11/24 Javascript
JS扩展类,克隆对象与混合类实例分析
2016/11/26 Javascript
React组件生命周期详解
2017/07/03 Javascript
jQuery简单实现对数组去重及排序操作实例
2017/10/31 jQuery
JavaScript实现写入文件到本地的方法【基于FileSaver.js插件】
2018/03/15 Javascript
vue非父子组件通信问题及解决方法
2018/06/11 Javascript
angularjs 的数据绑定实现原理
2018/07/02 Javascript
详解微信小程序获取当前时间及日期的方法
2019/04/28 Javascript
Vue Extends 扩展选项用法完整实例
2019/09/17 Javascript
在vue中把含有html标签转为html渲染页面的实例
2019/10/28 Javascript
node.js中事件触发器events的使用方法实例分析
2019/11/23 Javascript
原生js无缝轮播插件使用详解
2020/03/09 Javascript
Python的ORM框架SQLAlchemy入门教程
2014/04/28 Python
Python爬豆瓣电影实例
2018/02/23 Python
django中静态文件配置static的方法
2018/05/20 Python
屈臣氏泰国官网:Watsons TH
2021/02/23 全球购物
《金孔雀轻轻跳》教学反思
2014/04/20 职场文书
党员批评与自我批评总结
2014/10/15 职场文书
端午节活动总结报告
2015/02/11 职场文书
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
2021/05/21 Redis
《仙剑客栈2》第一弹正式宣传片公开 年内发售
2022/04/07 其他游戏
vue特效之翻牌动画
2022/04/20 Vue.js