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标签使用指南
性能优化之最小化状态共享范围

相关推荐
行者-全栈开发1 小时前
华为云码道 CodeArts 实测:让 AI 独立开发一个鸿蒙原生专注计时应用「刻循」
harmonyos·arkts·鸿蒙·ai 编程·华为云码道·codearts 代码智能体·专注计时
resh_people1 小时前
开源鸿蒙平台 KMP/CMP 三方库「kotlinx-datetime」适配全流程
华为·开源·harmonyos
威哥爱编程15 小时前
HarmonyOS 7 自由多窗实战:supportWindowMode + 断点布局,大屏多任务主动接管
harmonyos·arkts
威哥爱编程15 小时前
HarmonyOS 7 应用接续实战:continuable + onContinue 跨设备无缝流转,手机编辑平板接着搞
harmonyos·arkts
威哥爱编程15 小时前
HarmonyOS 7 视觉 AI 进阶实战:人脸检测 + 通用文字识别(OCR)两步接入
harmonyos
李游Leo1 天前
HarmonyOS 7 API 26 升级适配实战:API Change Assistant、targetSDKVersion 与兼容性回归
harmonyos
OH_TPC1 天前
HarmonyOS APP开发---"智泊"智能停车App,需要用到这个库
harmonyos
用户117910488331 天前
AI粘贴多行需求为什么会误执行?hmharness安全粘贴拆解 GitHub:swsgbl/hmharness
ai编程·harmonyos
用户0934077735141 天前
HarmonyOS WPS Open SDK 实践:从 HAR 集成到 OpenFileRequest 最小闭环
typescript·harmonyos
威哥爱编程1 天前
HarmonyOS 7 Fast Kit 算法加速实战:四大核心能力,把算力从系统里"借"出来
harmonyos·arkts