Vue生命週期,我奶奶看了都懂了

233發表於2020-08-22

最近一直在學習Vue,而vue生命週期是我們不可能繞開的一個很核心的知識點,今天來簡單的梳理一下大概的內容。

一、鉤子函式

在一開始學習的時候,總有鉤子函式這個名詞冒出來,而且在vue官網文件中也頻繁出現,也相信給很多初學者帶來了困擾。那到底什麼是鉤子函式呢?

按我個人的理解,鉤子函式就是一個函式,他最大的特點就是在生命週期執行流程中去執行的。 鉤子函式鉤子函式,就是掛載一些東西的,我們把需要實現的一些功能程式碼寫在對應的鉤子函式中,當生命週期在執行的時候,就能執行我們掛載的程式碼。

鉤子函式的實現,基本原理就是callback,回撥函式。

二、vue生命週期圖示(註釋)

原圖是從vuejs官方文件上拷下來的,自己用ps寫了一點註釋。

三、vue生命週期詳細解析

1. 例項化vue(元件)物件:new Vue()

2. 初始化事件和生命週期 init events 和 init lifecycle

3. beforeCreate函式:

在例項初始化之後,資料觀測 (data observer) 和 event/watcher 事件配置之前被呼叫。

即此時vue(元件)物件被建立了,但是vue物件的屬性還沒有繫結,如data屬性,computed屬性還沒有繫結,即沒有值。此時還沒有資料和真實DOM。屬性還沒有賦值,也沒有動態建立template屬性對應的HTML元素(二階段的createUI函式還沒有執行)

4. 掛載資料(屬性賦值)

包括 屬性和computed的運算,通過依賴注入匯入依賴

5. Created函式:

此時vue物件的屬性有值了,但是DOM還沒有生成,$el屬性還不存在。
此時有資料了,但是還沒有真實的DOM

即:data,computed都執行了。屬性已經賦值,但沒有動態建立template屬性對應的HTML元素,所以,此時如果更改資料不會觸發updated函式

如果:資料的初始值就來自於後端,可以傳送ajax,或者fetch請求獲取資料,但是,此時不會觸發updated函式

6. 檢查

1)檢查是否有el屬性
檢查vue配置,即new Vue{}裡面的el項是否存在,有就繼續檢查template項。沒有則等到手動繫結呼叫vm.$mount()

完成了全域性變數$el的繫結。

2)檢查是否有template屬性

檢查配置中的template項,如果沒有template進行填充被繫結區域,則被繫結區域的el物件的outerHTML(即整個#app DOM物件,包括< div id=”app” >和< /div>標籤)都作為被填充物件替換掉填充區域

即:如果vue物件中有 template屬性,那麼,template後面的HTML會替換$el對應的內容。如果有render屬性(渲染),那麼render就會替換template。

即:優先關係時: render > template > el

7. beforeMount函式:

模板編譯(template)、資料掛載(把資料顯示在模板裡)之前執行的鉤子函式

此時 this.$el有值,但是資料還沒有掛載到頁面上。即此時頁面中的{{}}裡的變數還沒有被資料替換

8. 模板編譯:用vue物件的資料(屬性)替換模板中的內容

9. Mounted函式:

模板編譯完成,資料掛載完畢

即:此時已經把資料掛載到了頁面上,所以,頁面上能夠看到正確的資料了。

一般來說,我們在此處傳送非同步請求(ajax,fetch,axios等),獲取伺服器上的資料,顯示在DOM裡。

10. beforeUpdate函式:

元件更新之前執行的函式,只有資料更新後,才能呼叫(觸發)beforeUpdate,注意:此資料一定是在模板上出現的資料,否則,不會,也沒有必要觸發元件更新(因為資料不出現在模板裡,就沒有必要再次渲染)

資料更新了,但是,vue(元件)物件對應的dom中的內部(innerHTML)沒有變,所以叫作元件更新前。(資料更了,模板沒更新)

11. updated函式:

元件更新之後執行的函式

vue(元件)物件對應的dom中的內部(innerHTML)改變了,所以,叫作元件更新之後

12. beforeDestroy:vue(元件)物件銷燬之前

13. destroyed:vue元件銷燬後

相關文章