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


最近一直在學習Vue,而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組件銷毀后


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM