上一篇我们文章测试了created,mounted,watch,computed的执行顺序。
这篇文章我们来测试不同平台,在子组件中获取$parent,在父组件中获取$children。因为这种操作,在组件库中出现的频率非常之高。
话不多说,我们的测试依然在这几个平台中进行。
这次我们分别在父组件和子组件中的created,mounted,computed,watch中获取parent和children。
H5:
微信小程序:
百度小程序:
支付宝小程序:
字节小程序:
QQ小程序:
飞书小程序:
快应用:
总结:
H5:
one组件的computed,watch,created无法获取子组件实例,但是mounted可以获取到。
two组件的created,mounted,computed,watch都可以获取到父组件的实例。
微信小程序:
和H5一致。
百度小程序:
可以看到,由于执行顺序原因,父组件全部无法获取到子组件的实例,这里的解决办法我们后续再说。
而子组件全部可以获取到父组件实例。
支付宝小程序:
与H5,微信小程序一致。
字节小程序:
字节小程序在父组件中全部无法获取子组件实例。值得一提的是,在子组件中,computed,watch也无法获取到父组件,只能在created和mounted中获取。
QQ小程序:
与H5,微信小程序,支付宝小程序一致。
飞书小程序:
与字节小程序完全一致。
快应用
与字节小程序,飞书小程序完全一致。
可以看到,在不同平台中获取parent,children都不一致。那么,我们如何在编写组件时合理的规避不同平台的差异呢?
首先,我们在子组件获取富足监事,保险起见,我们应该在mounted中来获取父组件实例。
那么,在父组件中获取子组件时,我们又该怎么做呢?
当然,我们首先想到的是,用refs。但是在组件库中,我们应该考虑用户的体验。而子组件又是通过插槽的形式注入到父组件中,所以,refs显然不能出现在组件库中,只能由用户主动去编写。许多vue大型组件库中,也是使用parent和children的操作。难道真的没有办法了吗?
这里我的解决办法是,子组件渲染完成后去通知父组件,并且带上该子组件的实例。也就是在子组件的mounted中,通过emit通知父组件,父组件on监听,然后就可以获取到了。
uni.$on("childrenReady", (children) => {
console.log("============监听子组件加载完成=============", children);
})
uni.$emit("childrenReady", this);
最后我们看一下执行结果:
H5:
微信小程序:
百度小程序:
支付宝小程序:
字节小程序:
QQ小程序:
飞书小程序:
快应用:
可以看到,这种方法兼容全端。