HarmonyOS 鸿蒙Next:@ObjectLink和@State的区别
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(
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</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) }) } } }
读了指南里的“@Observed装饰器和@ObjectLink装饰器”一节后,对“嵌套对象”里的示例有了一个疑问,我把@ObjectLink修饰的变量换成@State来修饰,点击父组件的Button后子组件ViewC一样能刷新UI(如上面代码中的修改点),那么它俩的区别到底在哪里,请高人指教~
更多关于HarmonyOS 鸿蒙Next:@ObjectLink和@State的区别的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
仔细阅读一下[@State](/user/State)和[@ObjectLink](/user/ObjectLink)文档中对状态变量观察的描述,及哪种场景下[@State](/user/State)无法对数据变化刷新UI,就能明白两者区别。当然数据嵌套层次是两者区分的关键,看看文档中的示例的数据结构进行对比能找到问题关键。
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-observed-and-objectlink-V5
更多关于HarmonyOS 鸿蒙Next:@ObjectLink和@State的区别的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
说白了应该是v1装饰器的设计错误,@State的变量不应该允许被外部赋值,V2就修改了这一点
所以让人很费解
换v2装饰器吧,单向数据流比较清晰直观
好的,等我有空了学习一下v2装饰器~
在HarmonyOS开发中,@ObjectLink
和@State
是两种不同的注解,用于不同的场景和目的。@ObjectLink
通常用于关联对象数据,它允许组件与外部数据对象建立链接,当对象数据变化时,组件可以自动刷新以反映最新数据,常用于数据绑定和响应式编程。而@State
则是用于声明组件的内部状态变量,当这些状态变量的值变化时,组件会重新渲染以更新UI。简而言之,@ObjectLink
关注于数据链接与响应,@State
关注于组件内部状态管理。如果问题依旧没法解决请加我微信,我的微信是itying888。
更多关于HarmonyOS 鸿蒙Next:@ObjectLink和@State的区别的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html