拒绝屎山代码——偷懒导致的Bug

150 阅读2分钟

从个人的编码历程总结一些经验。如有收获,还请关注——猩猩伸手.jpg

引言

这个Bug是在排查前人代码中所发现的,很值得作为错误案例学习。

简单来说,这个bug是因为重复创建组件所导致的,因为业务中有一个页面是会将该全局组件隐藏,而之前的业务开发中,并没有人意识到这一点。

是的,没错。这是一个屎山代码堆叠起来的项目。

所以我觉得很有价值——因为有错误,才能吸取教训。

定时器重复创建

这一个很经常遇到的一个业务情况——定时做某件事,可能是排行榜更新,又或者是统计数据上报等等。

想当然的,我们会直接在vue中的created或者mounted生命周期加上定时器,或者是在某一处触发创建定时器。

而有时会遗忘在beforeDestroy生命周期中加上销毁定时器,而这在不重复创建该组件的情况下并没有太大问题(内存泄漏也就一点)。

当重复创建该组件时,就会发现,上一个定时器并没有被销毁,从而导致重复调用。

若这是一个请求动作,服务器将会有不必要的开销。

所以,在写上周期性定时器时,或者是用单次定时器模拟周期性,也都需要注意定时器的销毁。

mounted() {
    this.timer = setInterval(() => {
      this.counter++;
    }, 1000); // 每秒执行一次
  },
  beforeDestroy() {
    clearInterval(this.timer); // 在组件销毁之前清除定时器
  }

vm.$on重复注册

这个问题类似于利用addEventListener 注册监听事件一样,问题的产生和上面情况是一样的。

都是因为重复创建组件导致的,所以处理的逻辑也是相同——在组件销毁时解绑监听事件。

mounted() {
    // 在组件挂载时注册事件监听器
    this.$on('customEvent'this.handleCustomEvent);
  },
  beforeDestroy() {
    // 在组件销毁前移除事件监听器,防止内存泄漏
    this.$off('customEvent'this.handleCustomEvent);
  },

如果是addEventListener ,就是利用removeEventListener,相信聪明的你肯定会写,就不多此一举了。

--End

推荐阅读

看完一篇文章就该休息了,别看了,推荐个毛啊。该走走动动,放松眼睛和拉伸身体。工作虽重要,但生活才是人生的重点