vue 改变父子组件mounted执行顺序

问题简介

最近在用vue做Cesium地图相关的东西,有一个需求是这样,一个地图为底图,然后有一个菜单切换不同的业务场景(业务场景都是在地图上做操作,打点,显示一些悬浮框什么的。。。)
原来的代码是每一次切换都重新初始化一遍地图,比较耗性能(需要请求大量的地图资源)。于是我想重构以下代码,简单思路就是只初始化一遍地图,业务页当成地图的子组件或者子路由,但是问题就是业务组件(子组件)需要等地图组件(父组件)mounted(初始化地图,画地图需要DOM元素)结束之后才能进行mounted(在地图上打点什么的)。
说人话就是如何在父组件mounted结束后再进行子组件mounted

父子组件生命周期顺序

父组件先进行创建,在挂在前子组件进行创建+挂载,子组件挂载完成后父组件挂载。

  1. 父组件:beforeCreate
  2. 父组件:created
  3. 父组件:beforeMount
  4. 子组件:beforeCreate
  5. 子组件:createc
  6. 子组件:beforeMount
  7. 子组件:mounted
  8. 父组件:mounted
    可以看出是先子组件mounted之后父组件mounted,如何实现父组件mounted之后子组件mounted呢?

实现父组件mounted之后子组件mounted

思路:通过打印this发现,有一个 _isMounted 属性,表示当前实例是否挂载完毕(true 挂载完成,false 没有挂载完成),在父组件挂在前将 _isMounted 存在window中,挂载后更新 _isMounted 。在子组件mounted添加定时器,根据 _isMounted 判断是否执行初始化方法。

// 父组件
beforeMount() {
	window.HomeisMounted = this._isMounted	// _isMounted是当前实例mouned()是否执行 此时为false
},
mounted() {
	this.init()		// 初始化地图
	window.HomeisMounted = this._isMounted	// _isMounted是当前实例mouned()是否执行 此时为true
},
// 子组件
mounted() {
    let time = setInterval(() => {
        if (window.HomeisMounted) {
        	this.init()			// 子组件初始化方法
            clearInterval(time)
        }
    }, 500)
}

最后

大哥们有啥更好的方式留言指教一下,谢谢啦。。。。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值