HarmonyOS 鸿蒙Next UI 局部不更新问题:state为复合class A类型,包含class B,class B的成员title作为text的文本时,更新title但text不刷新
HarmonyOS 鸿蒙Next UI 局部不更新问题:state为复合class A类型,包含class B,class B的成员title作为text的文本时,更新title但text不刷新
// 以下是嵌套类对象的数据结构。 @Observed class ClassA { public title: string;
constructor(title: string) { this.title = title; } }
@Observed class ClassB { public name: string; public a: ClassA;
constructor(name: string, a: ClassA) { this.name = name; this.a = a; } }
@Entry @Component struct Parent { @State votes: ClassB = new ClassB(‘Hello’, new ClassA(‘world’))
build() { Column() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center }) { Button(‘change ClassB name’) .width(312) .height(40) .margin(12) .fontColor(’#FFFFFF,90%’) .onClick(() => { this.votes.name = “aaaaa” }) Button(‘change ClassA title’) .width(312) .height(40) .margin(12) .fontColor(’#FFFFFF,90%’) .onClick(() => { this.votes.a.title = “wwwww” }) Text(this.votes.name) .fontSize(16) .margin(12) .width(312) .height(40) .backgroundColor(’#ededed’) .borderRadius(20) .textAlign(TextAlign.Center) .fontColor(’#e6000000’) .onClick(() => { this.votes.name = ‘Bye’ }) Text(this.votes.a.title) .fontSize(16) .margin(12) .width(312) .height(40) .backgroundColor(’#ededed’) .borderRadius(20) .textAlign(TextAlign.Center) .onClick(() => { this.votes.a.title = “openHarmony” })//点击这个text,仅仅更新Child1 Child1({ vote1: this.votes.a }) }
}
} }
@Component struct Child1 { @Prop vote1: ClassA = new ClassA(’’);
build() { Column() { Text(this.vote1.title) .fontSize(16) .margin(12) .width(312) .height(40) .backgroundColor(’#ededed’) .borderRadius(20) .textAlign(TextAlign.Center) .onClick(() => { this.vote1.title = ‘Bye Bye’ }) } } } 参考连接
更多关于HarmonyOS 鸿蒙Next UI 局部不更新问题:state为复合class A类型,包含class B,class B的成员title作为text的文本时,更新title但text不刷新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
Text(this.votes.a.title)这个控件更新时,如果this.votes.a.title的值和Text(this.votes.a.title)当前显示的内容不匹配,Text(this.votes.a.title)会被更新。
点击{ vote1: this.votes.a } 更新title内容,{ vote1: this.votes.a }会更新,但Text(this.votes.a.title) 这个不会更新。这个是正确的,因为child1中vote1被@prop修饰。
重点是我点击Text(this.votes.a.title),更新this.votes.a.title的值后,{ vote1: this.votes.a } 可以更新UI,这个我理解,因为vote1在child1中为@prop修饰,因此可以刷新。但是Text(this.votes.a.title) 这个不会更新。这个就很奇怪了。class A被@observed, 看起来Observed修饰class A没有作用。那么(被observed修饰的对象A)被@state修饰的对象B作为内部属性a时,如何使得与对象B.a.title的属性绑定的控件text,在对象A的属性变化可以被发现,然后触发text的刷新
更多关于HarmonyOS 鸿蒙Next UI 局部不更新问题:state为复合class A类型,包含class B,class B的成员title作为text的文本时,更新title但text不刷新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
@State 监控不到复合的,要用 @Observerd 和 @ObjectLink 搭配。
classB 已经@Observerd,
@ObjectLink 该如何配置?
HarmonyOS的分布式文件系统让我在多设备间共享文件变得更加方便。
针对HarmonyOS鸿蒙Next UI局部不更新问题,当state为复合类型(如class A包含class B),且class B的成员变量title作为text组件的文本时,若更新title但text不刷新,可能的原因及解决方案如下:
-
数据绑定问题:确保text组件正确绑定了class B的title成员。检查数据绑定表达式是否正确,例如
{{b.title}}
,其中b是class A中class B的实例。 -
状态管理:若使用了状态管理库或框架,确保更新title时触发了状态更新。鸿蒙系统中,状态更新需通过特定的机制通知UI层,检查是否有遗漏。
-
不可变数据:若class B或其成员被设计为不可变,更新title可能未实际改变对象状态。尝试使用可变数据结构或重新赋值整个对象。
-
组件生命周期:检查text组件是否在更新title前被销毁或未正确初始化。确保组件在数据更新时处于活动状态。
-
异步更新:若title更新是在异步操作中完成,确保异步操作完成后正确触发了UI更新。
如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html