Vue例項的生命週期鉤子
最近在學習Vue,接觸到了Vue的生命週期鉤子,看了視訊也百度了一些相關的,在這做一下筆記吧~
生命週期函式就是vue例項在某一個時間點會自動執行的函式
涉及到的生命週期鉤子
放上官方的生命週期圖:
圖上涉及到的生命週期鉤子有8個
生命週期鉤子 | 觸發的行為 | 在這階段可操作的例子 |
---|---|---|
beforeCreate | vue例項的掛載元素$el和資料data都為undefined,還未初始化。 | 可在這加個loading事件 |
created | vue例項的資料data有了,$el還沒有,DOM未生成 | 結束loading,還可做一些初始化,實現函式自執行 |
beforeMount | vue例項的$el和data都初始化了,但還是虛擬的dom節點,頁面還未被渲染。先把坑佔住,到後面mounted掛載的時候再把值渲染進去。 | |
mounted | vue例項掛載完成,虛擬的DOM變成真實DOM | 在這發起後端請求,拿回資料,配合路由鉤子做一些事情 |
beforeUpdate | data中的資料發生改變,還沒有重新渲染之前呼叫 | |
updated | data中的資料發生改變,重新渲染之後呼叫 | 資料更新時,做一些處理(此處也可以用watch進行觀測) |
beforeDestroy | 元件銷燬前呼叫 | 給使用者提示,比如“您確定刪除xxx嗎?” |
destroyed | 元件銷燬後呼叫,vue例項解除了事件監聽以及和dom的繫結(無響應了),但DOM節點依舊存在 | 當前元件已被刪除,清空相關內容 |
除了這8個還有另外2個
activated | 使用keep-alive,快速實現頁面快取時,元件被啟用時呼叫 |
---|---|
deactivated | 使用keep-alive,不想某個頁面有快取時,元件被移除時呼叫 |
結合程式碼去理解鉤子函式
附上大佬的程式碼,簡潔易懂:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue例項的生命週期鉤子</title>
<script src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<p>{{message}}</p>
<input type="button" @click="change" value="更新資料" />
</div>
<script>
// 生命週期函式就是vue例項在某一個時間點會自動執行的函式
var app = new Vue({
el:'#app',
data: {
message : "Vue例項的生命週期鉤子"
},
methods: {
change(){
this.message = '更新快更新'
}
},
beforeCreate: function () {
console.group('beforeCreate 建立前狀態===============》');
console.log("%c%s", "color:red","el : " + this.$el); //undefined
console.log("%c%s", "color:red","data : " + this.$data); //undefined
console.log("%c%s", "color:red","message: " + this.message);//undefined
},
created: function () {
console.group('created 建立完畢狀態===============》');
console.log("%c%s", "color:red","el : " + this.$el); //undefined
console.log("%c%s", "color:green","data : " + this.$data); //[object Object] => 已被初始化
console.log("%c%s", "color:green","message: " + this.message); //Welcome Vue => 已被初始化
},
beforeMount: function () {
console.group('beforeMount 掛載前狀態===============》');
console.log("%c%s", "color:green","el : " + (this.$el)); //已被初始化
console.log(this.$el); // 當前掛在的元素
console.log("%c%s", "color:green","data : " + this.$data); //已被初始化
console.log("%c%s", "color:green","message: " + this.message); //已被初始化
},
mounted: function () {
console.group('mounted 掛載結束狀態===============》');
console.log("%c%s", "color:green","el : " + this.$el); //已被初始化
console.log(this.$el);
console.log("%c%s", "color:green","data : " + this.$data); //已被初始化
console.log("%c%s", "color:green","message: " + this.message); //已被初始化
},
beforeUpdate: function () {
alert("更新前狀態");
console.group('beforeUpdate 更新前狀態===============》'); //這裡指的是頁面渲染新資料之前
console.log("%c%s", "color:green","el : " + this.$el);
console.log(this.$el);
console.log("%c%s", "color:green","data : " + this.$data);
console.log("%c%s", "color:green","message: " + this.message);
alert("更新前狀態2");
},
updated: function () {
console.group('updated 更新完成狀態===============》');
console.log("%c%s", "color:green","el : " + this.$el);
console.log(this.$el);
console.log("%c%s", "color:green","data : " + this.$data);
console.log("%c%s", "color:green","message: " + this.message);
},
beforeDestroy: function () {
console.group('beforeDestroy 銷燬前狀態===============》');
console.log("%c%s", "color:red","el : " + this.$el);
console.log(this.$el);
console.log("%c%s", "color:red","data : " + this.$data);
console.log("%c%s", "color:red","message: " + this.message);
},
destroyed: function () {
console.group('destroyed 銷燬完成狀態===============》');
console.log("%c%s", "color:red","el : " + this.$el);
console.log(this.$el);
console.log("%c%s", "color:red","data : " + this.$data);
console.log("%c%s", "color:red","message: " + this.message)
}
})
</script>
</body>
</html>
主要就是去檢視列印出來的順序和結果!!! 效果:
另外在紅框地方,我們能發現el還是 {{message}},這裡就是應用的 Virtual DOM(虛擬Dom)技術,頁面還未被渲染,先把坑佔住了。到後面mounted掛載的時候再把值渲染進去。
當vue發現data中的資料發生了改變,會觸發對應元件的重新渲染,先後呼叫beforeUpdate和updated鉤子函式。
注意
beforeUpdate是指view層的資料變化前,不是data中的資料改變前觸發。因為Vue是資料驅動的。注意觀察彈窗就容易發現。
destroyed鉤子函式有一點一定要特別注意:在執行destroy方法後,對data的改變不會再觸發周期函式,此時的vue例項已經解除了事件監聽以及和dom的繫結,但是dom結構依然存在。所以對於實時顯示的通知型元件,在他destroyed之前,我們必須手動removeChild()刪除該節點;否則,DOM節點還是存在,影響瀏覽器效能。
注意:
不要在生命週期鉤子上使用箭頭函式,如果生命週期使用了箭頭函式,那麼this就會指向window而不是當前Vue例項
最後附上參考連結:
https://www.cnblogs.com/xiaobaibubai/p/8383952.html
https://blog.csdn.net/qq_35585701/article/details/81216704
相關文章
- Vue 生命週期鉤子Vue
- Vue生命週期鉤子函式Vue函式
- Vue生命週期鉤子簡介Vue
- Vue 元件生命週期:探索鉤子Vue元件
- Vue 生命週期與鉤子函式Vue函式
- vue生命週期鉤子,一張圖片Vue
- vue[原始碼]生命週期鉤子的實現Vue原始碼
- Vue例項及生命週期Vue
- vue例項以及生命週期Vue
- vue所有生命週期函式/鉤子函式理解Vue函式
- 談談 React 新的生命週期鉤子React
- Vue的鉤子函式[路由導航守衛、keep-alive、生命週期鉤子]Vue函式路由Keep-Alive
- 對Angular中的生命週期鉤子的理解Angular
- Vue入門指南-05 Vue例項的生命週期(快速上手vue)Vue
- Hive Query生命週期 —— 鉤子(Hook)函式篇HiveHook函式
- Nuxt3 的生命週期和鉤子函式(一)UX函式
- Nuxt3 的生命週期和鉤子函式(二)UX函式
- Nuxt3 的生命週期和鉤子函式(三)UX函式
- Nuxt3 的生命週期和鉤子函式(四)UX函式
- Nuxt3 的生命週期和鉤子函式(五)UX函式
- Nuxt3 的生命週期和鉤子函式(六)UX函式
- Nuxt3 的生命週期和鉤子函式(七)UX函式
- Nuxt3 的生命週期和鉤子函式(八)UX函式
- Nuxt3 的生命週期和鉤子函式(九)UX函式
- Nuxt3 的生命週期和鉤子函式(十)UX函式
- Nuxt3 的生命週期和鉤子函式(十一)UX函式
- Vue父子元件生命週期執行順序及鉤子函式的個人理解Vue元件函式
- Angular2生命週期鉤子函式Angular函式
- vue的生命週期Vue
- vue - 生命週期Vue
- vue生命週期Vue
- 從零開始學 Web 之 Vue.js(三)Vue例項的生命週期WebVue.js
- Vue生命週期的理解Vue
- vue 生命週期梳理Vue
- 理解VUE生命週期Vue
- vue 生命週期深入Vue
- Vue的生命週期的理解Vue
- Kubernetes容器生命週期 —— 鉤子函式詳解(postStart、preStop)函式REST