vue中子组件的mounted/created钩子不会等待父组件created钩子中的异步方法执行完,生命周期不是跨组件的依赖或等待

项目实战遇到的问题:
打开新标签页指定路由地址,组件会进行重新创建挂载问题。
在A组件created中使用异步操作发起请求,而请求返回的数据假设id,存储到vuex的store中,在B/C组件中通过computed
MapGetter获取数据id并在mounted中的方法func2使用。这里发现在B/C中的mounted钩子中的方法获取不到id。

来研究下钩子的执行顺序:
在一个组件中的执行顺序:created->computed->mounted

vue 生命周期钩子的执行顺序:

在Vue.js中,组件的生命周期钩子(如created和mounted)的执行顺序遵循组件的层次结构和初始化流程。当Vue实例或组件被创建时,它们会经历一系列初始化步骤,这些步骤包括设置数据监听、编译模板、将实例挂载到DOM等,并且这些步骤会触发相应的生命周期钩子。

假设我们有三个组件:A(父组件)、B(A的子组件)、C(B的子组件),并且我们关注的是created和mounted这两个钩子。

created 钩子:这个钩子在实例创建完成后被立即调用。在这一步,实例已完成数据观测 (data observer),属性和方法的运算,watch/event 事件回调。然而,挂载阶段还没开始,$el 属性目前不可见。
mounted 钩子:mounted 在el 被新创建的 vm.el替换,并挂载到实例上去之后调用该钩子。如果根实例挂载了一个文档内元素,当mounted被调用时vm.el 也在文档内。
基于Vue的生命周期和组件的加载顺序,以下是A、B、C组件的生命周期钩子执行顺序:

A 组件的 created 钩子:首先执行,因为A是根组件或至少是当前讨论中的最顶层组件。
B 组件的 created 钩子:接着执行,因为B是A的子组件,Vue在创建A的过程中会递归地创建它的子组件。
C 组件的 created 钩子:然后执行,因为C是B的子组件,同样地,Vue在创建B的过程中会递归地创建它的子组件。
C 组件的 mounted 钩子:在C的模板编译完成并且C被挂载到DOM上之后执行。
B 组件的 mounted 钩子:在B的所有子组件(在这个例子中是C)都挂载到DOM上之后执行。这是因为Vue会等待所有子组件都挂载完成后,再调用父组件的mounted钩子。
A 组件的 mounted 钩子:最后执行,在A的所有子组件(在这个例子中是B和B的子组件C)都挂载到DOM上之后。

因此,A组件的created钩子会先于任何子组件(包括B和C)的mounted钩子执行。子组件的mounted钩子会在它们各自的created钩子之后,以及它们的所有子组件(如果有的话)都挂载到DOM上之后执行。

这里再关注下computed的顺序:
A的computed->B的computed->C的computed

C的mounted会等A的created以及created中的方法执行完再执行吗?

在Vue中,组件的created和mounted生命周期钩子的执行顺序是固定的,但它们的执行是基于组件自身的生命周期,而不是跨组件的依赖或等待。
即使你在A组件的created钩子中执行了某些操作(无论是同步还是异步),这并不会影响B组件或C组件的mounted钩子的执行时机。
created钩子在实例创建完成后被立即调用,此时完成了数据观测(data observer)和事件/侦听器的配置,但还没有挂载(mount)到DOM上,也没有渲染任何内容。而‘mounted‘钩子在el被新创建的vm.el 替换,并挂载到实例上去之后调用该钩子。这意味着,当C组件的mounted钩子执行时,C组件已经被挂载到了DOM上,但它的父组件(如B和A)的created或mounted钩子可能还在执行中,特别是如果它们包含了异步操作。

然而,这并不意味着C组件的mounted会等待A组件的created中的方法执行完如果A组件的created钩子中包含了异步操作(如API请求),那么这个操作会在后台进行,并且不会阻塞C组件的mounted钩子的执行。

总结发现:
实战获取不到id的原因是:C组件不管是created还是mounted的执行,都不会等待A组件created中的方法执行完再执行。

解决方案:
在B/C中使用watch监听computed数据的变化,再进行其他操作调用方法,不能直接在mounted使用,想要页面加载就调用方法可以开启深度监听。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值