vue中定时器setInterval的使用及说明

目录
  • 深坑
  • 声明
  • 销毁
  • that 是指vue , this是指定时器 positionTimer
  • 总结

深坑

自己在项目中使用setInterval,由于不正确的使用,竟然导致了浏览器崩溃,项目停止,电脑死机…可怕之极,下面详细写一下关于定时器的用法及注意事项

声明

    mouted() {
    	this.timer = setInterval(()=>{
    	// 要执行的函数
    	})
    }

销毁

destoryed() {
	this.clearInterval(this.timer)
}

看起来是很简单也没有什么,但是坑来了,实际项目中使用

    addSetInterval() {
      const that = this
      this.positionTimer = setInterval(() => {
        if (that.resultArr.length < that.times) {
          clearInterval(that.positionTimer)
          that.positionTimer = null
          console.log(that.times)
        } else {
          // 分批部署基站
          if (that.times < that.resultArr.length) {
            that.deployBaseStation()
            console.log('渲染数组的第' + that.times + '项')
          }
          that.times++
        }
        console.log(1111111111111)
      }, 500)
    },

由于这里定义了定时器,箭头函数内部和外部的作用域不同了,要定义一个变量来使函数内部使用vue数据的时候指向不出错,

that 是指vue , this是指定时器 positionTimer

之前为了确认定时器已经停止了,在destory中和定时器中都输出了定时器的值,即 console.log(this.positionTimer),然而,上图

离开当前路由,再回到当前路由,之后控制台打印

然后不久之后就是

WTF???

在请教了同学之后,她说可能跟我打印定时器也有关系,输出的时候调用了定时器,导致定时器关闭失败,我也是真的无奈了,一开始也没有定义额外的变量来确定this的指向,具体原因不明,总之,在不输出定时器,改加了额外的变量之后,定时器停止了

最终代码如下:

  destroyed() {
    clearInterval(this.positionTimer)// 清除定时器
    this.positionTimer = null
    // 离开路由之后断开websocket连接
    this.webSocketOnClose()
    this.websocketclose()
  },
  methods: {
    // 添加定时器
    addSetInterval() {
      const that = this  // 声明一个变量指向vue实例this,保证作用域一致
      this.positionTimer = setInterval(() => {
        if (that.resultArr.length < that.times) {
          clearInterval(that.positionTimer)
          that.positionTimer = null
          console.log(that.times)
        } else {
          // 分批部署基站
          if (that.times < that.resultArr.length) {
            that.deployBaseStation()
            console.log('渲染数组的第' + that.times + '项')
          }
          that.times++
        }
        console.log(1111111111111)
      }, 500)
    },

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • VUE设置和清除定时器的方式及遇到的问题

    目录 方法一.在生命周期函数beforeDestroy中清除 方法二.使用hook:beforedestroy(推荐) 三.beforeDestroy函数没有触发的情况 1.原因 2.解决方案 附:vue离开页面销毁定时器 总结 方法一.在生命周期函数beforeDestroy中清除 data() { return { timer: null; }; }, created() { // 设置定时器,5s执行一次 this.timer = setInterval(() => { console.l

  • vue中清除定时器的方法实例详解

    目录 一.问题 二.问题出现的原因 三.问题解决思路 四.实现的源代码 五.总结 一.问题 1.在vue中使用setTimeout定时器的时候,可能会遇到关不掉的情况,会存在明明已经在beforeDestroy和destroyed中设置了定时器清除了,但是有时候没生效,定时器还会继续执行. 2.在这里需要说一下setTimeout的使用场景: (1)需要执行一次定时的时候用得到,比如需要在多久之后执行的一次操作 (2)接口需要定时查询,并且需要在接口返回数据后再查询的情况下(接口定时查询的时候,

  • Vue中使用定时器(setInterval、setTimeout)的两种方式

    目录 1. 循环执行( setInterval ) 2. 定时执行 ( setTimeout) js中定时器有两种,一个是循环执行 setInterval,另一个是定时执行 setTimeout. 注意:定时器需要在页面销毁的时候清除掉,不然会一直存在! 1. 循环执行( setInterval ) 顾名思义,循环执行就是设置一个时间间隔,每过一段时间都会循环执行这个方法,直到这个定时器被销毁掉:语法: setInterval(code, milliseconds): setInterval(f

  • vue项目使用定时器每隔几秒运行一次某方法代码实例

    目录 代码如下: setInterval()和setTimeout()的区别: 补充知识:定时执行 ( setTimeout) 总结 代码如下: data() { return { timer:null, //定时器名称 } }, created() { this.setTime(); }, beforeDestroy(){ clearInterval(this.timer); // 清除定时器 this.timer = null; }, methods: { setTime(){ //每隔一分

  • Vue清除定时器setInterval优化方案分享

    两种方案清除定时器,开发者经常使用方案1,建议使用方案2 方案1 首先我在data函数里面进行定义定时器名称: data() { return { timer: null // 定时器名称 } }, 然后这样使用定时器: this.timer = (() => { // 某些操作 }, 1000) 最后在beforeDestroy()生命周期内清除定时器: beforeDestroy() { clearInterval(this.timer); this.timer = null; } 方案1有

  • 在vue中使用setInterval的方法示例

    昨天在用vue开发项目的时候遇到一个坑,在群友的探讨中,成功的解决了这一问题. 具体情形如下:使用vue开发,在页面中有一个人数统计组件,人数统计是要动态变化数据的,由于目前没有真实数据,那么我想的是用随机数和setInterval来改变data里面的数据,从而做到数据实时变化,这样方便与我来做数字翻页动画. 代码如下: <template> <div class="totel-number"> <div class="panel-top&quo

  • 详解JS中定时器setInterval和setTImeout的this指向问题

    前言 Js是一个单线程语言,可以通过setTimeout()和setInterval()来设置代码在指定时刻运行,前者是在指定时间后执行,后者是指每隔一段时间执行.两者的使用方法类似. 最近在练习写一个小例子的时候用到了定时器,发现在setInterval和setTimeout中传入函数时,函数中的this会指向window对象,详细的介绍通过一个示例展开,一起来看看吧. 如下例: var num = 0; function Obj (){ this.num = 1, this.getNum =

  • Vue中消息横向滚动时setInterval清不掉的问题及解决方法

    最近在做项目时,需要进行两个组件联动,一个轮询获取到消息,然后将其传递给另外一个组件进行横向滚动展示,结果滚动的速度越来越快.这里记录一下来提醒自己.消息滚动的代码在最下面,方便下次使用. 问题背景: 最近在做一个需求,组件A获取消息采用的是轮询,组件A获取到新的消息后,将组件A中的消息传递给另外一个组件B,当组件B接收到消息时就让消息在页面上滚动播放. 实现思路: 这个项目应用的框架为VUE,当组件A获取到新的消息之后,就触发中央事件总线,在组件B中进行事件监听,将其添加进入一个数组,当判断定

  • 浅谈vue 组件中的setInterval方法和window的不同

    vue组件中,this指向实例,[实例中重写了setInterval等一整套方法].所以,千万不能和 window 下挂载的方法混用 具体不同在于,window.setInterval执行完比后返回一个id,而vue实例中返回[定时器对象],当然该对象中包含一个_id的私有属性 因为 clearInterval 方法参数是id,所以最佳实践是统一使用 window 的方法,不要使用 vue组件的方法 vue中的定时器方法,要使用箭头函数,不要出现 const that = this 的写法 //

  • VUE中setTimeout和setInterval自动销毁案例

    在Vue的大型单页应用中,在某个路由下,经常会出现需要延迟执行(setTimeout)或者间隔之心(setInterval)的函数,但是每次在页面destroy之前,都必须手动清理掉. 正常代码如下: beforeDestroy() { this._timer && clearTimeout(this._timer); } 但是如果一不小心,就会忘记,会造成意想不到的情况,那么有什么办法能避免这种情况吗? 当然有,那就是重新写一个setTimeout的方法(或者干脆劫持window.set

  • 解决js中的setInterval清空定时器不管用问题

    使用场景:我在函数A中调用定时器函数,定时器是单独写的一个函数 原因:页面加载时我调用了1次函数A,然后又单独调用了一次定时器函数,导致调用了2次setInterval(),导致有setInterval_id有2个值. 通过打印定时器的值发现的问题. clearInterval()只关闭了其中一个setInterval_id,另一个setInterval_id还会启动setInterval(). 解决方法:把单独调用的定时器函数去掉. 补充知识:js vue中setTimeout无法通过clea

  • Vue中使用 setTimeout() setInterval()函数的问题

    在vue点击事件调用函数的过程中,想通过 setTimeout() setInterval()函数来延迟修改参数时,发现函数没有执行,控制台也没有报错,代码如下: var vm_target = new Vue({ el: '#vm_target', data: { clickSubmitBtn:false }, methods:{ myFunc:function(){ setTimeout(function(){ this.clickSubmitBtn = true; //此处修改data中的

  • JavaScript中定时器setTimeout()和setInterval()的用法

    JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成. 一.setTimeout() setTimeout函数用来指定某个函数或某段代码,在多少毫秒之后执行.它返回一个整数,表示定时器的编号,以后可以用来取消这个定时器. var timerId = setTimeout(func|code, delay) 上面代码中,setTimeout函数接受两个参数,第一个参数func|code是将要推迟执行的函数名

  • vue中七牛插件使用的实例代码

    本文介绍了vue中七牛插件使用,我也正在学习,分享给大家,顺便留个笔记,废话不说了,如下: <template> <div id="cxUpload" class="cx-upload"> <button id="pickfiles" class="uploadBtn">上传</button> </div> </template> <script&g

随机推荐