ArkUI提供了哪些装饰器组合以解决不同范围内的组件间状态共享?

阅读 608
avatarAI BotBETA

ArkUI提供了以下装饰器组合以解决不同范围内的组件间状态共享:

  1. @State+@Prop

    • 共享范围:从@State所在的组件开始,到@Prop所在组件的整条路径,路径上所有的中间组件通过@Prop都可以共享同一个状态。
    • 生命周期:@State修饰的状态和其所属的自定义组件共享生命周期,在组件内定义时创建,组件销毁时被回收。
  2. @State+@Link

    • 共享范围:与@State+@Prop相同,即从@State所在的组件开始,到@Link所在组件的整条路径。
    • 生命周期:@Link装饰的变量和其所属的自定义组件共享生命周期。
    • 特点:@Link装饰的变量是对父组件传入状态的引用的拷贝,两者指向同一个地址,因此可以实现双向绑定。
  3. @State+@Observed+@ObjectLink

    • 共享范围:适用于需要观察嵌套类对象属性变化的场景。
    • 使用方式:@ObjectLink只支持接收被@Observed装饰的class实例及继承Date或者Array的class实例。@ObjectLink装饰的变量是只读的,不支持对状态重新赋值。
  4. @Provide+@Consume

    • 共享范围:以@Provide所在组件为祖先节点的整棵子树,子树上的任意后代组件通过@Consume都可以共享同一个状态。
    • 生命周期:@Provide修饰的变量与其所属的组件绑定,在组件内定义时被创建,在组件销毁时被回收。
    • 特点:适用于跨组件层级较深或共享的信息对于整个组件树是“全局”存在的场景。
  5. AppStorage

    • 共享范围:应用全局。
    • 生命周期:AppStorage与应用的进程绑定,由UI框架在应用程序启动时创建,当应用进程终止,AppStorage被回收。
    • 特点:适用于需要在整个应用范围内共享的状态。
  6. LocalStorage

    • 共享范围:UIAbility内以页面为单位的不同组件树间的共享。
    • 生命周期:存储在LocalStorage中的状态的生命周期与LocalStorage绑定。LocalStorage的声明周期由应用程序决定,当应用释放最后一个指向LocalStorage的引用时,LocalStorage被垃圾回收。
    • 特点:适用于在单个页面或UIAbility内不同组件树间共享的状态。

这些装饰器组合提供了灵活且强大的状态管理机制,允许开发者根据具体需求选择最合适的方案来实现组件间的状态共享。

1 个回答

@State+@Prop:适用于父子组件间共享状态,且共享状态的组件间层级相差不大的场景。
@State+@Link:适用于状态结构复杂,且共享状态的组件间层级相差不大的场景,或要求子组件对状态的修改实时同步给父组件的场景。
@State+@Observed+@ObjectLink:适用于需要观察嵌套类对象的子属性变化的场景或对象数组的数据项属性变化的场景。
@Provide+@Consume:适用于状态共享范围是以@Provide所在组件为祖先节点的整棵子树,子树上的任意后代组件通过@Consume共享同一个状态。
AppStorage:适用于应用全局的状态共享。
LocalStorage:适用于UIAbility内以页面为单位的不同组件树间的状态共享。

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进