关于vue中如何清除定时器的方法

news2025/2/25 13:04:40

一、问题

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);
    },
  },
};

五、总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/405557.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

路由vue-route的使用

文章目录一、项目初始化二、路由配置规则vue-route标签作用:路由匹配到的组件将渲染到这里router-link标签作用:路由导航(路由跳转的链接)三、声明式导航和编程式导航声明式导航编程式导航四、路由重定向五、嵌套路由特别注意总结…

04-vscode搭建cmake的编译环境

vscodemingw搭建C/C环境系列 01.vscodemingw搭建编译调试环境 02-vscode编译调试单个源文件程序 03-vscode编译调试多个源文件程序 04-vscode搭建cmake的编译环境 文章目录一、简述二、vscode搭建cmake的编译环境(方法1)1.配置cmake构建目录(可忽略)…

Redux——详解

一.初识Redux 相当于vue中的vuex 1.redux 是一个独立专门用于做状态管理的 JS 库(不是 react 插件库) 2.它可以用在 react, angular, vue 等项目中, 但基本与 react 配合使用 3.作用: 集中式管理 react 应用中多个组件共享的状态 看看Redux的工作原理图 如果要进行加一操作…

ES6---promise详解及用法

一、什么是Promise Promise是ES6异步编程的一种解决方案(目前最先进的解决方案是async和await的搭配(ES8),但是它们是基于promise的),从语法上讲,Promise是一个对象或者说是构造函数,用来封装异步操作并可…

炫酷登录注册界面【超级简单 jQuery+JS+HTML+CSS实现】

一:源码获取 这两天根据需求写了一个比较好看的有动态效果的登录注册切换页面,这里我将源码资源分享给大家,大家可以直接免费下载使用哦,没有 vip 的小伙伴找我私聊发送"登录注册"即可我给你发文件,此登录注…

四、vue中路由router配置详解

目录 一、vue中的路由作用 二、vue中的路由router 使用步骤 三、路由跳转 1、带参数路由跳转: (1)this.$router.push() : (2)this.$router.replace() : 2、不带参数路由跳转 3、this.…

【手把手教安装】VUE安装教程+VScode配置!!!

含泪整理Vue安装教程 因为换了新电脑很多软件要重装,所以想到可以写一份教程,为我以后换电脑方便重装也为了大家!! 第一次安装Vue踩坑太多,这里整理一份超详细教程(win11也可!!&…

uniapp 控制台警告 DevTools failed to load SourceMap: Could not load content for http://127.0.0.1问题解决

在uniapp中控制台警告,这是用于在开发时定位到报错的源码位置的工具SourceMap出问题了,如果单纯只是想消除这个警告的方法写在下面第一个,真正解决工具问题的方法是第二个(需要下载一个插件),现在放在这边做…

如何修复运行缓慢的 WordPress 网站?

💂 个人网站:【海拥】【摸鱼游戏】【神级源码资源网站】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 就其 SEO 而言&…

npm、nrm两种方式查看源和切换镜像

一、使用npm查看当前源、切换淘宝镜像、切换官方源 (1)npm查看当前源: npm get registry(2)npm设置淘宝镜像源: npm config set registry http://registry.npm.taobao.org(3)npm设…

2023 前端一场面试及答案整理

金三马上就要开始了,俗话说得好,知己知彼百战百胜,多准备总是没有错的。以面试的形式和大家一起学习、一起回顾我们的职场生涯。今天简单总结一下我个人去面试,包括我在面试别人时的经验。加油加加油!!&…

2022最新Nodejs下载安装配置步骤(保姆级教程)

1. 进入官网选择下载版本 http://nodejs.cn/download/2.安装过程 步骤1:选择next选项 步骤2:勾选接受协议选项,点击 next(下一步)按钮 : 步骤3:其默认安装目录是C:\Program Files\nodejs\,当…

【Python】ttkbootstrap的介绍与使用

一、什么是ttkbootstrap? 官方文档 [较慢]:https://ttkbootstrap.readthedocs.io/en/latest/ ttkbootstrap 是一个基于 tkinter 的界面美化库,使用这个工具可以开发出类似前端 bootstrap 风格的 tkinter 桌面程序 二、安装步骤 安装命令…

Vue项目安装less和less-loader

第一步:查看webpack和webpack-cli是否安装 打开cmd,通过命令查看 webpack -vwebpack-cli -v如果没有安装,要先进行安装 可以通过 npm view webpack version / npm view webpack-cli version 查看当前webpack的最新版本 可以通过 npm vie…

什么是axios(写给小白的理解笔记)

0.为什么会诞生axios 最初浏览器页面向服务器请求数据时,返回的是整个页面,整个页面都会刷新,当我们只需要请求部分数据时,返回整个页面会造成网络资源的占用,为了提高数据请求效率,异步网络请求Ajax出现了…

羊了个羊网页版

最近羊了个羊火的不得了,利用周末时间实现一个网页版。步骤如下: 1,用reactjs 实现。 2,实现Gameroom类。 3,实现Card类。 4,通过父组件控制子组件通信方式,控制点击事件。 5,通过t…

nvm切换node版本

在实际的前端开发过程中,可能会经常遇见 node.js 的版本问题,不同的项目需要使用不同的 node.js 版本。比如Vue2和Vue3需要的Node版本不一样。 地址:https://github.com/coreybutler/nvm-windows/releases 注意:安装之前必须完…

ChatGPT初体验——震撼,好用,贾维斯已来

2022.12.26 大概一个月的使用体验,我觉得chagpt的使用还算远远超出我的想象,可以说只有你想不到的,最近需要写一个基于shell的学生选课系统,但是时间实在是紧张的很,一开始chatgpt是无法接受这么大的要求的&#xff0c…

js实现数组去重的方式(7种)

目录JS数组去重的方式1.利用Set()Array.from()2.利用两层循环数组的splice方法3.利用数组的indexOf方法4.利用数组的includes方法5.利用数组的filter()indexOf()6.利用Map()7.利用对象JS数组去重的方式 例:将下面数组去除重复元素(以多种数据类型为例&a…

vue开发中,数据更新,但视图不刷新

我们在开发过程中会碰到数据更新,但是视图并未改变的情况,情况如下: 第一种:动态给对象新增属性或者删除属性是不会触发视图刷新的,Vue识别不到; 第二种:通过数组下标修改数组中的元素或者手动修改数组的长度,Vue识别不到&#…