HarmonyOS @BuilderParam插槽动态获取自组件传递的参数?

如题:HarmonyOS @BuilderParam插槽动态获取自组件传递的参数?

阅读 523
1 个回答

可按照下面方式修改,可刷新界面

该问题的关键是处理this指针指向,TestParent和TestChild修改如下

@Component
struct TestParent {
  private name: string = "TestParent1";
  @State data: Object = new MyData(new MyDataInner(new MyDataInnerInner(111)))
  @BuilderParam outerBuilder: (wrapper: IDataWrapper<Object>) => void
  @Builder
  BuilderInParent($$: IDataWrapper<Object>) {
    // // 没问题的写法,用的是this的data
    // Stack() {
    // this.outerBuilder({data: this.data})
    // // 目的是为了在这里重写builder,加上背景色等样式
    // }.backgroundColor(Color.Red)

    // 有问题的写法,用的是传参过来的data。因为这个data不能直接放在TestParent中,它会有多个
    Stack() {
      this.outerBuilder({data: $$.data})
      // 目的是为了在这里重写builder,加上背景色等样式
    }.backgroundColor(Color.Red)
  }

  build() {
    TestChild({
      data: this.data,
      outerBuilder1: this.BuilderInParent,
      outerBuilder: this.outerBuilder
    })
  }
}

@Component
struct TestChild {
  private name: string = "TestChild";
  @Link data: Object;
  @BuilderParam outerBuilder1: (data: IDataWrapper<Object>) => void
  @BuilderParam outerBuilder: (data: IDataWrapper<Object>) => void
  build() {
    Stack() {
      this.outerBuilder1({
        data: this.data
      })
      Button("Click").onClick(() => {
        this.data = new MyData(new MyDataInner(new MyDataInnerInner(222)))
      })
    }.width('100%').height('100%')
  }
}

CustomDialogController不支持动态创建也不支持动态修改。

如果场景需要动态创建或者修改请使用opencustomdialog,componentcontent支持@BuilderParam,使用中注意要修改同一个对象或者调用update接口。