在鸿蒙ArkTS中开发自定义组件时,为何需要使用@Local装饰器而非普通的类属性?
bug处理机 2026-05-31 02:13:34 在鸿蒙ArkTS中开发自定义组件时,为何需要使用@Local装饰器而非普通的类属性?
您需要先 登录 才能评论/回答
全部评论(1)
@Local是状态管理V2中用于定义组件内部状态的核心装饰器。普通类属性不具备状态响应能力——当属性值变化时,UI不会自动刷新。而@Local装饰的变量会被框架深度观测,任何变化都会精准触发依赖该变量的UI组件重新渲染。@Local相比V1中的@State有几个优势:第一,@Local只能在@ComponentV2中使用,类型推断更准确;第二,@Local配合@Monitor可以实现更细粒度的变化监听;第三,@Local变量可以被@Param初始化,形成数据流闭环。使用@Local时需要注意:变量必须在声明时初始化或通过构造函数初始化;不能与@Param同时装饰同一个变量;对于对象类型,如需观测内部属性变化,该对象的类必须使用@ObservedV2装饰,且属性使用@Trace装饰。
@Entry
@ComponentV2
struct LocalDemo {
@Local count: number = 0; // 状态变量
@Local user: User = new User('张三', 25); // 对象类型
build() {
Column({ space: 16 }) {
Text(计数: this.count‘).fontSize(24)‘<br>‘Button(′增加′).onClick(()=>this.count++;)‘<br>‘‘<br>‘Text(‘用户:this.count‘).fontSize(24)‘<br>‘Button(′增加′).onClick(()=>this.count++;)‘<br>‘‘<br>‘Text(‘用户:{this.user.name}, 年龄: ${this.user.age})
Button('修改年龄').onClick(() => { this.user.age++; })
}
}
}
// 配套的ObservedV2类
@ObservedV2
class User {
@Trace name: string;
@Trace age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}
2026-05-31 02:13:49