詳解vue生命周期
為什么要理解生命周期
用Vue框架,熟悉它的生命周期可以讓開(kāi)發(fā)更好的進(jìn)行。
如果只是單純地知道vue里面的簡(jiǎn)單語(yǔ)法,你是可以實(shí)現(xiàn)對(duì)應(yīng)的一些項(xiàng)目和對(duì)應(yīng)的想法,但是如果一旦發(fā)生問(wèn)題,我們就需要借助生命周期去尋找問(wèn)題,甚至說(shuō)有一些需求的話,你也通過(guò)生命周期的情況來(lái)定我們?cè)摪堰@個(gè)東西寫(xiě)在哪里。所以理解vue的生命周期還是很有必要的
什么是生命周期
Vue實(shí)例從創(chuàng)建到銷(xiāo)毀的過(guò)程,就是生命周期。詳細(xì)來(lái)說(shuō)也就是從開(kāi)始創(chuàng)建、初始化數(shù)據(jù)、編譯模板、掛載Dom、渲染→更新→渲染、卸載等一系列過(guò)程。
另外補(bǔ)充一點(diǎn),Vue的實(shí)例,它是Vue框架的入口,可以理解為前端的ViewModel,它包含了頁(yè)面中的業(yè)務(wù)邏輯處理、數(shù)據(jù)模型等,它也有自己的一系列的生命周期的函數(shù)鉤子,輔助我們進(jìn)行對(duì)整個(gè)Vue實(shí)例生成、編譯、掛著、銷(xiāo)毀等過(guò)程進(jìn)行js控制。
官網(wǎng)給出的生命周期圖(翻譯成中文)如下:

生命周期鉤子函數(shù)
生命周期鉤子,就是生命周期事件的別名而已,生命周期鉤子 = 生命周期函數(shù) = 生命周期事件
主要的生命周期函數(shù)分類(lèi):
創(chuàng)建期間的生命周期函數(shù):
beforeCreate:實(shí)例剛在內(nèi)存中被創(chuàng)建出來(lái),此時(shí),還沒(méi)有初始化好 data 和 methods 屬性
created:實(shí)例已經(jīng)在內(nèi)存中創(chuàng)建OK,此時(shí) data 和 methods 已經(jīng)創(chuàng)建OK,此時(shí)還沒(méi)有開(kāi)始 編譯模板
beforeMount:此時(shí)已經(jīng)完成了模板的編譯,但是還沒(méi)有掛載到頁(yè)面中
mounted:此時(shí),已經(jīng)將編譯好的模板,掛載到了頁(yè)面指定的容器中顯示
運(yùn)行期間的生命周期函數(shù):
beforeUpdate:狀態(tài)更新之前執(zhí)行此函數(shù), 此時(shí) data 中的狀態(tài)值是最新的,但是界面上顯示的 數(shù)據(jù)還是舊的,因?yàn)榇藭r(shí)還沒(méi)有開(kāi)始重新渲染DOM節(jié)點(diǎn)
updated:實(shí)例更新完畢之后調(diào)用此函數(shù),此時(shí) data 中的狀態(tài)值 和 界面上顯示的數(shù)據(jù),都已經(jīng)完成了更新,界面已經(jīng)被重新渲染好了!
銷(xiāo)毀期間的生命周期函數(shù):
beforeDestroy:實(shí)例銷(xiāo)毀之前調(diào)用。在這一步,實(shí)例仍然完全可用。
destroyed:Vue 實(shí)例銷(xiāo)毀后調(diào)用。調(diào)用后,Vue 實(shí)例指示的所有東西都會(huì)解除綁定,所有的事件監(jiān)聽(tīng)器會(huì)被移除,所有的子實(shí)例也會(huì)被銷(xiāo)毀。
created和mounted
在生命周期鉤子函數(shù)中,最常用的應(yīng)該就是created和mounted了。
created:在模板渲染成html前調(diào)用,即通常初始化某些屬性值,然后再渲染成視圖。主要應(yīng)用:調(diào)用數(shù)據(jù),調(diào)用方法,調(diào)用異步函數(shù)
mounted:在模板渲染成html后調(diào)用,通常是初始化頁(yè)面完成后,再對(duì)html的dom節(jié)點(diǎn)進(jìn)行一些需要的操作。
在created的時(shí)候,視圖中的html并沒(méi)有渲染出來(lái),所以此時(shí)如果直接去操作html的dom節(jié)點(diǎn),一定找不到相關(guān)的元素
而在mounted中,由于此時(shí)html已經(jīng)渲染出來(lái)了,所以可以直接操作dom節(jié)點(diǎn),
其實(shí)兩者比較好理解,通常created使用的次數(shù)多,而mounted通常是在一些插件的使用或者組件的使用中進(jìn)行操作,比如插件chart.js的使用: var ctx = document.getElementById(ID); 通常會(huì)有這一步,而如果你寫(xiě)入組件中,你會(huì)發(fā)現(xiàn)在created中無(wú)法對(duì)chart進(jìn)行一些初始化配置,一定要等這個(gè)html渲染完后才可以進(jìn)行,那么mounted就是不二之選。
鉤子的一些實(shí)戰(zhàn)用法
1.異步函數(shù)
這里我們用定時(shí)器來(lái)做異步函數(shù)
<div id="app">
<ul>
<li v-for="(item,index) of list" key="index">{{item}}</li>
</ul>
</div>
<script type="text/javascript">
var app = new Vue({
el:'#app',
data:{
list:['aaaaaaaa','bbbbbbb','ccccccc']
},
created:function(){
consoloe.log('created異步:aaaaa');
//異步獲取數(shù)據(jù)
// 因?yàn)槭钱惒?就和我們ajax獲取數(shù)據(jù)一樣
setTimeout(()=>{
this.list=['111','222','333','444'],
console.log('created異步:',document.getElementsByTagName('li').length);
},0)
},
mounted: function () {
console.log('mounted:',document.getElementsByTagName('li').length);
},
updated: function () {
console.log('updated:',document.getElementsByTagName('li').length)
},
})
</script>
結(jié)果為:
create: aaaaaaaa
mounted: 3
created異步函數(shù): 3
updated: 4
解釋:
可以看到因?yàn)槭窃赾reated的鉤子中加入異步函數(shù),所以函數(shù)的執(zhí)行順序?yàn)椋?br />
ceated鉤子,mounted鉤子,異步函數(shù),updated鉤子(根據(jù)事件隊(duì)列原理,只有在updated后,li才是真的DOM渲染為4個(gè),所以異步函數(shù)中獲取的li的個(gè)數(shù)時(shí)是沒(méi)有變化的li的個(gè)數(shù))。
因?yàn)閙ounted獲取到的是我們?cè)赩ue的data中設(shè)置初始值渲染的DOM,而我們是在異步函數(shù)中變化的list數(shù)據(jù),所以mounted獲取的li的個(gè)數(shù)為3。
update函數(shù)是只要數(shù)據(jù)vue綁定的數(shù)據(jù)變化就會(huì)觸發(fā),所以最后執(zhí)行,為4
這是不是意味著可以直接在update函數(shù)中操作呢,其實(shí)不是,因?yàn)閡pdate函數(shù)是針對(duì)vue的所有數(shù)據(jù)的變化,而我們也有可能會(huì)有其他數(shù)據(jù)的變化。
例如下面的例子:
//我們利用異步函數(shù)改變了兩次list,會(huì)發(fā)現(xiàn)update被觸發(fā)了2次
created:function(){
//異步獲取數(shù)據(jù)
// 因?yàn)槭钱惒?就和我們ajax獲取數(shù)據(jù)一樣
setTimeout(()=>{
this.list=['111','222','333','444'],
console.log('created異步:',document.getElementsByTagName('li').length);
},0)
setTimeout(()=>{
this.list=['快樂(lè)大本營(yíng)','腳踏實(shí)地','300033','天天向上','好好學(xué)習(xí)'],
console.log('created異步:',document.getElementsByTagName('li').length);
},1000)
},
mounted: function () {
console.log('mounted:',document.getElementsByTagName('li').length);
},
updated: function () {
console.log('updated:',document.getElementsByTagName('li').length)
},
結(jié)果為:

2.Vue.nextTick對(duì)異步函數(shù)的結(jié)果進(jìn)行操作
我們想要改變數(shù)據(jù)時(shí),各自觸發(fā)各自的方法
created:function(){
//異步獲取數(shù)據(jù)
// 因?yàn)槭钱惒?就和我們ajax獲取數(shù)據(jù)一樣
//為了在數(shù)據(jù)變化之后等待 Vue 完成更新 DOM ,可以在數(shù)據(jù)變化之后立即使用 Vue.nextTick(callback) 。這樣回調(diào)函數(shù)在 DOM 更新完成后就會(huì)調(diào)用。
setTimeout(()=>{
this.list=['111','222','333','444'],
console.log('created異步:',document.getElementsByTagName('li').length);
this.$nextTick(function(){
console.log("created$nextTick:",document.getElementsByTagName('li').length)
});
},0)
setTimeout(()=>{
this.list=['快樂(lè)大本營(yíng)','腳踏實(shí)地','300033','天天向上','好好學(xué)習(xí)'],
console.log('created異步:',document.getElementsByTagName('li').length);
this.$nextTick(function(){
console.log("created$nextTick:",document.getElementsByTagName('li').length)
});
},1000)
},
mounted: function () {
console.log('mounted:',document.getElementsByTagName('li').length);
},
updated: function () {
console.log('updated:',document.getElementsByTagName('li').length)
},
結(jié)果為:
我們可以看到通過(guò)$nextTick我們可以對(duì)異步函數(shù)的結(jié)果進(jìn)行各自的操作

總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
vue-auto-focus: 控制自動(dòng)聚焦行為的 vue 指令方法
今天小編就為大家分享一篇vue-auto-focus: 控制自動(dòng)聚焦行為的 vue 指令方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
vue移動(dòng)端使用appClound拉起支付寶支付的實(shí)現(xiàn)方法
這篇文章主要介紹了vue移動(dòng)端使用appClound拉起支付寶支付的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
Vue.js@2.6.10更新內(nèi)置錯(cuò)誤處機(jī)制Fundebug同步支持相應(yīng)錯(cuò)誤監(jiān)控
這篇文章主要介紹了Vue.js@2.6.10更新內(nèi)置錯(cuò)誤處機(jī)制,F(xiàn)undebug同步支持相應(yīng)錯(cuò)誤監(jiān)控 ,需要的朋友可以參考下2019-05-05
web前端Vue報(bào)錯(cuò):Uncaught?(in?promise)?TypeError:Cannot?read?
這篇文章主要給大家介紹了關(guān)于web前端Vue報(bào)錯(cuò):Uncaught?(in?promise)?TypeError:Cannot?read?properties?of?nu的解決方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01
elementUI 動(dòng)態(tài)生成幾行幾列的方法示例
這篇文章主要介紹了elementUI 動(dòng)態(tài)生成幾行幾列的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
TSX常見(jiàn)簡(jiǎn)單入門(mén)用法之Vue3+Vite
Vue3的確可以直接使用tsx開(kāi)發(fā),唯一需要處理的就是children,而且處理起來(lái)還是比較不爽的,下面這篇文章主要給大家介紹了關(guān)于TSX常見(jiàn)簡(jiǎn)單入門(mén)用法之Vue3+Vite的相關(guān)資料,需要的朋友可以參考下2022-08-08
Vue項(xiàng)目添加前綴,ngnix發(fā)布相關(guān)修改問(wèn)題
這篇文章主要介紹了Vue項(xiàng)目添加前綴,ngnix發(fā)布相關(guān)修改問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
簡(jiǎn)單了解vue中父子組件如何相互傳遞值(基礎(chǔ)向)
這篇文章主要介紹了簡(jiǎn)單了解vue中父子組件如何相互傳遞值(基礎(chǔ)向),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
Vue?中如何使用?el-date-picker?限制只能選擇當(dāng)天、當(dāng)天之前或當(dāng)天之后日期的方法詳解
在Vue前端開(kāi)發(fā)中,使用 el-date-picker 組件進(jìn)行日期選擇是常見(jiàn)的需求,有時(shí)候我們需要限制用戶只能選擇當(dāng)天、當(dāng)天之前或當(dāng)天之后的日期,本文將詳細(xì)介紹如何使用 el-date-picker 組件實(shí)現(xiàn)這些限制,讓你能夠輕松應(yīng)對(duì)各種日期選擇場(chǎng)景,需要的朋友可以參考下2023-09-09

