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

 更新时间:2023年02月07日 09:22:33   作者:coderZzb  
很多情况下,进入和退出vue界面,都没有清除定时器,从而导致有很多定时器一起工作,这样肯定是不行的,下面这篇文章主要给大家介绍了关于vue中清除定时器的方法,需要的朋友可以参考下

一、问题

1、在vue中使用setTimeout定时器的时候,可能会遇到关不掉的情况,会存在明明已经在beforeDestroy和destroyed中设置了定时器清除了,但是有时候没生效,定时器还会继续执行。

2、在这里需要说一下setTimeout的使用场景:

(1)需要执行一次定时的时候用得到,比如需要在多久之后执行的一次操作

(2)接口需要定时查询,并且需要在接口返回数据后再查询的情况下(接口定时查询的时候,该方式会经常用得到)

二、问题出现的原因

场景:目前有个接口方法,执行该方法需要5s执行完成,并且还需要在执行完后定时查询数据

问题原因分析:

(1)问题发生的场景

a. 该方法需要5s执行完,但是当执行到该方法中第2s的时候,切换页面的时候将该组件销毁了

b. 销毁了该组件,但是该方法还是会在缓存中执行往下执行,并不会因为组件销毁而停止执行后面的代码,所以后面的定时器还是会执行到,并且后续的定时器也会一直执行

c. 因为一直在缓存中执行,并且组件已经销毁了,所以定时器就会存在清不掉的情况

(2)这种情况是偶发性的,很少有需要执行5s的方法,为了将该问题复现测试,我测试的时候是自己模拟了一下这个场景,所以使用的是5s;大部分的情况可能是几十毫秒或者几百毫秒就可以执行完成了,但是在销毁的时候,恰好处于方法执行的过程中,就会导致定时器清不掉的情况

三、问题解决思路

1、解决的思路跟我之前写的关于定时器的使用及页面切换时定时器无法清除的问题解决办法这篇文章差不多,是基于该文章的思路的一个补充,可以一起参考下

2、在使用定时器的组件中,使用一个curPageUrl来记录当前使用组件的页面所在的路由地址

该参数是用于对比路由跳转的情况,如果该参数和当前访问的路由地址不一致,那么就能判断出使用定时器的组件已经销毁了,不需要再继续执行了

3、在created或mounted中为curPageUrl赋初始值

this.curPageUrl = this.$route.path;

4、在使用定时器的方法中判断是否往下执行

if (this.curPageUrl && this.curPageUrl != this.$route.path) {
    return false;
}

5、在beforeDestroy和destroyed中为curPageUrl赋一个永远不能出现的一个值,并且清除定时器

this.curPageUrl = "end";
this.realtimeLoadPointDataTimer && clearTimeout(this.realtimeLoadPointDataTimer);

四、实现的源代码

export default {
  data() {
    return {
      curPageUrl: "", // 当前页面的路由地址
    };
  },
  watch: {},
  created() {
    this.query();

    this.curPageUrl = this.$route.path;
  },
  mounted() {},
  beforeDestroy() {
    this.curPageUrl = "end";
    this.realtimeLoadPointDataTimer &&
      clearTimeout(this.realtimeLoadPointDataTimer);
  },
  destroyed() {
    this.realtimeLoadPointDataTimer &&
      clearTimeout(this.realtimeLoadPointDataTimer);
  },
  methods: {
    /** 查询数据 */
    query() {
      this.realtimeLoadPointDataTimer &&
        clearTimeout(this.realtimeLoadPointDataTimer);

      if (this.curPageUrl && this.curPageUrl != this.$route.path) {
        return false;
      }

      // 设置延迟5秒执行回调函数
      setTimeout(() => {
        if (this.checked == true) {
          // 设置500毫秒执行一次
          this.realtimeLoadPointDataTimer = setTimeout(() => {
            this.query();
          }, 500);
        }
      }, 5000);
    },
  },
};

五、总结

在开发过程中,定时器是会经常用得到的,这种情况发生的机率很小,但并不是不会发生,为了避免该情况发生,这一个解决方案可能并不是很完美,但是能够解决这类问题 如果有更好的解决方案,或者使用该解决方案解决类似问题的遇到了问题!!!

相关文章

  • vue 项目接口管理的实现

    vue 项目接口管理的实现

    在vue开发中,会涉及到很多接口的处理,当项目足够大时,就需要定义规范统一的接口,本文就来介绍一下vue 项目接口管理,具有一定的参考价值,感兴趣的小伙伴可以一起来了解一下
    2019-01-01
  • Vue中如何给Window对象添加方法

    Vue中如何给Window对象添加方法

    这篇文章主要介绍了Vue中如何给Window对象添加方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • vue清空form对象的方法

    vue清空form对象的方法

    这篇文章主要介绍了vue清空form对象的方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Vue中实现视频播放的示例详解

    Vue中实现视频播放的示例详解

    这篇文章主要为大家学习介绍了基于Vue如何实现视频播放的功能,文中的示例代码讲解详细,具有一定的参考价值,需要的小伙伴可以了解一下
    2023-08-08
  • vue+element实现手机号验证码注册的示例

    vue+element实现手机号验证码注册的示例

    本文主要介绍了vue+element实现手机号验证码注册的示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Vue.js+Layer表格数据绑定与实现更新的实例

    Vue.js+Layer表格数据绑定与实现更新的实例

    下面小编就为大家分享一篇Vue.js+Layer表格数据绑定与实现更新的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • vue绑定class与行间样式style详解

    vue绑定class与行间样式style详解

    这篇文章主要介绍了vue绑定class与行间样式style的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • ElementUI下拉框选择后不显示值问题及解决

    ElementUI下拉框选择后不显示值问题及解决

    这篇文章主要介绍了ElementUI下拉框选择后不显示值问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 使用ElementUI循环生成的Form表单添加校验

    使用ElementUI循环生成的Form表单添加校验

    这篇文章主要介绍了使用ElementUI循环生成的Form表单添加校验,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Vue使用Element实现增删改查+打包的步骤

    Vue使用Element实现增删改查+打包的步骤

    这篇文章主要介绍了Vue使用Element实现增删改查+打包的步骤,帮助大家更好的理解和学习vue框架,感兴趣的朋友可以了解下
    2020-11-11

最新评论