HarmonyOS Builder组件嵌套调用时,每个Builder都需要包一层引用才能刷新,有没有更好的办法?

咨询描述:

// fail 问题:无法展示(因为没有wrapper),点击后也无法刷新。

@Builder  
function BuildMyDataInnerInner(inner: MyDataInnerInner) {  
  if (inner instanceof MyDataInnerInner) {  
    Text(inner.msg + ' ').width('100%').height('100%')  
  }else {  
    // 其他判断逻辑  
  }  
}  
  
@Builder  
function BuildMyDataInner(inner: MyDataInner) {  
  if (inner instanceof MyDataInner) {  
    BuildMyDataInnerInner(inner.inner)  
  }else {  
    // 其他判断逻辑  
  }  
}  
  
@Builder  
function BuildMyData(wrapper: IDataWrapper) {  
  if (wrapper instanceof MyData) {  
    BuildMyDataInner(wrapper.inner)  
  }else {  
    // 其他判断逻辑  
  }  
}  
  
@Component  
export struct TestParentParent {  
  private name: string = "TestParentParent";  
  
  build() {  
    TestParent({  
      outerBuilder: BuildMyData  
    })  
  }  
}  
  
class MyDataInnerInner {  
  msg: number;  
  constructor(msg: number) {  
    this.msg = msg;  
  }  
}  
  
class MyDataInner {  
  inner: MyDataInnerInner;  
  constructor(inner: MyDataInnerInner) {  
    this.inner = inner;  
  }  
}  
/**  
 * 需要自定义数据,包一层  
 */  
class MyData {  
  inner: MyDataInner;  
  constructor(inner: MyDataInner) {  
    this.inner = inner;  
  }  
}  
  
  
@Component  
struct TestParent {  
  @BuilderParam outerBuilder: (wrapper: IDataWrapper) => void  
  
  build() {  
    TestChild({  
      outerBuilder: this.outerBuilder  
    })  
  }  
}  
  
  
interface IDataWrapper {  
  data: Object  
}  
  
  
@Component  
struct TestChild {  
  @State data: Object = new MyData(new MyDataInner(new MyDataInnerInner(111)));  
  @BuilderParam outerBuilder: (wrapper: IDataWrapper) => void  
  
  build() {  
    Stack() {  
      this.outerBuilder({  
        data: this.data  
      })  
      Button("Click").onClick(() => {  
        this.data = new MyData(new MyDataInner(new MyDataInnerInner(222)));  
      })  
    }.width('100%').height('100%')  
  }  
}  
// success 问题:可以展示,点击后也可以刷新,但每个builder都要包一层,过于繁琐  
@Builder  
function BuildMyDataInnerInner(inner: IDataWrapper<MyDataInnerInner>) {  
  if (inner.data instanceof MyDataInnerInner) {  
    Text(inner.data.msg + ' ').width('100%').height('100%')  
  }else {  
    // 其他判断逻辑  
  }  
}  
  
@Builder  
function BuildMyDataInner(innerWrapper: IDataWrapper<MyDataInner>) {  
  if (innerWrapper.data instanceof MyDataInner) {  
    BuildMyDataInnerInner({  
      data: innerWrapper.data.inner  
    })  
  }else {  
    // 其他判断逻辑  
  }  
}  
  
@Builder  
function BuildMyData(wrapper: IDataWrapper<Object>) {  
  if (wrapper.data instanceof MyData) {  
    BuildMyDataInner({  
      data: wrapper.data.inner  
    })  
  }else {  
    // 其他判断逻辑  
  }  
}  
  
@Component  
export struct TestParentParent {  
  private name: string = "TestParentParent";  
  
  build() {  
    TestParent({  
      outerBuilder: BuildMyData  
    })  
  }  
}  
  
class MyDataInnerInner {  
  msg: number;  
  constructor(msg: number) {  
    this.msg = msg;  
  }  
}  
  
class MyDataInner {  
  inner: MyDataInnerInner;  
  constructor(inner: MyDataInnerInner) {  
    this.inner = inner;  
  }  
}  
/**  
 * 需要自定义数据,包一层  
 */  
class MyData {  
  inner: MyDataInner;  
  constructor(inner: MyDataInner) {  
    this.inner = inner;  
  }  
}  
  
  
@Component  
struct TestParent {  
  @BuilderParam outerBuilder: (wrapper: IDataWrapper<Object>) => void  
  
  build() {  
    TestChild({  
      outerBuilder: this.outerBuilder  
    })  
  }  
}  
  
  
interface IDataWrapper<T> {  
  data: T  
}  
  
  
@Component  
struct TestChild {  
  @State data: Object = new MyData(new MyDataInner(new MyDataInnerInner(111)));  
  @BuilderParam outerBuilder: (wrapper: IDataWrapper<Object>) => void  
  
  build() {  
    Stack() {  
      this.outerBuilder({  
        data: this.data  
      })  
      Button("Click").onClick(() => {  
        this.data = new MyData(new MyDataInner(new MyDataInnerInner(222)));  
      })  
    }.width('100%').height('100%')  
  }  
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163.
  • 164.
  • 165.
  • 166.
  • 167.
  • 168.
  • 169.
  • 170.
  • 171.
  • 172.
  • 173.
  • 174.
  • 175.
  • 176.
  • 177.
  • 178.
  • 179.
  • 180.
  • 181.
  • 182.
  • 183.
  • 184.
  • 185.
  • 186.
  • 187.
  • 188.
  • 189.
  • 190.
  • 191.
  • 192.
  • 193.
  • 194.
  • 195.
HarmonyOS
2024-10-24 12:44:25
浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
Heiang

1.Builder调用Builder的时候,需要按照键值对的形式传入。

2.Builder传参的时候需要使用$$。

@Entry  
@Component  
export struct TestParentParent {  
  @State data: MyData = new MyData(new MyDataInner(new MyDataInnerInner(111)));  
  build() {  
    Column(){  
      Button("Click").onClick(() => {  
        this.data = new MyData(new MyDataInner(new MyDataInnerInner(222)));  
      })  
      BuildMyData({data: this.data})  
      // TestParent({  
      //   outerBuilder: BuildMyData  
      // })  
    }  
  }  
}  
  
@Component  
struct TestParent {  
  // @BuilderParam outerBuilder: (wrapper: IDataWrapper) => void  
  @Prop data: number = 0;  
  
  build() {  
    Row() {  
      TestChild({  
        data: this.data  
      })  
    }  
  }  
}  
  
@Component  
struct TestChild {  
  @Prop data: number = 0;  
  // @BuilderParam outerBuilder: (wrapper: IDataWrapper) => void  
  
  build() {  
    Row() {  
      Text(this.data + ' ')  
    }  
    // this.outerBuilder(  
    //   {data: this.data}  
    // )  
    // Button("Click").onClick(() => {  
    //   // (this.data as MyData).inner.inner.msg = 222;  
    //   this.data = new MyData(new MyDataInner(new MyDataInnerInner(222)));  
    // })  
  }  
}  
@Builder  
function BuildMyDataInnerInner($$: IDataWrapper) {  
  if ($$.data instanceof MyData) {  
    TestParent({ data: $$.data.inner.inner.msg})  
  }else {  
    // 其他判断逻辑  
  }  
}  
  
@Builder  
function BuildMyDataInner($$: IDataWrapper) {  
  if ($$.data instanceof MyData) {  
    BuildMyDataInnerInner({ data: $$.data})  
  }else {  
    // 其他判断逻辑  
  }  
}  
  
@Builder  
function BuildMyData($$: IDataWrapper) {  
  if ($$.data instanceof MyData) {  
    Column() {  
      BuildMyDataInner({ data: $$.data})  
    }  
  }else {  
    // 其他判断逻辑  
  }  
}  
  
  
interface IDataWrapper {  
  data: Object  
}  
  
class MyDataInnerInner {  
  msg: number;  
  constructor(msg: number) {  
    this.msg = msg;  
  }  
}  
  
class MyDataInner {  
  inner: MyDataInnerInner;  
  constructor(inner: MyDataInnerInner) {  
    this.inner = inner;  
  }  
}  
/**  
 * 需要自定义数据,包一层  
 */  
class MyData {  
  inner: MyDataInner;  
  constructor(inner: MyDataInner) {  
    this.inner = inner;  
  }  
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
分享
微博
QQ
微信
回复
2024-10-24 15:09:16
相关问题
@Builder使用引用时异常
1448浏览 • 1回复 待解决
HarmonyOS @builder引用传递问题
1278浏览 • 0回复 待解决
HarmonyOS @Builder内容如何刷新
610浏览 • 1回复 待解决
HarmonyOS @builder方法ui不刷新
1225浏览 • 1回复 待解决
HarmonyOS @Builder UI刷新问题
741浏览 • 1回复 待解决
HarmonyOS builder 作为 builder 参数传递
911浏览 • 1回复 待解决
HarmonyOS 想在builder中插入builder
592浏览 • 1回复 待解决
HarmonyOS 有没有办法动态添加组件
1845浏览 • 1回复 待解决