HarmonyOS 鸿蒙Next:@ObjectLink和@State的区别

发布于 1周前 作者 nodeper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next:@ObjectLink@State的区别

// objectLinkNestedObjects.ets
let NextID: number = 1;

@Observed class Bag { public id: number; public size: number;

constructor(size: number) { this.id = NextID++; this.size = size; } }

@Observed class User { public bag: Bag;

constructor(bag: Bag) { this.bag = bag; } }

@Observed class Book { public bookName: BookName;

constructor(bookName: BookName) { this.bookName = bookName; } }

@Observed class BookName extends Bag { public nameSize: number;

constructor(nameSize: number) { // 调用父类方法对nameSize进行处理 super(nameSize); this.nameSize = nameSize; } }

@Component struct ViewC { label: string = ‘ViewC1’; // @ObjectLink bookName: BookName; @State bookName: BookName = new BookName(0); // 修改点

build() { Row() { Column() { Text(ViewC [${<span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.label}] <span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.bookName.size = ${<span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.bookName.size}) .fontColor(’#ffffffff’) .backgroundColor(’#ff3d9dba’) .width(320) .height(50) .borderRadius(25) .margin(10) .textAlign(TextAlign.Center) } .width(320) } } }

@Entry @Component struct ViewB { @State child: Book = new Book(new BookName(0));

build() { Column() { ViewC({ label: ‘ViewC #3’, bookName: this.child.bookName }) .width(320) Button(ViewB: <span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.child.bookName.size add <span class="hljs-number"><span class="hljs-number">10</span></span>) .width(320) .backgroundColor(’#ff17a98d’) .margin(10) .onClick(() => { this.child.bookName.size += 10 console.log(‘this.child.bookName.size:’ + this.child.bookName.size) }) } } }<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

读了指南里的“@Observed装饰器和@ObjectLink装饰器”一节后,对“嵌套对象”里的示例有了一个疑问,我把@ObjectLink修饰的变量换成@State来修饰,点击父组件的Button后子组件ViewC一样能刷新UI(如上面代码中的修改点),那么它俩的区别到底在哪里,请高人指教~

9 回复

仔细阅读一下[@State](/user/State)和[@ObjectLink](/user/ObjectLink)文档中对状态变量观察的描述,及哪种场景下[@State](/user/State)无法对数据变化刷新UI,就能明白两者区别。当然数据嵌套层次是两者区分的关键,看看文档中的示例的数据结构进行对比能找到问题关键。

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-state-V5#%E8%A7%82%E5%AF%9F%E5%8F%98%E5%8C%96

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-observed-and-objectlink-V5

说白了应该是v1装饰器的设计错误,@State的变量不应该允许被外部赋值,V2就修改了这一点

没关系,后面你碰到对象数组的时候就会知道了
是的 在面对 [@Observed](/user/Observed) 状态时,他们表现一致,这可能是v1的设计错误之一?

所以让人很费解

希望HarmonyOS能继续加强与其他应用的兼容性,让用户体验更加完美。

换v2装饰器吧,单向数据流比较清晰直观

好的,等我有空了学习一下v2装饰器~

在HarmonyOS开发中,@ObjectLink@State是两种不同的注解,用于不同的场景和目的。@ObjectLink通常用于关联对象数据,它允许组件与外部数据对象建立链接,当对象数据变化时,组件可以自动刷新以反映最新数据,常用于数据绑定和响应式编程。而@State则是用于声明组件的内部状态变量,当这些状态变量的值变化时,组件会重新渲染以更新UI。简而言之,@ObjectLink关注于数据链接与响应,@State关注于组件内部状态管理。如果问题依旧没法解决请加我微信,我的微信是itying888。

回到顶部