HarmonyOS(61) 组件间状态共享的分类以及状态选择器的选取优先级

状态共享

状态共享的分类

HarmonyOS的组件之间是可以共享状态数据了,不同的组件之间,状态共享的场景也不一样,根据共享范围从小到大可以有三种场景:

  1. 父子组件之间的共享状态(家庭内部矛盾)。
  2. 同一组件树不同子组件间的共享状态(家族内部矛盾)。
  3. 不同组件树间的共享状态(不同家族间的矛盾)。
  • 父子组件之间的共享状态(家庭内部矛盾):可以用下图表示:"父组件"和其子组件"子组件A"、"子组件B"共享loading状态
  • 同一组件树不同子组件间的共享状态(家族内部矛盾):如下图,祖先组件的左子树上"孙子组件AAA"和右子树上"孙子组件BAA"共享loading状态。
  • 不同组件树间的共享状态(不同家族间的矛盾):如下图,组件树A内"子组件AA"和组件树B内"孙子组件AAA"共享loading状态。

状态共享选择器

对于上述三种场景,ArkUI提供了@State+@Prop、@State+@Link、@State+@Observed+@ObjectLink、@Provide+@Consume、AppStorage、LocalStorage六种装饰器组合以解决不同范围内的组件间状态共享。按照共享范围能力从小到大,各装饰器组合的共享范围能力如下:

  • @State+@Prop、@State+@Link、@State+@Observed+@ObjectLink:三者的共享范围为从@State所在的组件开始,到@Prop/@Link/@ObjectLink所在组件的整条路径,路径上所有的中间组件通过@Prop/@Link/@ObjectLink都可以共享同一个状态。
  • @Provide+@Consume:状态共享范围是以@Provide所在组件为祖先节点的整棵子树,子树上的任意后代组件通过@Consume都可以共享同一个状态。
  • LocalStorage:共享范围为UIAbility内以页面为单位的不同组件树间的共享,适合对于单个Ability而言"全局"的变量,主要用于不同页面间的状态共享场景。
  • AppStorage:共享范围是应用全局。适合对于整个应用而言"全局"的变量或应用的主线程内多个UIAbility实例间的状态共享,如用户信息。

@State与@prop@Link@Observed+@ObjectLink组合的区别

对于具有相同优先级的装饰器选择方案@State+@Prop、@State+@Link和@State+@Observed+@ObjectLink。在选择方案时,需要结合具体的业务场景和状态数据结构的复杂度。这三种不同的装饰器组合方案在内存消耗、性能消耗和对数据类型的支持能力都不相同,如下:

  • @State+@Prop:适合状态结构简单,且共享状态的组件间层级相差不大的场景。或功能上要求子组件不实时同步修改给父组件的场景。
  • @State+@Link:适合状态结构复杂,且共享状态的组件间层级相差不大的场景。或功能上要求子组件对状态的修改实时同步给父组件的场景。
  • @State+@Observed+@ObjectLink:适合需要观察嵌套类对象的子属性变化的场景或对象数组的数据项属性变化的场景,如监听列表卡片上某个属性的变化。

合理选择装饰器的顺序

在实际开发中,合理选择装饰器主要包含以下三步:

  • 首先根据状态需要共享的范围大小,尽量选择共享能力小的装饰器方案,优先级依次为@State+@Prop、@State+@Link或@State+@Observed+@ObjectLink > @Provide+@Consume > LocalStorage > AppStorage

  • 当共享的状态的组件间层级相差较大时,为避免较差的代码可扩展性和可维护性,@Provide+@Consume的方案要优于层层传递的共享方案,因为@Provide+@Consume适合用于对于整个组件树而言"全局"的状态,且该状态改动不频繁的状态共享场景,如共享界面的路由信息。

  • 对于具有相同优先级的@State+@Prop、@State+@Link或@State+@Observed+@ObjectLink 三个方案,应结合状态的复杂程度和装饰器各自的特性选择。

参考资料

HarmonyOS鸿蒙学习笔记(6) @Consume和@Provide作用说明和简单案例
HarmonyOS鸿蒙学习笔记(5)@State作用说明和简单案例
HarmonyOS鸿蒙学习笔记(12)@Link的作用
HarmonyOS鸿蒙学习笔记(14)@ObjectLink的作用
HarmonyOS(31) @Prop标签使用指南
HarmonyOS(32) @Link标签使用指南
性能优化之最小化状态共享范围

相关推荐
nashane19 小时前
HarmonyOS 6商城开发学习:剪贴板权限频繁弹窗的根治——从“自动嗅探“改为“用户主动触发“模型
华为·harmonyos
国服第二切图仔19 小时前
HarmonyOS APP《画伴梦工厂》开发第37篇-GridRow-GridCol——响应式网格布局
华为·harmonyos
痕忆丶19 小时前
openharmony开发基础之5.0.1版本文件管理器复制粘贴框架调用流程
harmonyos
国服第二切图仔20 小时前
HarmonyOS APP《画伴梦工厂》开发第31篇-语音识别实战——SpeechRecognitionEngine+AudioCapturer
语音识别·xcode·harmonyos
TrisighT1 天前
Electron 鸿蒙 PC 上点外链唤醒应用,我试了 6 种写法只有 1 种能跑
前端·electron·harmonyos
TrisighT1 天前
Electron 跑鸿蒙 PC 上,这 4 个 API 的行为跟 Windows 完全不一样——但文档一行都没写
windows·electron·harmonyos
蓝速科技1 天前
蓝速科技 RISC-V 鸿蒙信创工控终端深度评测
科技·harmonyos·risc-v
zjxcq5201 天前
鸿蒙 ArkUI 实战:Swiper 组件构建高性能轮播图
android·华为·harmonyos
TrisighT2 天前
DevEco Code 写鸿蒙 ArkTS 确实快,但我试了三天后把默认引擎换成了 Cursor
ai编程·harmonyos·cursor
liz7up2 天前
鸿蒙原生流程图 & 审批流组件 hmflowkit
harmonyos