HarmonyOS鸿蒙Next中父组件中的class属性如何和子组件的@Link同步

HarmonyOS鸿蒙Next中父组件中的class属性如何和子组件的@Link同步

父组件中使用@State修饰了一个class,然后将class的一个属性传递给组件,子组件使用[@Link](/user/Link)装饰,这样会异常,请问这种情况应该怎么做

4 回复
class Person{
  name : string="";
  age:number = 0
  constructor(name:string,age:number) {
    this.name = name;
    this.age = age
  }
}
// 父组件
@Component
struct ParentComponent {
  @State person: Person = new Person('John', 30);

  build() {
    Column() {
      ChildComponent({person:this.person})
    }
  }
}

// 子组件
@Component
struct ChildComponent {
  @Link person: Person;

  build() {
    Column({space:15}) {
      Text(`Name: ${this.person.name}`)
      Text(`Age: ${this.person.age}`)
      Button(`Increase Age`)
        .onClick(() => {
          this.person.age++; // 通过引用修改属性
        })
    }
    .width("100%")
} 

没发现什么异常 是不是没有传入参数那个地方写错了

更多关于HarmonyOS鸿蒙Next中父组件中的class属性如何和子组件的@Link同步的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,父组件的class属性通过@Link装饰器与子组件同步需要满足以下条件:

  1. 父组件使用@State装饰变量;
  2. 子组件使用@Link接收该变量;
  3. 父子组件必须在同一个UI树中。

具体实现:父组件中@State classVar=‘class1’,子组件中@Link classVar: string。当父组件修改classVar时,@Link会自动同步更新子组件对应的属性。注意@Link变量在子组件中不可本地修改。

在HarmonyOS Next中,当父组件使用@State修饰的class属性需要通过@Link与子组件同步时,需要注意以下几点:

  1. @Link装饰器要求数据源必须是引用类型(如class实例),且需要父组件通过$符号传递引用:
// 父组件
[@State](/user/State) myClass: MyClass = new MyClass();

build() {
  ChildComponent({ classRef: $myClass })
}

// 子组件
[@Link](/user/Link) classRef: MyClass
  1. 如果直接传递class属性而非整个class实例,应该使用@Prop而非@Link
// 父组件
[@State](/user/State) myClass: MyClass = new MyClass();

build() {
  ChildComponent({ propValue: myClass.someProperty })
}

// 子组件
[@Prop](/user/Prop) propValue: string
  1. 确保class是可观察的,建议使用@Observed装饰class:
[@Observed](/user/Observed)
class MyClass {
  // 属性
}
  1. 如果确实需要双向绑定class的某个属性,可以考虑:
  • 将整个class实例作为@Link传递
  • 在子组件中修改属性后,通过方法通知父组件更新

出现异常通常是因为传递方式不正确或class未标记为@Observed

回到顶部