吐槽:最近學習 Vue 的生命周期函數(shù),有點搞不懂,為什么要叫鉤子函數(shù)???以前了解過 React 的生命周期,開始我已經(jīng) Vue 的生命周期理解起來應該和 React 類似,但是生命周期鉤子函數(shù)是什么鬼,難道是和 Vue 其它地方環(huán)環(huán)相扣,有數(shù)據(jù)交互?
了解了之后發(fā)下,沒有那么復雜,其實....就是和 React 生命周期類似,還是沒有懂為什么要叫鉤子函數(shù)?希望有大神可以答疑

什么鬼?
好了,不皮了,下面開始正式說 Vue 生命周期鉤子函數(shù)
1. 生命周期方法詳解
| 鉤子函數(shù) | 詳情 | 場景 | 備注 |
|---|---|---|---|
| beforeCreate | 實例初始化之后,組件被創(chuàng)建時期,這個時候的 el,data,message 都是 underfined | 可以加入 loading 事件;在服務器端的應用場景中,這個時候發(fā)送數(shù)據(jù)請求比較多一些 | |
| created | 實例創(chuàng)建完成后,data、methods 被初始化 | 結(jié)束 loading 事件;推薦這個時候發(fā)送請求數(shù)據(jù),尤其是返回的數(shù)據(jù)與綁定事件有關(guān)時 | |
| beforeMount | 掛載初始之前,完成 el 初始化,render 被初次調(diào)用 | 也可以發(fā)送數(shù)據(jù)請求 | 在服務器端渲染期間不會被調(diào)用 |
| mounted | 完成掛載 | 獲取 el 中 DOM 元素,進行 DOM 操作;如果返回的數(shù)據(jù)操作依賴 DOM 完成,推薦這個時候發(fā)送數(shù)據(jù)請求 | 在服務器端渲染期間不會被調(diào)用 |
| beofreUpdate | 掛載開始之前調(diào)用 | 掛載完成之前訪問現(xiàn)有 DOM ,比如手動移除已添加的事件監(jiān)聽器;也可以進一步修改數(shù)據(jù) | 在服務器渲染期間不會被調(diào)用,只有初次渲染會在服務端調(diào)用 |
| updated | 由于數(shù)據(jù)更改,重新渲染界面時調(diào)用 | 可執(zhí)行依賴于 DOM 的操作 | 服務器端渲染期間不會被調(diào)用 |
| activated | keep-alive 組件激活時調(diào)用 | 服務器端渲染期間不會被調(diào)用 | |
| deactivated | 組件停用時調(diào)用 | 服務器端渲染期間不會被調(diào)用 | |
| beforeDestroy | 實例銷毀之前調(diào)用 | 刪除錢發(fā)出確認信息;清理定時器 | 服務器端渲染期間不會被調(diào)用 |
| destroyed | 實例銷毀后調(diào)有。調(diào)用后,所有東西都會被解綁,所有的事件監(jiān)聽器會被移動,子實例也會被銷毀 | 提示已刪除 | 服務器端渲染期間不會被調(diào)用 |
| errorCaptured | 當捕獲一個來自子孫組件的錯誤時被調(diào)用。收到三個參數(shù):錯誤對象、發(fā)生錯誤的組件實例以及一個包含錯誤來源信息的字符串。可返回 false 以阻止該錯誤繼續(xù)向上傳播。 | 修改組件狀態(tài) | 2.5.0新增 |
2. 日常舉栗子:
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="UTF-8">
<script type="text/javascript" src="https://cdn.jsdelivr.net/vue/2.1.3/vue.js"></script>
</head>
<body>
<div id="app">
<p>{{ message }}</p>
<button v-on:click="change()">change</button>
<button v-on:click="destr()">destroy</button>
</div>
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
message: 66
},
beforeCreate: function () {
console.group('beforeCreate 創(chuàng)建前');
console.log("el: " + this.$el);
console.log("data: " + this.$data);
console.log("message: " + this.message)
},
created: function () {
console.group('created 創(chuàng)建完畢');
console.log("el: " + this.$el);
console.log("data: " + this.$data + JSON.stringify(this.$data));
console.log("message: " + this.message)
},
beforeMount: function () {
console.group('beforeMount 掛載前');
console.log("el: " + this.$el);
console.log("data: " + this.$data);
console.log("message: " + this.message)
},
mounted: function () {
console.group('mounted 掛載結(jié)束');
console.log("el: " + this.$el);
console.log("data: " + this.$data);
console.log("message: " + this.message)
},
beforeUpdate: function () {
console.group('beforeUpdate 更新前');
console.log("el: " + this.$el);
console.log("data: " + this.$data);
console.log("message: " + this.message)
},
updated: function () {
console.group('updated 更新完成');
console.log("el: " + this.$el);
console.log("data: " + this.$data);
console.log("message: " + this.message)
},
beforeDestroy: function () {
console.group('beforeDestroy 銷毀前');
console.log("el: " + this.$el);
console.log("data: " + this.$data);
console.log("message: " + this.message)
},
destroyed: function () {
console.group('destroyed 銷毀完成');
console.log("el: " + this.$el);
console.log("data: " + this.$data);
console.log("message: " + this.message)
},
methods: {
change() {
app.message++;
},
destr() {
app.$destroy();
}
}
})
</script>
</body>
</html>
2.1直接加載頁面,頁面顯示:

初始化
控制臺:

初始化
2.2 點擊 change 按鈕,頁面:

change
控制臺:

change
2.3 點擊 destroy ,頁面:

destory
控制臺:

destory
之后,再點擊 change 按鈕,頁面與控制臺都不會再發(fā)生變化。
最后用官網(wǎng)的一張圖壓軸,如果有不對的地方,歡迎指正

vue.png