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

 更新时间:2022年10月28日 11:20:45   作者:marsur  
​最近需要再页面里做个倒计时,发现用clearInterval()清除定时器失效,下面这篇文章主要给大家介绍了关于VUE设置和清除定时器的方式及遇到的问题的相关资料,需要的朋友可以参考下

方法一、在生命周期函数beforeDestroy中清除 

data() {
    return {
      timer: null;
    };
},
created() {    
    // 设置定时器,5s执行一次
    this.timer = setInterval(() => {
      console.log('setInterval');
    }, 5000);
}
beforeDestroy () {
    //清除定时器
    clearInterval(this.timer);
    this.timer = null;
}

方法二、使用hook:beforedestroy(推荐)

created() {    
    // 设置定时器,5s执行一次
    let timer = setInterval(() => {
      console.log('setInterval');
    }, 5000);
 
    // 离开当前页面时销毁定时器
    this.$once('hook:beforeDestroy', () => {
      clearInterval(timer);
      timer = null;
    })
}

该方法与在生命周期钩子beforeDestroy中清除定时器的操作原理一样,但更有优势

1.无需在vue实例上定义定时器,减少不必要的内存浪费

2.设置和清除定时器的代码放在一块,可读性维护性更好

三、beforeDestroy函数没有触发的情况

1、原因

<router-view>外层包裹了一层<keep-alive>

< keep-alive > 有缓存的作用,可以使被包裹的组件状态维持不变,当路由被 keep-alive 缓存时不走 beforeDestroy 生命周期。被包含在

< keep-alive > 中创建的组件,会多出两个生命周期钩子: activated 与 deactivated。

activated

在组件被激活时调用,在组件第一次渲染时也会被调用,之后每次keep-alive激活时被调用。

deactivated

在组件失活时调用。

2、解决方案

借助 activated 和 deactivated 钩子来设置和清除定时器

(1)生命周期钩子

created() {
    // 页面激活时设置定时器
    this.$on("hook:activated", () => {
        let timer = setInterval(()=>{
          console.log("setInterval");
        },1000)
    })
 
    // 页面失活时清除定时器
    this.$on("hook:deactivated", ()=>{
      clearInterval(timer);
      timer = null;
    })
  }

(2)hook

data() {
    return {
      timer: null // 定时器
    }
},
activated() {
    // 页面激活时开启定时器
    this.timer = setInterval(() => {
      console.log('setInterval');
    }, 5000)
},
deactivated() {
    // 页面关闭(路由跳转)时清除定时器
    clearInterval(this.timer)
    this.timer = null
},

附:vue离开页面销毁定时器

vue 是单页面应用,路由切换后,定时器并不会自动关闭,需要手动清除,当页面被销毁时,清除定时器即可。

data: {
    return {
        timer: null
    }
},
created() {
    this.timer = setInterval(....);
},
beforeDestroy() {
    if(this.timer) { //如果定时器还在运行 或者直接关闭,不用判断
        clearInterval(this.timer); //关闭
    }
}

总结

到此这篇关于VUE设置和清除定时器的文章就介绍到这了,更多相关VUE设置和清除定时器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue.Draggable实现交换位置

    Vue.Draggable实现交换位置

    这篇文章主要为大家详细介绍了Vue.Draggable实现交换位置,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Vue路由切换的两种方式示例详解

    Vue路由切换的两种方式示例详解

    这篇文章主要介绍了Vue路由切换的两种方式,主要包括标签切换和js切换,本文结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • vue使用axios获取不到响应头Content-Disposition的问题及解决

    vue使用axios获取不到响应头Content-Disposition的问题及解决

    这篇文章主要介绍了vue使用axios获取不到响应头Content-Disposition的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • VUE使用docxtemplater导出word文档实例(带图片)

    VUE使用docxtemplater导出word文档实例(带图片)

    docxtemplate支持的功能很多,语法包含变量替换、条件判断、循环、列表循环、表格循环等,下面这篇文章主要给大家介绍了关于VUE使用docxtemplater导出word功能(带图片)的相关资料,需要的朋友可以参考下
    2023-06-06
  • Vue 中使用 typescript的方法详解

    Vue 中使用 typescript的方法详解

    Typescript 5年内的热度随时间变化的趋势,整体呈现一个上升的趋势。也说明ts越来越&#65039;受大家的关注了。这篇文章主要介绍了Vue 中使用 typescript的方法详解,需要的朋友可以参考下
    2020-02-02
  • 使用echarts点击按钮从新渲染图表并更新数据

    使用echarts点击按钮从新渲染图表并更新数据

    这篇文章主要介绍了使用echarts点击按钮从新渲染图表并更新数据方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • vue-cli的工程模板与构建工具详解

    vue-cli的工程模板与构建工具详解

    vue-cli提供的脚手架只是一个最基础的,也可以说是Vue团队认为的工程结构的一种最佳实践。这篇文章主要介绍了vue-cli的工程模板与构建工具 ,需要的朋友可以参考下
    2018-09-09
  • vue axios 简单封装以及思考

    vue axios 简单封装以及思考

    axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端。这篇文章主要介绍了vue axios 简单封装以及思考 ,需要的朋友可以参考下
    2018-10-10
  • VUE2—defineProperty和VUE3—proxy使用方式

    VUE2—defineProperty和VUE3—proxy使用方式

    Vue2和Vue3的响应式原理不同,Vue2使用Object.defineProperty,Vue3使用Proxy,Object.defineProperty可以监听某个属性,但不能监听整个对象,且无法监听对象属性的新增和删除,Proxy可以监听整个对象,且不会修改原数据,可以监听数组的长度变化
    2025-01-01
  • Vue实现菜单切换功能

    Vue实现菜单切换功能

    这篇文章主要为大家详细介绍了Vue实现菜单切换功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11

最新评论