鸿蒙@Trace 装饰器的深度监听

本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

一、@Trace 装饰器的作用

@Trace 是鸿蒙状态管理V2(ArkUI 3.0)中新增的装饰器,用于 标记类属性,实现以下功能:

  1. 精准监听:当被装饰的属性值变化时,仅触发依赖该属性的UI更新(避免V1中全量刷新的性能问题)。
  2. 嵌套对象支持:支持深度监听对象内部属性或数组元素的变化。
  3. 性能优化:与@ObservedV2配合使用,减少不必要的渲染。

二、@Trace 的使用

1. 基本用法(类属性监听)
@ObservedV2
class User {
  @Trace name: string = 'Alice';  // 标记需监听的属性
  @Trace age: number = 25;
}

@Entry
@ComponentV2
struct UserProfile {
  @Local user: User = new User(); // 初始化状态

  build() {
    Column() {
      Text(`Name: ${this.user.name}`).onClick(() => {
        this.user.name = 'Bob'; // 仅更新Text组件
      })
      Text(`Age: ${this.user.age}`)
    }
  }
}

说明

  • name变化时,仅关联的Text组件会重新渲染,age相关的UI不受影响。
2. 嵌套对象监听
@ObservedV2
class Address {
  @Trace city: string = 'Beijing';
  @Trace street: string = 'Xinyuan';
}

@ObservedV2
class User {
  @Trace address: Address = new Address();
}

@Entry
@ComponentV2
struct Profile {
  @Local user: User = new User();

  build() {
    Column() {
      Text(`City: ${this.user.address.city}`).onClick(() => {
        this.user.address.city = 'Shanghai'; // 深度监听生效
      })
    }
  }
}
3. 数组元素监听
@ObservedV2
class ShoppingCart {
  @Trace items: string[] = ['Apple', 'Banana'];
}

@Entry
@ComponentV2
struct CartPage {
  @Local cart: ShoppingCart = new ShoppingCart();

  build() {
    Column() {
      ForEach(this.cart.items, (item: string) => {
        Text(item).onClick(() => {
          this.cart.items[0] = 'Orange'; // 触发数组元素更新
        })
      })
    }
  }
}

三、@Trace 与 @ObservedV2 的协作

  • @ObservedV2:装饰类,使类具备可监听能力(类似V1的@Observed,但支持深度监听)。
  • @Trace:装饰具体属性,明确指定需要跟踪的字段。

协作规则

  1. 只有被@ObservedV2装饰的类中的@Trace属性才会被监听。
  2. 若类未被@ObservedV2装饰,@Trace不生效。

四、与V1版本的对比

特性V1(@Observed + @Prop/@Link)V2(@ObservedV2 + @Trace)
监听粒度仅类实例级别属性级别(精准更新)
嵌套支持需手动实现深层监听自动支持对象/数组内部变化
性能可能触发多余渲染最小化渲染范围
代码复杂度高(需维护多个装饰器)低(声明式标记)

五、注意事项

  1. 不可滥用:仅对需要响应式更新的属性使用@Trace,避免内存开销。
  2. 不可与@State混用@Trace用于装饰类属性,@State用于组件内部状态。
  3. 类型限制:被@Trace装饰的属性需为可序列化类型(如stringnumberobject等)。

六、完整示例

@ObservedV2
class FormData {
  @Trace username: string = '';
  @Trace password: string = '';
}

@Entry
@ComponentV2
struct LoginPage {
  @Local form: FormData = new FormData();

  build() {
    Column() {
      TextInput({ placeholder: 'Username' })
        .onChange((value: string) => {
          this.form.username = value; // 触发精准更新
        })
      TextInput({ placeholder: 'Password' })
        .onChange((value: string) => {
          this.form.password = value;
        })
      Button('Submit').onClick(() => {
        console.log(this.form);
      })
    }
  }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值