解决vue 使用setTimeout,离开当前路由setTimeout未销毁的问题


Posted in Javascript onJuly 21, 2020

问题:

从第一个页面跳转到第二个页面后,如果停留在第二个页面,定时器还在运行。如果在两个页面之间来回跳转,跳转时间小于定时器的间隔时间时,也会出现重复创建setTimeout的情况。

原因:

当我们刷新页面时,会将当前页面之前创建的setTimeout以及其他定时器都清除掉,但是仅仅是路由切换是不会清除的。

data () {
  return {
   ct: null
  }
},
methods: {
 start() {
 this.ct= setTimeout( () => {that.countdown(end)}, 1000)
 }
 end() {
 clearTimeout(this.ct); //清除
 }
}

setInterval()计时也需要clearInterval()来清除

补充知识:小记VUE下setTimeOut和setInterval遇到的问题

相信大家对着两个函数都陌生,就是一个定时器,setTimeOut只执行一次,而setInterval会重复执行

需要注意的是:在setInterval不用的时候一定要用clearSetInterval关闭定时器。

说一下最近开发中遇到的问题,我是用vue开发的,顺便记录这个错误。

我需要轮询接口,所以使用setInterval。

// 我是想没2秒执行一次myFunc这个函数。
setInterval(this.myFunc(),2000)
//某个函数
myFunc () {
  console.log(123)
}

但实际的运行结果是,只执行了一遍,并没有循环执行。

原因是setInterval接受两个参数,第一个为要执行的函数,第二个为时间(毫秒)。

这里我犯的错误是,我写的是一个函数的执行this.myFunc() 因为加了()是一个执行,而不是个函数。

于是我又改成这样写了,在写个匿名函数,函数体是我要执行的。

setInterval(function () {
 this.myFunc()
},2000)
//某个函数
myFunc () {
  console.log(123)
}

理论上这样是没问题的,会每2秒执行一次this.myFunc(),但却报错了。

原因是 老生常谈的javaScript 的this 的问题。

因为用的一个function(){} 这里的 独立的作用域 this指向了全局(这里是window)而且window里没有myFunc这个函数,所报了错。

用过vue的朋友应该,基本vue中都是this.XXX这样写。这里的this是Vue对象。

所以为了使this正确指向vue,我用了ES6的尖头函数。

最终

setInterval(() => {
 this.myFunc()
},2000)
//某个函数
myFunc () {
  console.log(123)
}

尖头函数因为它的特殊性,它的this指向它外层的对象。

其实主要说的是第二个问题,第一个属于对函数不熟悉,第二个则是VUE,ES6,this指向综合的问题。

以上这篇解决vue 使用setTimeout,离开当前路由setTimeout未销毁的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
window.location.hash 使用说明
Nov 08 Javascript
Eval and new funciton not the same thing
Dec 27 Javascript
javascript的tab切换原理与效果实现方法
Jan 10 Javascript
JavaScript实现的双向跨域插件分享
Jan 31 Javascript
在JS方法中返回多个值的方法汇总
May 20 Javascript
json的使用小结
Jun 08 Javascript
浅析JavaScript中命名空间namespace模式
Jun 22 Javascript
JavaScript观察者模式(publish/subscribe)原理与实现方法
Mar 30 Javascript
详解如何在Angular中快速定位DOM元素
May 17 Javascript
在vue项目中引入vue-beauty操作方法
Feb 11 Javascript
localstorage实现带过期时间的缓存功能
Jun 28 Javascript
浅谈Vue3.0新版API之composition-api入坑指南
Apr 30 Javascript
JavaScript undefined及null区别实例解析
Jul 21 #Javascript
Vue 解决父组件跳转子路由后当前导航active样式消失问题
Jul 21 #Javascript
Vue切换组件实现返回后不重置数据,保留历史设置操作
Jul 21 #Javascript
vue 实现tab切换保持数据状态
Jul 21 #Javascript
vue通过过滤器实现数据格式化
Jul 20 #Javascript
原生JavaScript写出Tabs标签页的实例代码
Jul 20 #Javascript
解决echarts 一条柱状图显示两个值,类似进度条的问题
Jul 20 #Javascript
You might like
PHP过滤★等特殊符号的正则
2014/01/27 PHP
phpMyAdmin自动登录和取消自动登录的配置方法
2014/05/12 PHP
php读取csv文件并输出的方法
2015/03/14 PHP
PHP构造二叉树算法示例
2017/06/21 PHP
在Ubuntu 18.04上安装PHP 7.3 7.2和7.0的方法
2019/04/09 PHP
jQuery:delegate中select()不起作用的解决方法(实例讲解)
2014/01/26 Javascript
jQuery实现炫酷的鼠标轨迹特效
2015/02/01 Javascript
JS截取字符串实例详解
2015/11/24 Javascript
JavaScript截取指定长度字符串点击可以展开全部代码
2015/12/04 Javascript
灵活的理解JavaScript中的this指向
2016/02/25 Javascript
如何检测JavaScript的各种类型
2016/07/30 Javascript
谈谈第三方App接入微信登录 解读
2016/12/27 Javascript
JavaScript算法教程之sku(库存量单位)详解
2017/06/29 Javascript
详解JavaScript中的六种错误类型
2017/09/21 Javascript
Vue+Element UI+vue-quill-editor富文本编辑器及插入图片自定义
2019/08/20 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
2020/09/18 Javascript
[01:02:07]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python计算已经过去多少个周末的方法
2015/07/25 Python
Python 数据结构之堆栈实例代码
2017/01/22 Python
python opencv实现任意角度的透视变换实例代码
2018/01/12 Python
python 实现在txt指定行追加文本的方法
2018/04/29 Python
学习python分支结构
2019/05/17 Python
Python调用系统命令os.system()和os.popen()的实现
2020/12/31 Python
美国奢侈品购物平台:Orchard Mile
2018/05/02 全球购物
allbeauty美国:英国在线美容店
2019/03/11 全球购物
Diptyque英国官方网站:源自法国的知名香氛品牌
2019/08/28 全球购物
茱莉蔻美国官网:Jurlique美国
2020/11/24 全球购物
司机岗位职责
2013/11/15 职场文书
幼儿园教师节演讲稿
2014/09/03 职场文书
2014七年级班主任工作总结
2014/12/05 职场文书
村干部任职承诺书
2015/01/21 职场文书
大学感恩节活动总结
2015/05/05 职场文书
煤矿施工安全协议书
2016/03/22 职场文书
涨工资申请书应该怎么写?
2019/07/08 职场文书
Python中22个万用公式的小结
2021/07/21 Python
idea以任意顺序debug多线程程序的具体用法
2021/08/30 Java/Android