解决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脚本复制网页上的一个表格的不错实现方法
Dec 29 Javascript
不错的JS中变量相关的细节分析
Aug 13 Javascript
xml和web特殊字符
Apr 28 Javascript
基于jquery跨浏览器显示的file上传控件
Oct 24 Javascript
鼠标滚轮控制网页横向移动实现思路
Mar 22 Javascript
Javascript基础 函数“重载” 详细介绍
Oct 25 Javascript
推荐一款jQuery插件模板
Jan 09 Javascript
JavaScript中return用法示例
Nov 29 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
Dec 13 Javascript
使用Vue-cli 3.0搭建Vue项目的方法
Jun 07 Javascript
示例vue 的keep-alive缓存功能的实现
Dec 13 Javascript
Electron-vue开发的客户端支付收款工具的实现
May 24 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
使用php4加速网络传输
2006/10/09 PHP
sphinx增量索引的一个问题
2011/06/14 PHP
浅析php过滤html字符串,防止SQL注入的方法
2013/07/02 PHP
如何在HTML 中嵌入 PHP 代码
2015/05/13 PHP
Nigma vs Liquid BO3 第一场2.14
2021/03/10 DOTA
Javascript中暂停功能的实现代码
2007/03/04 Javascript
Gird事件机制初级读本
2007/03/10 Javascript
javascript下arguments,caller,callee,call,apply示例及理解
2009/12/24 Javascript
jQuery 全选/反选以及单击行改变背景色实例
2013/07/02 Javascript
jQuery网页版打砖块小游戏源码分享
2015/08/20 Javascript
jQuery获取浏览器类型和版本号的方法
2016/07/05 Javascript
js 原型对象和原型链理解
2017/02/09 Javascript
ES6新特性六:promise对象实例详解
2017/04/21 Javascript
Bootstrap fileinput文件上传组件使用详解
2017/06/06 Javascript
JS实现的走迷宫小游戏完整实例
2017/07/19 Javascript
PHP自动加载autoload和命名空间的应用小结
2017/12/01 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
2018/05/04 Javascript
微信小程序实现漂亮的弹窗效果
2020/05/26 Javascript
JavaScript设计模式之原型模式分析【ES5与ES6】
2018/07/26 Javascript
JS封装的模仿qq右下角消息弹窗功能示例
2018/08/22 Javascript
vue组件中的样式属性scoped实例详解
2018/10/30 Javascript
ES6入门教程之变量的解构赋值详解
2019/04/13 Javascript
vue获取时间戳转换为日期格式代码实例
2019/04/17 Javascript
使用Python中PDB模块中的命令来调试Python代码的教程
2015/03/30 Python
Python set常用操作函数集锦
2017/11/15 Python
python实现报表自动化详解
2017/11/16 Python
Python 在字符串中加入变量的实例讲解
2018/05/02 Python
python逆序打印各位数字的方法
2018/06/25 Python
python自动化工具之pywinauto实例详解
2019/08/26 Python
python [:3] 实现提取数组中的数
2019/11/27 Python
python清空命令行方式
2020/01/13 Python
使用tensorflow显示pb模型的所有网络结点方式
2020/01/23 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
2020/11/25 Python
给定一个时间点,希望得到其他时间点
2013/11/07 面试题
给幼儿园老师的表扬信
2014/01/19 职场文书
服装店营销方案
2014/03/10 职场文书