Vue中父子组件生命周期执行顺

问题背景

在单一组件中,钩子的执行顺序是beforeCreate-> created -> mounted->… ->destroyed,但当父子组件嵌套时,父组件和子组件各拥有各自独立的钩子函数,这些父子组件的这些钩子是如何交融执行,且执行顺序又是怎样的呢?


父子组件生命周期执行顺序

组件,分别在他们的钩子函数中打印日志,观察执行顺序。得到的结果如图所示,父组件先创建,然后子组件创建;子组件先挂载,然后父组件挂载。

父beforeCreate-> 父create -> 子beforeCreate-> 子created -> 子mounted -> 父mounted

子组件挂载完成后,父组件还未挂载。所以组件数据回显的时候,在父组件mounted中获取api的数据,子组件的mounted是拿不到的。子组件挂载完成后,父组件还未挂载。所以组件数据回显的时候,在父组件mounted中获取api的数据,子组件的mounted是拿不到的。

仔细看看父子组件生命周期钩子的执行顺序,会发现created这个钩子是按照从外内顺序执行,所以父子组件传递接口数据的解决方案是

在created中发起请求获取数据,依次在子组件的created或者mounted中会接收到这个数据。

父子组件生命周期执行顺序

加载渲染过程

1
beforeCreate->created->beforeMount->beforeCreate->created->beforeMount->mounted->父mounted

更新过程

1
beforeUpdate->beforeUpdate->updated->父updated

销毁过程

1
beforeDestroy->beforeDestroy->destroyed->父destroyed

注意 在父组件传递接口的数据给子组件时,一定要在子组件标签上加上v-if=”传递的接口数据”

在父组件的created中发请求获取数据,通过prop传递给子组件。子组件在created或者mounted中拿父组件传递过来的数据 这样处理是有问题的。

在父组件调用接口传递数据给子组件时,接口响应显然是异步的。这会导致无论你在父组件哪个钩子发请求,在子组件哪个钩子接收数据。都是取不到的。当子组件的mounted都执行完之后,此时可能父组件的请求才返回数据。会导致,从父组件传递给子组件的数据是undefined。

解决方法1:v-if

在渲染子组件的时候加上一个条件,data1是父组件调用接口返回的数据。当有数据的时候在去渲染子组件。这样就会形成天然的阻塞。在父组件的created中的请求返回数据后,才会执行子组件的created,mounted。最后执行父组件的mounted。

1
2
3
<div class="test">
<children v-if="data1" :data="data1" ></children>
</div>

在子组件中 watch 监听,父组件获取到值,这个值就会变化,自然是可以监听到的

1
2
3
4
5
6
7
8
9
10
11
watch:{
data:{
deep:true,
handler:function(newVal,oldVal) {
this.$nextTick(() => {
this.data = newVal
this.data = newVal.url ? newVal.url : ''
})
}
},
}

从父组件点击调用接口并显示子组件,子组件拿到数据并监听在watch中调用方法并显示

参考文章

Vue中父子组件生命周期执行顺序回顾


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!