解决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 相关文章推荐
利用js对象弹出一个层
Mar 26 Javascript
javascript比较文档位置
Apr 08 Javascript
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
Dec 27 Javascript
jquery图片延迟加载 前端开发技能必备系列
Jun 18 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
Feb 07 Javascript
JS中引用百度地图并将百度地图的logo和信息去掉
Sep 29 Javascript
JS获取select-option-text_value的方法
Dec 26 Javascript
director.js实现前端路由使用实例
Feb 03 Javascript
JavaScript中的Array 对象(数组对象)
Jun 02 Javascript
Angular2学习笔记——详解路由器模型(Router)
Dec 02 Javascript
jQuery如何跳转到另一个网页 就这么简单
Dec 28 Javascript
微信小程序实现左侧滑动导航栏
Apr 08 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
人族 Terran 基本策略
2020/03/14 星际争霸
mysql 性能的检查和优化方法
2009/06/21 PHP
数据库查询记录php 多行多列显示
2009/08/15 PHP
解析PHP中数组元素升序、降序以及重新排序的函数
2013/06/20 PHP
php删除左端与右端空格的方法
2014/11/29 PHP
php使用sql server验证连接数据库的方法
2014/12/25 PHP
php单例模式示例分享
2015/02/12 PHP
使用 PHPStorm 开发 Laravel
2015/03/24 PHP
PHP也能干大事之PHP中的编码解码详解
2015/04/20 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
2015/07/29 PHP
js window.open弹出新的网页窗口
2014/01/16 Javascript
学习JavaScript设计模式(策略模式)
2015/11/26 Javascript
利用jquery给指定的table动态添加一行、删除一行的方法
2016/10/12 Javascript
JS调用某段SQL语句的方法
2016/10/20 Javascript
vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法
2017/02/22 Javascript
微信小程序自定义底部弹出框
2020/11/16 Javascript
vue2过滤器模糊查询方法
2018/09/16 Javascript
js实现ATM机存取款功能
2020/10/27 Javascript
通过javascript实现段落的收缩与展开
2019/06/26 Javascript
用JS实现一个简单的打砖块游戏
2019/12/11 Javascript
Element Input输入框的使用方法
2020/07/26 Javascript
Python使用QQ邮箱发送Email的方法实例
2017/02/09 Python
Python实现的微信红包提醒功能示例
2019/08/22 Python
python中如何进行连乘计算
2020/05/28 Python
学习Python爬虫的几点建议
2020/08/05 Python
PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤详解
2020/11/02 Python
HTML5 使用 sessionStorage 进行页面传值的方法
2018/07/02 HTML / CSS
美国男士和女士奢侈品折扣手表购物网站:Certified Watch Store
2018/06/13 全球购物
英国在线药房和在线医生:LloydsPharmacy
2019/10/21 全球购物
Blue Nile中国官网:全球知名的钻石和珠宝网络零售商
2020/03/22 全球购物
C语言变量的命名规则都有哪些
2013/12/27 面试题
大学迎新生的欢迎词
2019/06/25 职场文书
分析Java中Map的遍历性能问题
2021/06/26 Java/Android
JavaScript 对象创建的3种方法
2021/11/17 Javascript
Python中的datetime包与time包包和模块详情
2022/02/28 Python
Vertica集成Apache Hudi重磅使用指南
2022/03/31 Servers