vue 如何更好的清除定時(shí)器

清除定時(shí)器,這是在我們開發(fā)項(xiàng)目中常見功能需求

在vue項(xiàng)目中清除定時(shí)器方法時(shí)我們通常會(huì)用到以下兩種方法

方法一

1、首先在vue實(shí)例的data中定義定時(shí)器的名稱:
     exprot defalut {
        data(){
            return{
                    timer:null
             }
  
        },
2、在方法(methods)或者頁面初始化(mounted())的時(shí)候使用定時(shí)器
         mounted(){
             this.timer = setInterval((){
               console.log('所放內(nèi)容')
              },2000 )
         },
3、然后在頁面銷毀的生命周期函數(shù)(beforeDestroy())中銷毀定時(shí)器
         beforeDestroy(){
             clearInterval(this.timer)
          },
      }

這是段常見的代碼,但存在幾個(gè)問題

  • vue實(shí)例中需要有這個(gè)定時(shí)器的實(shí)例,timer被定義在data里面,實(shí)際上我們不需要他在data里面響應(yīng)操作,反而感覺有點(diǎn)多余,會(huì)造成性能的浪費(fèi)。
  • clearInterval 后沒有清空timer為null
  • 開啟定時(shí)器和清除定時(shí)器的代碼分散開在兩個(gè)地方可讀性維護(hù)性都在損耗,專業(yè)的說是使得我們比較很難的程序化的清理我們建立的東西。

方法一

export default{
  data(){
    retrun{}
   },
  mounted(){
      let timer = setInterval((){
          console.log('所放內(nèi)容')
      })
    this.$once('hook:berforeDestroy',()=>{
        clearInterval(timer)
        timer = null
    })
  },
  beforeDerstroy(){
    }
}
>在這里使用hook監(jiān)聽beforeDestroy生命周期,這樣timer只需要被定義在生命周期里

beforeDestroy 沒有觸發(fā)?

在后臺(tái)系統(tǒng)中,我們常常會(huì)設(shè)置頁面緩存,而當(dāng)路由被 keep-alive 緩存時(shí)是不走 beforeDestroy 生命周期的,所以有些小伙伴以為在 beforeDestroy 清除定時(shí)器就完事了,甚至都沒有檢查一下,實(shí)際上定時(shí)器并沒有被清除掉。知道了原因也就好解決了,借助 activated 和 deactivated 這兩個(gè)生鉤子:

export default{
  data(){
    retrun{}
   },
  mounted(){
      this.$on('hook:activated', () => {
      if (timer === null) { // 避免重復(fù)開啟定時(shí)器
        timer = setInterval(() => {
          console.log('setInterval')
        }, 2000)
      }
    })
    this.$on('hook:deactivated', () => {
      clearInterval(timer)
      timer = null
    })
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容