在單一組件中,鉤子的執行順序是beforeCreate-> created -> mounted->... ->destroyed,但當父子組件嵌套時,父組件和子組件各擁有各自獨立的鉤子函數,這些父子組件的這些鉤子是如何交融執行,且執行順序又是怎樣的呢?vue
組件,分別在他們的鉤子函數中打印日誌,觀察執行順序。獲得的結果如圖所示,父組件先建立,而後子組件建立;子組件先掛載,而後父組件掛載。vue-router
父beforeCreate-> 父create -> 子beforeCreate-> 子created -> 子mounted -> 父mounted
複製代碼
子組件掛載完成後,父組件還未掛載。因此組件數據回顯的時候,在父組件mounted中獲取api的數據,子組件的mounted是拿不到的。api
仔細看看父子組件生命週期鉤子的執行順序,會發現created這個鉤子是按照從外內順序執行,因此父子組件傳遞接口數據的解決方案是:緩存
父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted
複製代碼
父beforeUpdate->子beforeUpdate->子updated->父updated
複製代碼
父beforeDestroy->子beforeDestroy->子destroyed->父destroyed
複製代碼
父create->子created->子mounted->父mounted
複製代碼
activated, deactivated 是組件keep-alive時獨有的鉤子dom
在父組件的created中發請求獲取數據,經過prop傳遞給子組件。子組件在created或者mounted中拿父組件傳遞過來的數據 這樣處理是有問題的。異步
在父組件調用接口傳遞數據給子組件時,接口響應顯然是異步的。這會致使不管你在父組件哪一個鉤子發請求,在子組件哪一個鉤子接收數據。都是取不到的。當子組件的mounted都執行完以後,此時可能父組件的請求才返回數據。會致使,從父組件傳遞給子組件的數據是undefined。函數
在渲染子組件的時候加上一個條件,data1是父組件調用接口返回的數據。當有數據的時候在去渲染子組件。這樣就會造成自然的阻塞。在父組件的created中的請求返回數據後,纔會執行子組件的created,mounted。最後執行父組件的mounted。fetch
<div class="test">
<children v-if="data1" :data="data1" ></children>
</div>
複製代碼
在子組件中 watch 監聽,父組件獲取到值,這個值就會變化,天然是能夠監聽到的this
watch:{
data:{
deep:true,
handler:function(newVal,oldVal) {
this.$nextTick(() => {
this.data = newVal
this.data = newVal.url ? newVal.url : ''
})
}
},
}
複製代碼