vue 改变父子组件mounted执行顺序
问题简介
最近在用vue做Cesium地图相关的东西,有一个需求是这样,一个地图为底图,然后有一个菜单切换不同的业务场景(业务场景都是在地图上做操作,打点,显示一些悬浮框什么的。。。)
原来的代码是每一次切换都重新初始化一遍地图,比较耗性能(需要请求大量的地图资源)。于是我想重构以下代码,简单思路就是只初始化一遍地图,业务页当成地图的子组件或者子路由,但是问题就是业务组件(子组件)需要等地图组件(父组件)mounted(初始化地图,画地图需要DOM元素)结束之后才能进行mounted(在地图上打点什么的)。
说人话就是如何在父组件mounted结束后再进行子组件mounted
父子组件生命周期顺序
父组件先进行创建,在挂在前子组件进行创建+挂载,子组件挂载完成后父组件挂载。
- 父组件:beforeCreate
- 父组件:created
- 父组件:beforeMount
- 子组件:beforeCreate
- 子组件:createc
- 子组件:beforeMount
- 子组件:mounted
- 父组件: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)
}
最后
大哥们有啥更好的方式留言指教一下,谢谢啦。。。。