在单一组件中,钩子的执行顺序是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 : ''
})
}
},
}
复制代码