zishu's blog

zishu's blog

一个热爱生活的博主。https://zishu.me

vue生命周期

學習 Vue 中一個非常重要的領域,就是生命周期,它包含了很多的內容。每個 Vue 實例在被創建的時候都要經歷一系列的初始化過程,這個過程就是 Vue 的生命周期。

每個 Vue 實例在被創建的時候都要經過一系列的初始化過程 —— 例如,需要把設置數據監聽、編譯模板、將實例掛載到 DOM 並在數據變化時更新 DOM 等,我們要把這一系列的過程稱為組件的「生命周期」(組件從註冊到銷毀的整個過程)。我們有時候需要在組件生命周期的某個過程中,執行某些代碼,基於此,Vue 提供了「生命周期鉤子函數」,給了用戶在不同階段添加自己的代碼的機會。

但是在此之前,我們要詳細介紹組件的生命周期,以及生命後期中每個階段組件完成和未完成的部分。

一、組件的生命周期#

放一張大家都很熟悉的官網文章中對生命周期的註釋圖。

image

從圖中可以看出,Vue 為生命周期提供了 8 個鉤子函數,分別是:

  • beforeCreate: 創建前
  • created: 創建後
  • beforeMount: 掛載前
  • mounted: 掛載後
  • beforeUpdate: 更新前
  • updated: 更新後
  • beforeDestroy: 銷毀前
  • destroyed: 銷毀後

1.beforeCreate#

beforeCreate 在 Vue 實例發生之後,數據觀測 (data observer) 和 event/watcher 事件配置之前被調用。

image

我們在上面的例子中在 beforeCreate 鉤子中調用 Vue 的 data 和 method,來看一下結果:

image

可以看到 Vue 中的 data 和方法都是無法獲取到的,並且是在 watch 之前執行

2.created#

實例已經創建完成之後被調用。在這一步,實例已完成以下的配置:數據觀測 (data observer),屬性和方法的運算,watch/event 事件回調。然而,掛載階段還沒開始,$el 屬性目前不可見。

主要應用:調用數據,調用方法,調用異步函數

image

控制台輸出的結果我們來看一下

image

可以看到:created 鉤子可以獲取 Vue 的 data,調用 Vue 方法,獲取原本 HTML 上直接加載出來的 DOM,但是無法獲取到通過掛載模板生成的 DOM(例如:v-for 循環遍歷 Vue.list 生成 li)

3.beforeMount#

在掛載開始之前被調用:相關的 render 函數(模板)首次被調用。

例如通過 v-for 生成的 HTML 還沒有被掛載到頁面上

 beforeMount: function () {
    console.log('beforeMount:',document.getElementsByTagName('li').length);
  },

控制台打印出來的 beforeMount 為 1

4.mounted#

el 被新創建的 vm.$el 替換,並掛載到實例上去之後調用該鉤子。

有初始值的 DOM 渲染,例如我們的初始數據 list,渲染出來的 li,只有這裡才能獲取

 mounted: function () {
    console.log('mounted:',document.getElementsByTagName('li').length);
  },

結果 mounted: 3,可以看到到這裡為止,掛載到實例上了,我們可以獲取到 li 的個數了

5.beforeUpdate#

數據更新時調用,發生在虛擬 DOM 重新渲染和打補丁之前。你可以在這個鉤子中進一步地更改狀態,這不會觸發附加的重渲染過程。

當我們更改 Vue 的任何數據,都會觸發該函數

 beforeUpdate: function () {
    console.log('beforeUpdate 鉤子執行。');
    console.log('beforeUpdate:'+this.message)
  },

6.updated#

由於數據更改導致的虛擬 DOM 重新渲染和打補丁,在這之後會調用該鉤子。

當這個鉤子被調用時,組件 DOM 已經更新,所以你現在可以執行依賴於 DOM 的操作。然而在大多數情況下,你應該避免在此期間更改狀態,因為這可能會導致更新無限循環。

該鉤子在服務器端渲染期間不被調用。

數據更新就會觸發(Vue 所有的數據只有有更新就會觸發),如果想數據一遍就做統一的處理,可以用這個,如果想對不同數據的更新做不同的處理可以用 nextTick,或者是 watch 進行監聽

 updated: function () {
    console.log('updated 鉤子執行...');
    console.log('updated:',this.message)
  },

7.beforeDestroy#

實例銷毀之前調用。在這一步,實例仍然完全可用。

8.destroyed#

Vue 實例銷毀後調用。調用後,Vue 實例指示的所有東西都會解綁定,所有的事件監聽器會被移除,所有的子實例也會被銷毀。該鉤子在服務器端渲染期間不被調用。

image

結果

image

可以看到到銷毀 Vue 實例時會調用這兩個函數

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。