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(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(如上面代码中的修改点),那么它俩的区别到底在哪里,请高人指教~
仔细阅读一下[@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
说白了应该是v1装饰器的设计错误,@State的变量不应该允许被外部赋值,V2就修改了这一点
所以让人很费解
换v2装饰器吧,单向数据流比较清晰直观
好的,等我有空了学习一下v2装饰器~
在HarmonyOS开发中,@ObjectLink
和@State
是两种不同的注解,用于不同的场景和目的。@ObjectLink
通常用于关联对象数据,它允许组件与外部数据对象建立链接,当对象数据变化时,组件可以自动刷新以反映最新数据,常用于数据绑定和响应式编程。而@State
则是用于声明组件的内部状态变量,当这些状态变量的值变化时,组件会重新渲染以更新UI。简而言之,@ObjectLink
关注于数据链接与响应,@State
关注于组件内部状态管理。如果问题依旧没法解决请加我微信,我的微信是itying888。