系列文章目录
1.HarmonyOS | 状态管理(一) | @State装饰器
2.HarmonyOS | 状态管理(二) | @Prop装饰器
3.HarmonyOS | 状态管理(三) | @Link装饰器
4.HarmonyOS | 状态管理(四) | @Provide和@Consume装饰器
前言
学习到这里,我们之前只是学习了单个类或者属性状态的管理,现在我们这篇就讲讲多个类,数组,嵌套类的状态管理:@Observed装饰器和@ObjectLink装饰器
一、@ObjectLink和@Observed类装饰器用于哪些场景?
@ObjectLink和@Observed类装饰器用于在涉及嵌套对象或数组的场景中进行双向数据同步
二、特性
-
被 @Observed 装饰的类,可以被 观察到属性的变化;
-
子组件 中 @ObjectLink装饰器 装饰的状态变量用于 接收@Observed装饰的类的实例,和 父组件 中 对应的状态变量 建立 双向数据绑定 。
-
单独 使用 @Observed 是 没有任何作用的,需要搭配 @ObjectLink 或者 @Prop 使用。
三、限制条件
- 使用 @Observed 装饰class会 改变class原始的原型链,@Observed和其他类装饰器装饰同一个class可能会带来问题。
- @ObjectLink装饰器 不能 在 @Entry装饰 的自定义组件中使用。
四、使用场景
1.观察变化和行为表现
观察的变化
class ClassA {
public c: number;
constructor(c: number) {
this.c = c;
}
}
@Observed
class ClassB {
public a: ClassA;
public b: number;
constructor(a: ClassA, b: number) {
this.a = a;
this.b = b;
}
}
行为表现
@ObjectLink b: ClassB
// 赋值变化可以被观察到
this.b.a = new ClassA(5)
this.b.b = 5
// ClassA没有被@Observed装饰,其属性的变化观察不到
this.b.a.c = 5
注:ClassB被@Observed装饰,其成员变量的赋值的变化是可以被观察到的,但对于ClassA,没有被@Observed装饰,其属性的修改不能被观察到。
2.嵌套对象
数据结构
// objectLinkNestedObjects.ets
let NextID: number = 1;
@Observed
class ClassA {
public id: number;
public c: number;
constructor(c: number) {
this.id = NextID++;