[HarmonyOS][K老师]如何监听数组内对象属性变化? 原创
头像 K老师 2026-01-01 15:34:10    发布
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. 关键注意事项

  1. 引用不变性直接修改对象属性(this.user.age = 30)可触发更新不可替换整个对象(this.user = new User(...) 无效),需用数组方法修改原数组:// 正确做法:修改数组元素属性 this.users[0].age = 26; // 错误做法:ObjectLink绑定会丢失 this.users[0] = new User('Carol', 28);
  2. 数组操作规范改变数组长度需使用响应式API:// 添加元素 this.users.push(new User('David', 35)); this.users = [...this.users]; // 触发ForEach更新 // 删除元素 this.users.splice(index, 1); this.users = this.users.slice();
  3. 性能优化@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

暂无评论数据

发布

头像

K老师

大家好我是K老师,这是我的个人介绍:鸿蒙先锋,鸿蒙开发者达人,鸿蒙应用架构师,HDG组织者,可0-1开发纯血鸿蒙应用,可0-1开发前端加鸿蒙混合应用,可0-1开发PC端鸿蒙应用。

118

帖子

0

提问

1412

粉丝

关注
热门推荐
地址:北京市朝阳区北三环东路三元桥曙光西里甲1号第三置业A座1508室 商务内容合作QQ:2291221 电话:13391790444或(010)62178877
版权所有:电脑商情信息服务集团 北京赢邦策略咨询有限责任公司
声明:本媒体部分图片、文章来源于网络,版权归原作者所有,我司致力于保护作者版权,如有侵权,请与我司联系删除
京ICP备:2022009079号-2
京公网安备:11010502051901号
ICP证:京B2-20230255