[HarmonyOS][K老师]如何监听数组内对象属性变化?
原创
13697 浏览 359 点赞 0 收藏
一句话=》通过@Observed配合@ObjectLink装饰符实现。@Observed用于类,@ObjectLink用于变量。在类上使用@Observed。
以下是详细实现逻辑和步骤:
1. 核心装饰器作用
| 装饰器 | 作用对象 | 功能描述 |
|---|---|---|
@Observed | 类 | 标记类为可观察对象,系统自动生成代理类监听类内部嵌套对象属性的变化。 |
@ObjectLink | 变量 | 建立与@Observed类实例的双向绑定,监听对象内部属性变化并触发UI更新。 |
2. 实现步骤详解
步骤1:定义被观察的类
用@Observed装饰需要监听内部属性变化的类:
@Observed
class User {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}步骤2:在父组件中管理数组
使用@State管理数组本身(监听数组引用变化):
@State users: User[] = [
new User('Alice', 25),
new User('Bob', 30)
];步骤3:子组件中绑定对象
在子组件中使用@ObjectLink绑定数组中的具体对象:
@Component
struct UserItem {
@ObjectLink user: User // 深度监听user对象的属性变化
build() {
Column() {
Text(this.user.name).fontSize(20)
Text(`Age: ${this.user.age}`).onClick(() => {
this.user.age += 1 // 修改属性自动触发UI更新
})
}
}
}步骤4:父组件遍历数组
父组件通过ForEach渲染子组件并传递数组元素:
@Entry
@Component
struct UserList {
@State users: User[] = [...] // 步骤2的数组
build() {
Column() {
ForEach(this.users,
(user: User) => {
UserItem({ user: user }) // 传递数组元素给子组件
},
(user: User) => user.name // 唯一键值
)
}
}
}3. 关键注意事项
- 引用不变性直接修改对象属性(this.user.age = 30)可触发更新不可替换整个对象(this.user = new User(...) 无效),需用数组方法修改原数组:// 正确做法:修改数组元素属性 this.users[0].age = 26; // 错误做法:ObjectLink绑定会丢失 this.users[0] = new User('Carol', 28);
- 数组操作规范改变数组长度需使用响应式API:// 添加元素 this.users.push(new User('David', 35)); this.users = [...this.users]; // 触发ForEach更新 // 删除元素 this.users.splice(index, 1); this.users = this.users.slice();
- 性能优化@ObjectLink比@Link更高效,只监听对象属性而非整个数组嵌套对象需逐层用@Observed装饰(如User内部有Address类也需装饰)
4. 完整流程
A[父组件] -- 传递数组元素 --> B[子组件]
subgraph 父组件
A1[ @State users: User[] ] --> A2[ForEach渲染]
subgraph 子组件-- @ObjectLink user --> [监听属性变化]--> {属性修改}-- 触发 --> [UI自动更新]
总结
- @Observed + @ObjectLink:实现对象属性级监听,避免全数组刷新
- 修改对象属性:直接赋值(obj.prop = value)
- 修改数组结构:用响应式操作(push/splice + 解构赋值)
- 嵌套对象:每层类都需加@Observed装饰
此方案是鸿蒙深度状态管理的核心设计,可高效处理复杂数据结构的局部更新需求。
©本站发布的所有内容,包括但不限于文字、图片、音频、视频、图表、标志、标识、广告、商标、商号、域名、软件、程序等,除特别标明外,均来源于网络或用户投稿,版权归原作者或原出处所有。我们致力于保护原作者版权,若涉及版权问题,请及时联系我们进行处理。
分类
HarmonyOS
标签
HarmonyOS
K老师
监听数据对象
暂无评论数据
发布
相关推荐
微信鸿蒙版 App 扫码登录手表端要求公布,手机系统需升级至 HarmonyOS 6.0.0.130 及以上版本
1361
02026 HarmonyOS Connect伙伴峰会上海站圆满结束
1656
0鸿蒙生态如何吸引800万开发者共建?
2630
098寸国产化户外广告屏一体机鸿蒙HarmonyOS系统校园
阿杰的阳光笔记
2801
0K老师
大家好我是K老师,这是我的个人介绍:鸿蒙先锋,鸿蒙开发者达人,鸿蒙应用架构师,HDG组织者,可0-1开发纯血鸿蒙应用,可0-1开发前端加鸿蒙混合应用,可0-1开发PC端鸿蒙应用。
118
帖子
0
提问
1412
粉丝
最新发布
[HarmonyOS][K老师]鸿蒙中主线程与子线程通信机制详解,Emitter,Worker,EventHandler和EventRunner。
2026-01-28 11:31:47 发布[HarmonyOS][K老师]鸿蒙大文件上传方案。
2026-01-28 10:30:53 发布热门推荐