Vue组件中清除定时器setInterval的方案

前言

在网页中,经常会使用定时器来进行时间或者数据的刷新操作。但在vue组件中使用需要注意两点:
  1. 为了防止定时器造成内存溢出,因此,在离开页面或者组件销毁前需要进行清除定时器操作,以便造成定时器不断的继续更新操作;
  2. 定时器是window对象自有的函数,在Vue中this默认指向的是Vue对象,而不是window对象,因此使用定时器函数的时候需要带上window(如:window.setInterval(),window.clearInterval()),或者采用apply或者call的模式改变this的指向,具体可以参考博主的另一篇博客的讲解:js中this的指向的原理详解

具体方案

常用方案
  • 在组件的data中定义一个定时器接受函数:
data() {            
    return {                              
        timer: null  // 定时器名称          
    }        
},

  • 然后在需要定时器的地方调用定时器,并把定时器赋给定义的timer:
this.timer =window.setInterval (() => {
    // 某些操作
}, 1000)

  • 最后在beforeDestroy()生命周期内清除定时器:
beforeDestroy() {
    window.clearInterval(this.timer);        
    this.timer = null;
}

  • 该方案有两点不好的地方:
  1. 它需要在这个组件实例中保存这个 timer,如果可以的话最好只有生命周期钩子可以访问到它。这并不算严重的问题,但是它可以被视为杂物。
  2. 我们的建立代码独立于我们的清理代码,这使得我们比较难于程序化的清理我们建立的所有东西。
优化方案
通过一个程序化的侦听器解决上述两个问题
 const timer = window.setInterval(() => {
  	 // 某些操作
 }, 60000);
 this.$once("hook:beforeDestroy", () => {
    window.clearInterval(timer);
 });
  1. Vue官方文档:程序化的事件侦听器
  2. JavaScript中call,apply,bind的深入理解与对比
  3. js中this的指向的原理详解

欢迎伙伴们相互交流,讨论。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值