1. 程式人生 > >vue2.0生命週期—碼蟲

vue2.0生命週期—碼蟲

1.下面是我對生命週期的一些理解 首先我們先看一下Vue生命週期圖。

這裡寫圖片描述

2.它可以分為八個階段

鉤子函式 函式描述
beforeCreate 元件例項剛被建立,元件屬性計算之前,如data屬性等。
created 元件例項建立完成,屬性已繫結,但DOM還未生成,$el屬性還不存在。
beforeMount 模板編譯 | 掛載之前。
mounted 模板編譯 | 掛載之後。
beforeUpdate 元件更新之前。
updated 元件更新之後。
beforeDestroy 元件銷燬前呼叫。
destroyed 元件銷燬後呼叫。

3.結合程式碼讓我們更好的去理解鉤子函式

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
            <script type="text/javascript" src="js/vue.min.js" ></script>
    </head>
<body>
  <div id="app">
    <p>{{message}}</p>
  </div
>
</body> <script> var vm = new Vue({ el: '#app', data: { message: 'Hello Vue!' }, //beforeCreate執行時:data和el均未初始化,值為undefined beforeCreate: function() { console.group('------beforeCreate建立前狀態-------------'); console.log(this.$el); console.log(this
.$data); console.log(this.message) }, //.created執行時:Vue 例項觀察的資料物件data已經配置好, //已經可以得到app.message的值,但Vue 例項使用的根 DOM 元素el還未初始化 created: function() { console.group('------created建立完畢狀態-------------'); console.log(this.$el); console.log(this.$data); console.log(this.message); }, //beforeMount執行時:data和el均已經初始化,但從
{{message}}等現象可以看出 //此時el並沒有渲染進資料,el的值為“虛擬”的元素節點 beforeMount: function() { console.group('------beforeMount掛載前狀態-------------'); console.log(this.$el); console.log(this.$data); console.log(this.message); }, //mounted執行時:此時el已經渲染完成並掛載到例項上 mounted: function() { console.group('------mounted 掛載結束狀態-------------'); console.log(this.$el); console.log(this.$data); console.log(this.message); }, //修改vue例項的data時,vue就會自動幫我們更新渲染檢視, //在這個過程中,vue提供了beforeUpdate的鉤子給我們, //在檢測到我們要修改資料的時候,更新渲染檢視之前就會觸發鉤子beforeUpdate。 beforeUpdate: function () { console.group('beforeUpdate 更新前狀態-------------'); console.log(this.$el); console.log(this.$data); console.log(this.message); //測試DOM console.log('Dom結構是:' + document.getElementById('app').innerHTML); }, //由於資料更改導致虛擬DOM重新渲染和打補丁,在這之後會呼叫該鉤子。 //當這個鉤子被呼叫時,元件DOM已經更新,所以你現在可以執行依賴於DOM的操作。 //然而在大多數情況下,你應該避免在此期間更改狀態,因為這可能會導致更新無限迴圈。 updated: function () { console.group('updated 更新完成狀態-------------'); console.log(this.$el); console.log(this.$data); console.log(this.message); //測試DOM console.log('Dom結構是:' + document.getElementById('app').innerHTML); }, //例項銷燬之前呼叫。在這一步,例項仍然完全可用 beforeDestroy: function () { console.group('beforeDestroy 銷燬前狀態-------------'); console.log(this.$el); console.log(this.$data); console.log(this.message); }, //Vue例項銷燬後呼叫。呼叫後,Vue例項指示的所有東西都會解繫結, //所有的事件監聽器會被移除,所有的子例項也會被銷燬。 destroyed: function () { console.group('destroyed 銷燬完成狀態-------------'); console.log(this.$el); console.log(this.$data); console.log(this.message) } }) </script> </html>

讓我們一步一步詳細解說八大鉤子的作用。

(1)beforeCreate【建立前】:


這裡寫圖片描述

beforeCreate: 這個時候我們發現data和el均未初始化,值為undefined。

(2)created【建立後】:

這裡寫圖片描述
這裡寫圖片描述

created: 完成了 data 資料的初始化,但掛載階段尚未開始,所以$el 屬性不可見。

(3)beforeMount【載入前】

這裡寫圖片描述
這裡寫圖片描述

beforeMount:在掛載開始之前被呼叫,相關的render函式首次被呼叫,在這個時候還不能訪問DOM節點,此時我們的$el為虛擬的dom節點,在節點中的資料依然是{{data}}的形式,data裡面的資料和模板生成html。此時還沒有掛載html到頁面上。

(4)mounted【載入後】:

這裡寫圖片描述
這裡寫圖片描述

mounted:此時el被新建立的vm.$el替換,並掛載到例項上去之後呼叫該函式,在這個時候可以訪問DOM節點了,節點中的資料渲染完成,也就是說已經掛載到html頁面了。

(5)beforeUpdate【更新前】和updated【更新後】:

這裡寫圖片描述
這裡寫圖片描述

讓我們來看下更新前和更新後的區別如上圖:
我們可以很清楚的發現當我們去改變message的值的時候,觸發了beforeUpdate函式,這個時候$el的值已經更改了,但是dom並沒有變動。到update的時候,才真正去更新dom結構。然而在大多數情況下,應該避免在此期間更改狀態,因為這可能會導致更新無限迴圈。該鉤子在伺服器端渲染期間不被呼叫。

(6)beforeDestroy【銷燬前】和destroyed【銷燬後】:

這裡寫圖片描述
這裡寫圖片描述

可以發現beforeDestory和destoryed打印出來的結果並沒有什麼特別,el的值data的資料依然在的。這是因為$destroy只是銷燬一個例項,清理它與其它例項的連線,解綁它的全部指令及事件監聽器,並不會清除data的資料或者清除dom。
具體可參考:https://cn.vuejs.org/v2/api/#vm-destroy

這就是vue生命週期,希望大家多多支援我
這裡寫圖片描述


作者:三木