zebraUI
zebraUI
  • 发布:2021-11-21 15:07
  • 更新:2021-11-21 15:07
  • 阅读:799

二、组件开发兼容性测试之获取$parent,$children

分类:uni-app

上一篇我们文章测试了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小程序:

飞书小程序:

快应用:

可以看到,这种方法兼容全端。

那这次的测试就告一段落了,接下来我们测试组件开发的必备,也就是组件样式穿透。

0 关注 分享

要回复文章请先登录注册