HarmonyOS 鸿蒙Next @ObjectLink和@State的相关疑问

发布于 1周前 作者 h691938207 最后一次编辑是 5天前 来自 鸿蒙OS

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

2 回复
@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

回到顶部