Vue2 里如何优雅的清除一个定时器

简介: Vue2 里如何优雅的清除一个定时器

绝大多数人清除定时器的方法

<script>
export default {
  data() {
    return {
      timer: null
    }
  },
  mounted() {
    this.timer = setInterval(() => {
      console.log('我是定时器')
    }, 1000)
  },
  beforeDestroy() {
    clearInterval(this.timer)
  }
}
</script>

这样写的缺点

上面是一段常见的代码
至少我身边的好几个小伙伴都是这么写的,这里存在3个不优雅的问题:
第1个:clearInterval 后没有清空 timer 为 null。
第2个:开启定时器和清除定时器的代码分散开在两个地方,可读性/维护性下降.
第3个:timer 被定义在 data 里,实际上 timer 不需要什么响应式操作,定义在 data 里是没必要的,反而造成性能浪费。

使用 hook 监听 beforeDestroy 生命

export default {
  data() {
    return {
    }
  },
  mounted() {
    let timer = setInterval(() => {
      console.log('---定时器在触发---')
    }, 1000)
    this.$once('hook:beforeDestroy', () => {
      console.log('这里使用 hook 监听 beforeDestroy 生命')
      clearInterval(timer)
      timer = null
    })
  },
  methods: {
    backPage() {
      this.$router.back()
    }
  }
}
</script>
这里使用 hook 监听 beforeDestroy 生命周期.
这样 timer 只需被定义在生命周期里,以上的问题就全部解决了。
ps: hook 是可以监听vue的生命周期的。

如果项目中使用了-- keep-alive 如何解决

在后台系统中,我们常常会设置页面缓存。
而当路由被 keep-alive 缓存时是不走 beforeDestroy 生命周期的。
此时将不能清除定时器。这时候我们需要借助 activated 和 deactivated 这两个生钩子:
activated 是进入页面的时候被触发
deactivated 是离开页面的时候会被触发,我们将在这个页面清除定时器
<script>
export default {
  mounted() {
    // 开启定时器
    let timer = setInterval(() => {
      console.log('---定时器在触发---')
    }, 1000)
   //这下面的代码不可以省略
    this.$on('hook:activated', () => {
      if (timer === null) { // 避免重复开启定时器
        timer = setInterval(() => {
          console.log('setInterval')
        }, 1000)
      }
    })
    this.$on('hook:deactivated', () => {
      clearInterval(timer)
      timer = null
    })
  }
}
<script>
这里需要注意一下,由于缓存原因.
所以需要用 $on 而不是 $once
因此$once 只会触发一次的哈

$on 和 $once 的区别

Api 中的解释:
$on(eventName:string|Array, callback) 监听事件
监听当前实例上的自定义事件。事件可以由 vm.$emit 触发。
回调函数会接收所有传入事件触发函数的额外参数。
$once(eventName: string, callback) 监听事件
监听一个自定义事件,但是只触发一次。一旦触发之后,监听器就会被移除。

vue3中如何使用

在vue3中 $on进行监听,$off取消监听 和  $once 实例方法已被移除.
所以无法优雅的清除定时器了。

遇见问题,这是你成长的机会,如果你能够解决,这就是收获

相关文章
|
前端开发 API
解决el-table中横向滚动条无法显示的问题
解决el-table中横向滚动条无法显示的问题
4011 0
|
存储 前端开发 JavaScript
如何解决前端常见的竞态问题?
如何解决前端常见的竞态问题?
479 0
JavaWeb - Request 之 Header Key 大小写是否敏感?
JavaWeb - Request 之 Header Key 大小写是否敏感?
2689 0
|
6月前
|
异构计算
基于MATLAB的NSCT(非下采样轮廓波变换)实现
基于MATLAB的NSCT(非下采样轮廓波变换)实现
211 5
|
9月前
|
存储 文字识别 自然语言处理
通义大模型在文档自动化处理中的高效部署指南(OCR集成与批量处理优化)
本文深入探讨了通义大模型在文档自动化处理中的应用,重点解决传统OCR识别精度低、效率瓶颈等问题。通过多模态编码与跨模态融合技术,通义大模型实现了高精度的文本检测与版面分析。文章详细介绍了OCR集成流程、批量处理优化策略及实战案例,展示了动态批处理和分布式架构带来的性能提升。实验结果表明,优化后系统处理速度可达210页/分钟,准确率达96.8%,单文档延迟降至0.3秒,为文档处理领域提供了高效解决方案。
923 1
|
移动开发 Unix Linux
拉取代码编辑器中报错`Delete ␍ prettier/prettier` 问题的解决方案
通过正确配置Prettier、EditorConfig文件和编辑器设置,可以有效解决 `Delete ␍ prettier/prettier`的问题。这不仅能避免频繁的格式化错误,还能确保团队成员在不同开发环境下的代码风格一致,提升项目的代码质量和可维护性。按照上述解决方案调整配置后,您的项目将更加规范,代码也会更具一致性。
1569 4
|
存储 负载均衡 数据管理
分区和分片
分区和分片
806 5
|
小程序 JavaScript 前端开发
微信小程序开发全流程:从注册到上线的完整指南
这篇文章详细记录了微信小程序的完整开发到最终上线的每一个步骤。适合对小程序开发感兴趣的个人开发者或希望了解完整流程的学习者,涵盖了云开发、事件绑定、生命周期管理、组件使用等关键内容。
13574 14
|
JavaScript 前端开发
JavaScript switch 语句
JavaScript switch 语句
232 1
|
JavaScript
vue组件封装 | 数字输入框(限制只能输入数字的input,可以指定小数点位数,最大值、最小值)
vue组件封装 | 数字输入框(限制只能输入数字的input,可以指定小数点位数,最大值、最小值)
704 7

热门文章

最新文章