深入理解 Vue.js 的生命周期

一、生命周期的基礎知識

Vue.js 的組件實例有一個完整的生命周期,包含多個階段,每個階段都有一個相應的鉤子函數可以用於執行相應的操作。以下是 Vue.js 的生命周期圖示:


        beforeCreate() {
            // 在實例初始化之後,數據觀測(data observer)和 event/watcher 事件配置之前被調用。
        },
        created() {
            // 在實例創建完成後被立即調用
        },
        beforeMount() {
            // 在掛載開始之前被調用--即將模板編譯成虛擬 DOM,並在將其渲染到 DOM 之前執行。
        },
        mounted() {
            // 實例掛載之後調用--將頁面渲染完畢;
        },
        beforeUpdate() {
            // 數據更新時調用,但是並未渲染新數據,這裡適合拿舊數據和準備更新的數據做對比操作。
        },
        updated() {
            // 在數據更新且模板重新渲染之後調用。  
        },
        beforeDestroy() {
            // 實例銷毀之前調用--可以在這裡進行解綁事件、銷毀定時器、取消監聽等等操作。
        },
        destroyed() {
            // 實例銷毀之後調用--一般是清理計時器等東西。
        }

總之,Vue.js 的生命周期分為 beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy 和 destroyed 等階段,每個階段都會有對應的鉤子函數。

二、生命周期詳解

1. beforeCreate 階段

顧名思義,beforeCreate 階段是在實例被創建之前調用的鉤子函數,此時實例還沒有被創建,所以也就無法訪問到 data 和 methods 等實例屬性。


      beforeCreate() {
          // 在實例被創建之前調用的鉤子函數,此時實例還沒有被創建,所以也就無法訪問到 data 和 methods 等實例屬性。
          // 此時定義的 data 屬性、methods 等都不會生效。   
      }

2. created 階段

created 階段是在實例被創建之後調用的鉤子函數,此時已經可以訪問到 data 和 methods 等實例屬性,但尚未生成真正的 DOM。


      created() {
          // 在實例創建完成後被立即調用,此時已經可以訪問到 data 和 methods 等實例屬性,但尚未生成真正的 DOM。
          // 比如可以在此時進行異步請求數據,操作數據等等。
      }

3. beforeMount 階段

beforeMount 階段是在模板編譯成虛擬 DOM,並在將其渲染到 DOM 之前執行的鉤子函數,此時已經可以訪問到 DOM 樹,但是還沒有渲染出來。


      beforeMount() {
          // 此時已經可以訪問到 DOM 樹,但是還沒有渲染出來,可以在此時進行一些數據的處理和初始化操作,但是不要對已處理過的數據進行多次操作。
      }

4. mounted 階段

mounted 階段是在模板被渲染成 DOM 之後調用的鉤子函數,此時組件已經渲染完畢,DOM 中元素已經可以被訪問到。


      mounted() {
          // 在模板被渲染成 DOM 之後調用,此時組件已經渲染完畢,DOM 中元素已經可以被訪問到,常見使用場景比如向後台請求數據渲染頁面,聲明周期後,訪問虛擬dom,可能需要等dom渲染完成才能訪問,
          // 可通過 this.$nextTick() 等待模板渲染完畢之後執行操作。
      }

5. beforeUpdate 階段

beforeUpdate 階段是在數據更新時調用的鉤子函數,但是此時並未渲染新數據,適合拿舊數據和準備更新的數據做對比操作。


      beforeUpdate() {
          // 數據更新時調用,但是並未渲染新數據,適合拿舊數據和準備更新的數據做對比操作。
          // 也可以在此時對數據進行修改,但是應該避免無限更新。
      }

6. updated 階段

updated 階段是在數據更新且模板重新渲染之後調用的鉤子函數,此時可以訪問新的 DOM 元素和更新之後的數據。


      updated() {
          // 在數據更新且模板重新渲染之後調用,可以訪問新的 DOM 元素和更新之後的數據,但應該避免使用無限循環的操作,以免影響性能。
      }

7. beforeDestroy 階段

beforeDestroy 階段是在實例銷毀之前調用的鉤子函數,此時組件實例仍然可以訪問。


      beforeDestroy() {
          // 在實例銷毀之前調用,一般是解除事件監聽、定時器等等。
      }

8. destroyed 階段

destroyed 階段是在實例銷毀之後調用的鉤子函數,此時組件實例已被完全銷毀。


      destroyed() {
          // 實例銷毀之後調用,一般用於清理計時器等。
      }

三、生命周期常見錯誤的解決方案

1. created 階段使用 $refs

在 created 階段使用 $refs 來操作 DOM 元素會報錯,因為此時模板還未渲染成真正的 DOM,$refs 中並沒有對應的 DOM 元素。

解決方案:在 mounted 階段使用 $refs 操作 DOM 元素。

2. watch 與 computed 屬性

watch 和 computed 是 Vue.js 中的兩個重要的屬性。watch 屬性是用來監聽數據變化的,而 computed 屬性是用來計算數據的。在 watch 中計算數據或在 computed 中修改數據都是不允許的。

解決方案:在 computed 中計算數據,在 watch 中監聽數據變化。

3. destroyed 鉤子中的數據清理

在 destroyed 鉤子中進行數據清理時,因為此時組件已經銷毀,所以不能再訪問組件中的 data 屬性,清理操作也就無法進行。

解決方案一:在 beforeDestroy 鉤子中進行數據清理。

解決方案二:建議採用 aminated 和 transition 進行操作,對組件進行卸載切換時,即使在組件已經被銷毀的情況下,也可以通過 aminated 和 transition 組件實現一些操作。

四、總結

Vue.js 的生命周期是 Vue.js 組件中非常重要的一個部分。在 Vue.js 組件中,每個實例都有一個完整的生命周期,包含多個階段,每個階段都對應一個鉤子函數,可以在不同的階段中做出相應的操作。學好 Vue.js 的生命周期,可以更好地進行 Vue.js 應用程序的開發。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/186545.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-27 05:47
下一篇 2024-11-27 05:47

相關推薦

發表回復

登錄後才能評論