一文搞懂Vue八大生命周期鉤子函數(shù)
一.速識(shí)概念:
我們把一個(gè)對(duì)象從生成(new)到被銷(xiāo)毀(destory)的過(guò)程,稱(chēng)為生命周期。而生命周期函數(shù),就是在某個(gè)時(shí)刻會(huì)自動(dòng)執(zhí)行的函數(shù)。
按照官方的原話,就是每個(gè) Vue 實(shí)例在被創(chuàng)建時(shí)都要經(jīng)過(guò)一系列的初始化過(guò)程——例如,需要設(shè)置數(shù)據(jù)監(jiān)聽(tīng)、編譯模板、將實(shí)例掛載到 DOM 并在數(shù)據(jù)變化時(shí)更新 DOM 等。同時(shí)在這個(gè)過(guò)程中也會(huì)運(yùn)行一些叫做生命周期鉤子的函數(shù),這給了用戶(hù)在不同階段添加自己的代碼的機(jī)會(huì)。
簡(jiǎn)單來(lái)說(shuō)就是每個(gè)Vue實(shí)例在被創(chuàng)建時(shí)都要經(jīng)過(guò)一系列的初始化過(guò)程:創(chuàng)建實(shí)例,裝載模板,渲染模板等。Vue為生命周期中的每個(gè)狀態(tài)都設(shè)置了鉤子函數(shù)(監(jiān)聽(tīng)函數(shù)) 。每當(dāng)Vue實(shí)例處于不同的生命周期時(shí),對(duì)應(yīng)的函數(shù)就會(huì)被觸發(fā)調(diào)用。
二.八大生命周期鉤子函數(shù):
| 函數(shù) | 調(diào)用時(shí)間 |
| beforeCreate | vue實(shí)例初始化之前調(diào)用 |
| created | vue實(shí)例初始化之后調(diào)用 |
| beforeMount | 掛載到DOM樹(shù)之前調(diào)用 |
| mounted | 掛載到DOM樹(shù)之后調(diào)用 |
| beforeUpdate | 數(shù)據(jù)更新之前調(diào)用 |
| updated | 數(shù)據(jù)更新之后調(diào)用 |
| beforeDestroy | vue實(shí)例銷(xiāo)毀之前調(diào)用 |
| destroyed | vue實(shí)例銷(xiāo)毀之后調(diào)用 |
下面是官方文檔里的生命周期圖,英語(yǔ)好的同學(xué)可以看看:

三.結(jié)合代碼了解:
先看案例基本代碼如下,后面通過(guò)如下代碼步驟演示一個(gè)對(duì)象從生成到被銷(xiāo)毀的過(guò)程各階段執(zhí)行的生命周期函數(shù)。注意show函數(shù)的作用。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
{{information}}
</div>
<script type="text/javascript">
//創(chuàng)建vue實(shí)例
var vm = new Vue({
el: '#app',
data: {
information: '北極光之夜。'
}
})
// 各個(gè)生命周期函數(shù)通過(guò)調(diào)用下面這個(gè)函數(shù)了解其所處的生命階段
function show(inf,obj){
console.log(inf);
console.log("------------------------------------------");
console.log('獲取vue實(shí)例data里的數(shù)據(jù):');
console.log(obj.information);
console.log("------------------------------------------");
console.log('掛載的對(duì)象,就是DOM:');
console.log(obj.$el);
console.log("------------------------------------------");
console.log('頁(yè)面上已經(jīng)掛載的DOM:');
console.log(document.getElementById('app').innerHTML);
}
</script>
1. beforeCreate:
這個(gè)階段vue實(shí)例剛剛在內(nèi)存中創(chuàng)建,此時(shí)data和methods這些都沒(méi)初始化好。
在案例中添加beforeCreate鉤子函數(shù):
var vm = new Vue({
el: '#app',
data: {
information: '北極光之夜。'
},
beforeCreate: function(){
// 傳入該階段簡(jiǎn)介與this,this就是該階段的vue實(shí)例
show('vue實(shí)例初始化之前',this);
}
})
看運(yùn)行結(jié)果:

可以看到,此時(shí)vue實(shí)例剛剛在內(nèi)存中創(chuàng)建,其它什么都undefined。
2.created:
這個(gè)階段vue實(shí)例在內(nèi)存中已經(jīng)創(chuàng)建好了,data和methods也能夠獲取到了,但是模板還沒(méi)編譯。
在案例中添加created鉤子函數(shù):
var vm = new Vue({
el: '#app',
data: {
information: '北極光之夜。'
},
created: function(){
show('vue實(shí)例初始化之后',this);
}
})
看結(jié)果:

看到?jīng)],已經(jīng)知道data里的數(shù)據(jù)了。其它的話都沒(méi)。
3.beforeMount:
這個(gè)階段完成了模板的編譯,但是還沒(méi)掛載到頁(yè)面上。
在案例中添加鉤子函數(shù):
var vm = new Vue({
el: '#app',
data: {
information: '北極光之夜。'
},
beforeMount: function(){
show('掛載之前',this);
}
})
看結(jié)果:

看到?jīng)],要掛載的對(duì)象都編譯好了,但是頁(yè)面的DOM樹(shù)還沒(méi)掛上去,這個(gè)階段頁(yè)面還沒(méi)能顯示出來(lái)。
4.mounted:
這個(gè)階段,模板編譯好了,也掛載到頁(yè)面中了,頁(yè)面也可以顯示了。
在案例中添加鉤子函數(shù):
var vm = new Vue({
el: '#app',
data: {
information: '北極光之夜。'
},
mounted: function(){
show('掛載之后',this);
}
})
看結(jié)果:

5.beforeUpdate:
轉(zhuǎn)態(tài)更新之前執(zhí)行此函數(shù),此時(shí)data中數(shù)據(jù)的狀態(tài)值已經(jīng)更新為最新的,但是頁(yè)面上顯示的數(shù)據(jù)還是最原始的,還沒(méi)有重新開(kāi)始渲染DOM樹(shù)。
先改變data里數(shù)據(jù):
vm.information = '南極光之夜';
在案例中添加鉤子函數(shù):
var vm = new Vue({
el: '#app',
data: {
information: '北極光之夜。'
},
beforeUpdate: function(){
show('更新之前',this);
}
})
看結(jié)果:

看到?jīng)],vue實(shí)例里的數(shù)據(jù)已經(jīng)變成了南極光之夜。但是此階段頁(yè)面DOM節(jié)點(diǎn)上顯示的還是初始的數(shù)據(jù)北極光之夜。
6.updated:
這個(gè)階段是轉(zhuǎn)態(tài)更新完成后執(zhí)行此函數(shù),此時(shí)data中數(shù)據(jù)的狀態(tài)值是最新的,而且頁(yè)面上顯示的數(shù)據(jù)也是最新的,DOM節(jié)點(diǎn)已經(jīng)被重新渲染了。
在案例中添加鉤子函數(shù):
var vm = new Vue({
el: '#app',
data: {
information: '北極光之夜。'
},
updated: function(){
show('更新之后',this);
}
})
看運(yùn)行結(jié)果:

更新了,全都更新了~
7.beforeDestroy:
beforeDestroy階段處于vue實(shí)例被銷(xiāo)毀之前,當(dāng)然,這個(gè)階段vue實(shí)例還能用。
銷(xiāo)毀Vue實(shí)例:
vm.$destroy();
在案例中添加鉤子函數(shù):
var vm = new Vue({
el: '#app',
data: {
information: '北極光之夜。'
},
beforeDestroy: function() {
show('銷(xiāo)毀之前',this);
}
})
看效果:

8.destroyed:
這個(gè)階段在vue實(shí)例銷(xiāo)毀后調(diào)用,此時(shí)所有實(shí)例指示的所有東西都會(huì)解除綁定,事件監(jiān)聽(tīng)器也都移除,子實(shí)例也被銷(xiāo)毀。
在案例中添加鉤子函數(shù):
var vm = new Vue({
el: '#app',
data: {
information: '北極光之夜。'
},
destroyed: function() {
show('銷(xiāo)毀之后',this);
}
})
看結(jié)果:

到此這篇關(guān)于一文搞懂Vue八大生命周期鉤子函數(shù)的文章就介紹到這了,更多相關(guān)Vue八大生命周期鉤子函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Vue3生命周期鉤子函數(shù)詳解
- Vue3生命周期Hooks原理與調(diào)度器Scheduler關(guān)系
- vue2與vue3中生命周期執(zhí)行順序的區(qū)別說(shuō)明
- 深入了解vue2與vue3的生命周期對(duì)比
- Vue3生命周期函數(shù)和方法詳解
- vue3.0生命周期的示例代碼
- 理解Vue2.x和Vue3.x自定義指令用法及鉤子函數(shù)原理
- vue項(xiàng)目中輪詢(xún)狀態(tài)更改方式(鉤子函數(shù))
- VUE中的自定義指令鉤子函數(shù)講解
- vue3生命周期原理與生命周期函數(shù)簡(jiǎn)單應(yīng)用實(shí)例分析
相關(guān)文章
Vue啟動(dòng)失敗報(bào)錯(cuò):Module?not?found:?Error:?Can‘t?resolve?&apos
這篇文章主要給大家介紹了關(guān)于Vue啟動(dòng)失敗報(bào)錯(cuò):Module?not?found:?Error:?Can‘t?resolve?'less-loader'解決的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
vue實(shí)現(xiàn)登錄頁(yè)面的驗(yàn)證碼以及驗(yàn)證過(guò)程解析(面向新手)
這篇文章主要介紹了vue實(shí)現(xiàn)登錄頁(yè)面的驗(yàn)證碼以及驗(yàn)證過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
vue項(xiàng)目中使用qrcodesjs2生成二維碼簡(jiǎn)單示例
最近項(xiàng)目中需生成二維碼,發(fā)現(xiàn)了很好用的插件qrcodesjs2,所以下面這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目中使用qrcodesjs2生成二維碼的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05
Spring Boot/VUE中路由傳遞參數(shù)的實(shí)現(xiàn)代碼
在路由時(shí)傳遞參數(shù),一般有兩種形式,一種是拼接在url地址中,另一種是查詢(xún)參數(shù)。這篇文章主要介紹了Spring Boot/VUE中路由傳遞參數(shù),需要的朋友可以參考下2018-03-03
vue組件props屬性監(jiān)聽(tīng)不到值變化問(wèn)題
這篇文章主要介紹了vue組件props屬性監(jiān)聽(tīng)不到值變化問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04

