官方給的東西確定很官方啦,不過單看一張圖對理解vue生命週期鉤子函數來講確定仍是有些難度的。不過各位小夥伴不要着急,本文 以簡單直接的實例 來對此圖進行理解。html
來吧 上代碼!代碼直接能夠直接運行哦。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue-LifeClyle</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app" class="jing">
<p>{{message}}</p>
<keep-alive>
<jh-component msg="2017年6月9日" v-if="show"></jh-component>
</keep-alive>
</div>
</body>
<script>
var haohao = {
template: '<div>from haohao: {{msg}}</div>',
props: ['msg'],
deactivated: function() {
console.log('component deactivated!');
},
activated: function() {
console.log('component activated');
}
};
var app = new Vue({
el: '#app',
data: function() {
return {
message: 'jingjing',
show: true //控制子組件是否顯示
};
},
beforeCreate: function() {
console.group('beforeCreate Vue實例建立前的狀態————————————————————');
var state = {
'el': this.$el,
'data': this.$data,
'message': this.message
}
console.log(state);
},
created: function() {
console.group('created Vue實例建立完畢後狀態————————————————————');
var state = {
'el': this.$el,
'data': this.$data,
'message': this.message
}
console.log(state);
},
beforeMount: function() {
console.group('beforeMount 掛載前狀態————————————————————');
var state = {
'el': this.$el,
'data': this.$data,
'message': this.message
}
console.log(this.$el);
console.log(state);
},
mounted: function() {
console.group('mounted 掛載後狀態————————————————————');
var state = {
'el': this.$el,
'data': this.$data,
'message': this.message
}
console.log(this.$el);
console.log(state);
},
beforeUpdate: function() {
console.group('beforeUpdate 更新前狀態————————————————————');
var state = {
'el': this.$el,
'data': this.$data,
'message': this.message
}
console.log(this.$el);
console.log(state);
console.log('beforeUpdate = ' + document.getElementsByTagName('p')[0].innerHTML);
},
updated: function() {
console.group('updated 更新完成狀態————————————————————');
var state = {
'el': this.$el,
'data': this.$data,
'message': this.message
}
console.log(this.$el);
console.log(state);
console.log('Updated = ' + document.getElementsByTagName('p')[0].innerHTML);
},
beforeDestroy: function() {
console.group('beforeDestroy 銷燬前狀態————————————————————');
var state = {
'el': this.$el,
'data': this.$data,
'message': this.message
}
console.log(this.$el);
console.log(state);
},
destroyed: function() {
console.group('destroyed 銷燬完成狀態————————————————————');
var state = {
'el': this.$el,
'data': this.$data,
'message': this.message
}
console.log(this.$el);
console.log(state);
},
components: {
'jh-component': haohao
}
});
</script>
<style>
.jing {
font-size: 50px;
font-weight: bolder;
}
</style>
</html>
複製代碼
建立了一個 app 的Vue根實例,將其掛載到頁面 id 爲 app 的 Dom 元素上。 而後局部註冊了一個組件名爲 haohao 並在根實例中將其註冊,使其能夠在根實例的做用域中使用。 將子組件用
<keep-alive>
包裹,爲接下來的測試做準備。前端
關於
<keep-alive>
的問題就不在這裏做過多闡述了,你們能夠參考如下兩篇文章
一、zhuanlan.zhihu.com/p/96740001
二、www.jianshu.com/p/4b55d312d…vue
beforeCreate
執行時:data
和el
均未初始化,值爲undefined
created
執行時:Vue
實例觀察的數據對象 data
已經配置好,已經能夠獲得app.message
的值,但 Vue
實例使用的根 DOM
元素el
還未初始化beforeMount
執行時:data
和 el
均已經初始化,但從{{message}}
的展現狀況能夠看出此時 el
並無渲染數據,這裏就是應用的 Virtual DOM
(虛擬Dom)技術,先把坑佔住了。到後面 mounted
掛載的時候再把值渲染上去npm
mounted
執行時:此時 el 已經渲染完成並掛載到實例上api
咱們在控制檯看到component activated
被打印出來了,說明子組件jh-component
被 <keep-alive>
包裹,隨 el
的掛載而觸發了。瀏覽器
而後咱們進行一些操做,在控制檯輸入 app.show = false
咱們再來看看有什麼變化,測試結果以下圖:bash
data
的值,因此會觸發beforeUpdate
和updated
鉤子函數,這裏先無論這兩個函數,咱們看到deactivated鉤子已經觸發,表示<keep-alive>
已經停用。
同時咱們的子組件也會消失。app.message = 'haohao'
beforeUpdate
和updated
觸發時,el
中的數據都已經渲染完成,但根據控制檯打印的信息beforeUpdate = jingjing
而updated = haohao
可知,只有當updated
鉤子被調用時候,組件dom
纔會被更新。app.$destroy()
就能夠將vue
實例銷燬,可是咱們發現銷燬前和銷燬後的實例dom
結構沒有任何改變,其實變化已經發生在了其餘地方。Vue
實例指示的全部東西都會解除綁定,全部的事件監聽器會被移除,全部的子實例也會被銷燬。
app.message = 'jingjing'
發現結果以下圖:data
中的message
屬性,可是dom沒有任何響應。說明Vue
實例指示的全部東西都已經解除了綁定。終於寫完了😄😄😄做者只是一名前端大白(●—●) 此篇文章是第一篇,若是文中有錯誤請各位大佬諒解一下,指出錯誤就更好了,讓新人多一個學習的機會。😊😊app
此篇文章寫的很淺顯,若是有須要對內容有更深刻的學習,能夠看看大佬OBKoro寫的文章—— Vue的鉤子函數[路由導航守衛、keep-alive、生命週期鉤子]dom