Vue中父子组件生命周期执行顺
问题背景
在单一组件中,钩子的执行顺序是beforeCreate-> created -> mounted->… ->destroyed,但当父子组件嵌套时,父组件和子组件各拥有各自独立的钩子函数,这些父子组件的这些钩子是如何交融执行,且执行顺序又是怎样的呢?
父子组件生命周期执行顺序
组件,分别在他们的钩子函数中打印日志,观察执行顺序。得到的结果如图所示,父组件先创建,然后子组件创建;子组件先挂载,然后父组件挂载。
父beforeCreate-> 父create -> 子beforeCreate-> 子created -> 子mounted -> 父mounted
子组件挂载完成后,父组件还未挂载。所以组件数据回显的时候,在父组件mounted中获取api的数据,子组件的mounted是拿不到的。子组件挂载完成后,父组件还未挂载。所以组件数据回显的时候,在父组件mounted中获取api的数据,子组件的mounted是拿不到的。
仔细看看父子组件生命周期钩子的执行顺序,会发现created这个钩子是按照从外内顺序执行,所以父子组件传递接口数据的解决方案是
在created中发起请求获取数据,依次在子组件的created或者mounted中会接收到这个数据。
父子组件生命周期执行顺序
加载渲染过程
1 |
|
更新过程
1 |
|
销毁过程
1 |
|
注意 在父组件传递接口的数据给子组件时,一定要在子组件标签上加上v-if=”传递的接口数据”
在父组件的created中发请求获取数据,通过prop传递给子组件。子组件在created或者mounted中拿父组件传递过来的数据 这样处理是有问题的。
在父组件调用接口传递数据给子组件时,接口响应显然是异步的。这会导致无论你在父组件哪个钩子发请求,在子组件哪个钩子接收数据。都是取不到的。当子组件的mounted都执行完之后,此时可能父组件的请求才返回数据。会导致,从父组件传递给子组件的数据是undefined。
解决方法1:v-if
在渲染子组件的时候加上一个条件,data1是父组件调用接口返回的数据。当有数据的时候在去渲染子组件。这样就会形成天然的阻塞。在父组件的created中的请求返回数据后,才会执行子组件的created,mounted。最后执行父组件的mounted。
1 |
|
在子组件中 watch 监听,父组件获取到值,这个值就会变化,自然是可以监听到的
1 |
|
从父组件点击调用接口并显示子组件,子组件拿到数据并监听在watch中调用方法并显示
参考文章
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!