vue2.0生命週期—碼蟲
阿新 • • 發佈:2019-02-20
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生命週期,希望大家多多支援我
作者:三木