HarmonyOS 鸿蒙Next @ObjectLink和@State的相关疑问
HarmonyOS 鸿蒙Next @ObjectLink和@State的相关疑问
子组件使用@ObjectLink接收来自父组件中用@State 修饰的@Observed的嵌套变量对象,当该对象的嵌套对象属性发生修改时子组件无法刷新UI
[@Observed](/user/Observed)
class Model {
a: A
constructor(a: A) {
this.a = a
}
}
[@Observed](/user/Observed)
class A {
str: string
constructor(str: string) {
this.str = str
}
}
@Component
struct MyView {
[@ObjectLink](/user/ObjectLink) objLink: Model
build() {
Text(`MyView ${this.objLink.a.str}`)
}
}
@Entry
@Component
struct Index {
[@State](/user/State) model: Model = new Model(new A("b"))
build() {
Column({ space: 20 }) {
MyView({ objLink: this.model})
Button("Click")
.onClick(() => {
this.model.a.str = "d"
})
}
.width("100%")
.height("100%")
}
}
更多关于HarmonyOS 鸿蒙Next @ObjectLink和@State的相关疑问的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
@Observed
class Model{
a:A
constructor(a:A) {
this.a =a
}
}
@Observed
class A{
str:string
constructor(str:string) {
this.str = str
}
}
@Component
struct ViewText{
@ObjectLink objLink : Model
build() {
Column({space:20}){
Text(this.objLink.a.str)
}
}
}
@Entry
@Component
struct Index{
@State model : Model = new Model(new A('change'))
build() {
Column({space:20}){
ViewText({objLink:this.model})
Button('click').onClick(()=>{
this.model = new Model(new A('11111'))
})
}
}
}
如果得到的对象并不是通过类构造出的实例,其数据变化无法被观测到,所以不能实现ui刷新。
1.当前你的demo里面传入到ChatItemView里面的是Chat,那你观测的只是Chat,Chat下面的嵌套对象user是观测不到的。
2.ChatItemView子组件正确传入的是user: this.chat.user,从而子组件观测的就是user。
@Observed
class Chat {
user: User
content:string
constructor(user: User, content:string) {
this.user = user
this.content = content
}
}
@Observed
class User {
avatar: string
constructor(str: string) {
this.avatar = str
}
}
@Component
struct ChatItemView {
@ObjectLink user: User
@ObjectLink chat: Chat
build() {
Column() {
Text(`ChatItemView ${this.user.avatar}`)
Text(`ChatItemView ${this.chat.content}`)
Button("Click")
.onClick(() => {
this.user.avatar = "http:sxxxxxxx"
this.chat.content= '变化了'
})
}
}
}
@Entry
@Component
struct Index {
@State chat: Chat = new Chat(new User("http:sxxxx"),'试试看')
build() {
Column({ space: 20 }) {
ChatItemView({ user: this.chat.user,chat:this.chat})
Button("Click")
.onClick(() => {
this.chat.user.avatar = "http:sx"
// this.chat.content= '变化了'
})
}
.width("100%")
.height("100%")
}
}
更多关于HarmonyOS 鸿蒙Next @ObjectLink和@State的相关疑问的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS(鸿蒙)中,@ObjectLink
和 @State
是用于组件间数据绑定和状态管理的关键注解。
@ObjectLink
注解主要用于建立组件间对象引用的链接。它允许一个组件直接引用另一个组件中的对象,从而实现数据共享或操作。这种链接是双向的,当被链接对象的状态发生变化时,所有引用该对象的组件都会自动更新。这有助于简化组件间的通信和数据同步。
@State
注解则用于标记组件的状态变量。在鸿蒙的组件化开发中,组件的状态变化是推动界面更新的关键。通过@State
注解,开发者可以明确哪些变量是组件的状态,鸿蒙框架会在这些变量发生变化时自动触发界面的重新渲染。这确保了用户界面始终与组件的当前状态保持一致。
需要注意的是,@ObjectLink
和 @State
的使用需要遵循鸿蒙的开发规范和最佳实践。例如,应避免在不必要的场景下使用@ObjectLink
,以减少组件间的耦合度;同时,应合理设计组件的状态变量,以确保界面的高效渲染和用户体验的流畅性。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html