@ObjectLink和@Observed装饰器用于在涉及嵌套对象或数组元素为对象的场景中进行双向数据同步。
在HarmonyOS应用开发中,@ObjectLink和@Observed是两个重要的注解,它们主要用于实现分布式数据的跨设备传输和同步:
-
@ObjectLink:
- 通俗解释:这个注解可以理解为“对象链接”,用于标记一个类或者类中的属性,使得它具备跨设备的能力。当一个对象被标注了
@ObjectLink
后,它可以作为一个独立的数据实体,在不同的HarmonyOS设备之间进行共享和通信。 - 应用场景:比如在多设备协同场景下,一台设备上的某个数据对象(如播放列表、待办事项等)通过
@ObjectLink
标记后,可以自动地在其他设备上创建对应的实例,并保持数据同步。
- 通俗解释:这个注解可以理解为“对象链接”,用于标记一个类或者类中的属性,使得它具备跨设备的能力。当一个对象被标注了
-
@Observed:
- 通俗解释:
@Observed
注解可以看作是一个“观察者模式”的实现,用在类属性上时,表示该属性的变化会被系统自动监测并实时更新到关联的对象或组件中。 - 工作机制:当一个属性被
@Observed
修饰,当这个属性的值发生变化时,HarmonyOS框架会自动触发相应UI或业务逻辑的更新,无需手动编写监听代码。 - 应用场景:在构建用户界面时尤为实用,例如将
@Observed
应用于模型层的属性,当属性值发生改变时,绑定此属性的UI控件能够自动刷新显示新的内容。
- 通俗解释:
总结
@ObjectLink
注解主要用于支持分布式环境下的数据对象跨设备共享,而@Observed
注解则实现了数据变化与用户界面及业务逻辑之间的自动同步机制,极大地简化了开发者在处理跨设备交互和数据更新方面的开发工作。
@Component
struct TaskItem { @ObjectLink item :Task onTaskChange :()=>void // 定义一个无参数无返回值的函数 build() { Row() { if (this.item.finished) { Text(this.item.name) .fontSize(24) .fontColor(Color.Grey) } else { Text(this.item.name) .fontSize(24) .whiteFont() } Checkbox() .select(this.item.finished) .selectedColor(0xed6f21) .onChange((value: boolean) => { this.item.finished = value this.onTaskChange() // 调用外部传进来的handleChange函数 }) } .card() .justifyContent(FlexAlign.SpaceBetween) .margin(6) }
}
.........
// =======================渲染列表st======================//
List({ space: 10 }) { ForEach(this.tasks, (item: Task, index) => { ListItem() { TaskItem({item:item,onTaskChange:this.handleTaskChange.bind(this)}) // 将Item和函数传入到TaskItem组件中,同时用bind方法绑定this指向 } .swipeAction({ end: this.deleteButton(index) }) // 列表的右滑功能函数 })
}
.width('100%')
.layoutWeight(1) // 将剩下的空间全部给list元素
.alignListItem(ListItemAlign.Center) // 列表元素居中
// =======================渲染列表end======================//