Vue.js嵌套組件生命周期執行順序

  • 2019 年 12 月 27 日
  • 筆記

一次面試被問到的問題,第一次還確實有點懵逼,特此記錄下來。

有組件A,組件B,組件C,組件C是組件B的子組件,組件B又是組件A的子組件,那麼直觀的層級結構如下:

ComponentA  --ComponentB  ----ComponentC

問:他們之間生命周期函數的調用順序是什麼?

下面的代碼表示上述結構,全局註冊了三個組件Comp、childrenA 和 childrenB。在 childrenA 中引用 childrenB,在 Comp 中 引用 childrenA。

Vue.component('comp', {      template: '<div><children-a></children-a></div>',      beforeCreate() {          console.log('Comp beforeCreate')      },      created() {          console.log('Comp created')      },      beforeMount() {          console.log('Comp beforeMount')      },      mounted() {          console.log('Comp mounted')      },  })  Vue.component('childrenA', {      template: '<div><children-b></children-b></div>',      beforeCreate() {          console.log('--childrenA beforeCreate')      },      created() {          console.log('--childrenA created')      },      beforeMount() {          console.log('--childrenA beforeMount')      },      mounted() {          console.log('--childrenA mounted')      },  })  Vue.component('childrenB', {      template: '<div>{{text}}</div>',      data() {          return {              text: 'childrenB'          }      },      beforeCreate() {          console.log('----childrenB beforeCreate')      },      created() {          console.log('----childrenB created')      },      beforeMount() {          console.log('----childrenB beforeMount')      },      mounted() {          console.log('----childrenB mounted')      },  })  new Vue({      el: '#app'  })

輸出結果如下:

Comp beforeCreate  Comp created  Comp beforeMount  --childrenA beforeCreate  --childrenA created  --childrenA beforeMount  ----childrenB beforeCreate  ----childrenB created  ----childrenB beforeMount  ----childrenB mounted  --childrenA mounted  Comp mounted

可以看到,先執行父級的beforeCreate、created 和 beforeMount,然後再去執行子組件的beforeCreate、created 和 beforeMount,如果子組件下面沒有子組件了,就執行 mounted,然後再返回父級執行 mounted。

整個過程用圖表示如下:

Vue嵌套組件生命周期執行順序

完!

本文代表個人觀點,內容僅供參考。若有不恰當之處,望不吝賜教!

本文鏈接:https://zhangbing.site/2018/12/05/Vue-js嵌套組件生命周期執行順序/