Vue生命周期詳解

Vue生命周期是面試中經(jīng)常被問到的問題,在實(shí)際項(xiàng)目中很多坑都是關(guān)于生命周期的,所以理解Vue實(shí)例的生命周期很有必要。筆者參考了一些文章,對(duì)Vue實(shí)例的生命周期做了總結(jié),既是總結(jié)筆記以便以后參考,也是供大家一起學(xué)習(xí)交流。
以下這張圖是Vue官網(wǎng)上的,我會(huì)利用鉤子函數(shù)一步一步講解Vue實(shí)例生命周期中發(fā)生了什么。

lifecycle.png

beforeCreate

beforeCreate

編寫以下代碼:

<--index.html-->
<div id="app">
    {{msg}}
</div>
var app = new Vue({
  el:'#app',
  data: {
    msg: 'hello world!'
  },
  beforeCreate(){
    console.log('beforeCreate:');
    console.log('el:', this.$el);
    console.log('msg:', this.msg);
  }
})

運(yùn)行代碼,在后臺(tái)得到以下輸出:

beforeCreate-demo.png

由此可以得到,鉤子函數(shù)beforeCreate()運(yùn)行時(shí),Vue實(shí)例還在初始化過程中,但是el選項(xiàng)和data數(shù)據(jù)并沒有被初始化。所以此時(shí)無法獲得data數(shù)據(jù),如果偏要在此時(shí)獲取data的之呢?可參考這個(gè)回答

created

created.png

同樣的html代碼,更換鉤子函數(shù):

var app = new Vue({
  el:'#app',
  data: {
    msg: 'hello world!'
  },
  created(){
    console.log('created:');
    console.log('el:', this.$el);
    console.log('msg:', this.msg);
  }
})

運(yùn)行代碼,得到一下結(jié)果:
created-demo.png

所以,當(dāng)created()函數(shù)運(yùn)行時(shí)el選項(xiàng)并沒有被初始化,data數(shù)據(jù)被初始化了,可以通過created()獲得data對(duì)象里的值。

beforeMount

beforeMount.png

html代碼不變,更換鉤子函數(shù):

var app = new Vue({
  el:'#app',
  data: {
    msg: 'hello world!'
  },
  beforeMount(){
    console.log('beforeMount:');
    console.log('el:', this.$el);
    console.log('msg:', this.msg);
  }
})

在后臺(tái)得到以下輸出結(jié)果:
deforeMount-demo

所以,beforeMount鉤子函數(shù)被調(diào)用時(shí),el和data都被初始化了,但是此時(shí)el還是虛擬Dom節(jié)點(diǎn)。

mounted

mounted.png

更改代碼:

var app = new Vue({
  el:'#app',
  data: {
    msg: 'hello world!'
  },
  mounted(){
    console.log('mounted:');
    console.log('el:', this.$el);
    console.log('msg:', this.msg);
  }
})

運(yùn)行代碼,得到一下結(jié)果:
mounted-demo.png

所以,mounted鉤子函數(shù)運(yùn)行時(shí),值已經(jīng)被渲染在了頁面上。

beforeUpdate和Updated

update.png

修改代碼:

var app = new Vue({
  el:'#app',
  data: {
    msg: 'hello world!'
  },
  beforeUpdate(){
    console.log('beforeUpdate:');
    console.log('el:', this.$el);
    console.log('msg:', this.msg);
  },
  updated(){
    console.log('updated:');
    console.log('el:', this.$el);
    console.log('msg:', this.msg);
  }
})

在控制臺(tái)修改msg的值,得到以下結(jié)果:
update-demo.png

發(fā)現(xiàn)兩個(gè)鉤子函數(shù)沒有任何區(qū)別,其實(shí)beforeUpdate函數(shù)被調(diào)用時(shí),data里msg的值已經(jīng)改變了,但是沒有渲染到頁面上,所以那時(shí)的頁面顯示的還是舊值,頁面渲染完畢之后才會(huì)調(diào)用Updated,這就是兩個(gè)鉤子函數(shù)調(diào)用時(shí)的區(qū)別。

beforeDestroy和destroyed

beforeDestroy鉤子函數(shù)在實(shí)例銷毀之前調(diào)用。在這一步,實(shí)例仍然完全可用。
destroyed鉤子函數(shù)在Vue 實(shí)例銷毀后調(diào)用。調(diào)用后,Vue 實(shí)例指示的所有東西都會(huì)解綁定,所有的事件監(jiān)聽器會(huì)被移除,所有的子實(shí)例也會(huì)被銷毀。

參考文章:
https://cn.vuejs.org/v2/guide/instance.html#%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E5%9B%BE%E7%A4%BA
https://segmentfault.com/a/1190000008010666?utm_source=tag-newest
https://segmentfault.com/a/1190000011381906?utm_source=tag-newest

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.vue基本生命周期 vue源碼中最終執(zhí)行生命周期函數(shù)都是調(diào)用callHook方法,callHook函數(shù)的邏輯很...
    WHU_GIS_LJ閱讀 19,735評(píng)論 0 13
  • Vue生命周期 每個(gè)Vue實(shí)例被創(chuàng)建時(shí)都要經(jīng)過一系列得初始化過程,舉一把栗子:需要設(shè)置數(shù)據(jù)監(jiān)聽、編譯、模板、將實(shí)例...
    前端_周瑾閱讀 1,807評(píng)論 0 2
  • Vue實(shí)例有一個(gè)完整的生命周期,也就是說從開始創(chuàng)建、初始化數(shù)據(jù)、編譯模板、掛在DOM、渲染-更新-渲染、卸載等一系...
    前端_周瑾閱讀 296,933評(píng)論 9 140
  • 詳解Vue Lifecycle 先來看看vue官網(wǎng)對(duì)vue生命周期的介紹 Vue實(shí)例有一個(gè)完整的生命周期,也就是從...
    雪妮爸爸閱讀 3,133評(píng)論 0 0
  • Vue實(shí)例有一個(gè)完整的生命周期,也就是從開始創(chuàng)建、初始化數(shù)據(jù)、編譯模板、掛載Dom、渲染→更新→渲染、銷毀等一系列...
    HonneyHao閱讀 416評(píng)論 0 0

友情鏈接更多精彩內(nèi)容