HarmonyOS 有没有办法动态添加组件?

根据网络请求结果,添加不同的组件,目前使用的方法是:先预埋上组件,网络请求后,修改状态,添加或者移除组件。这样的做法不灵活,必须先预埋组件,有没有像其他平台那样的命令式addView的方式

HarmonyOS
2024-10-21 10:30:30
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
put_get

可以通过NodeContainer实现,参考文档:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-arkui-nodecontroller-V5

您的需求可以通过wrapBuilder封装全局@Builder来实现,不同的组件可以设置不同的@Builder您可以参考文档:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-wrapbuilder-V5

可以参考以下代码:

// 定义一个空的builder  
@Builder  
function defaultBuilder(): void {}  
  
// 定义一个class,有对应的WrappedBuilder  
export class DataModel {  
  id: string = ''  
  value: string = ''  
  otherProp: string = ''  
  builderWrap: WrappedBuilder<[string]> = wrapBuilder(defaultBuilder)  
  
  constructor(id: string, value: string, builderWrap: WrappedBuilder<[string]>) {  
    this.id = id  
    this.value = value  
    this.builderWrap = builderWrap  
  }  
}  
  
@Builder  
function CustomBuilder(param: string) {  
  Column() {  
    Text(param)  
      .fontSize(50)  
      .fontWeight(FontWeight.Bold)  
  }.height(50)  
}  
  
let customPageWrappedBuilder: WrappedBuilder<[string]> = wrapBuilder(CustomBuilder);  
  
export function getNewsData(): Promise<DataModel[]> {  
  let arr: DataModel[] = [new DataModel('1', 'test1', customPageWrappedBuilder), new DataModel('2', 'test2', customPageWrappedBuilder)]  
  return new Promise((resolve) => {  
    resolve(arr)  
  })  
}  
  
export function getNewsItem(id: string, value: string): Promise<DataModel> {  
  return new Promise((resolve) => {  
    resolve(new DataModel(id, value, customPageWrappedBuilder))  
  })  
}  
  
@Entry  
@Component  
struct WrapperBuilderPage {  
  @State testData: DataModel[] = []  
  @State count: number = 2  
  
  async aboutToAppear() {  
    this.testData = await getNewsData();  
  }  
  build() {  
    Column() {  
      Row() {  
        Button('addView').onClick(async () => {  
          this.count++  
          let newsItem: DataModel = await getNewsItem('' + this.count, 'test' + this.count)  
          this.testData.push(newsItem)  
        })  
        Button('removeView').onClick(async () => {  
          this.count--  
          this.testData.pop()  
        })  
      }  
      Column() {  
        ForEach(this.testData, (item: DataModel) => {  
          item.builderWrap.builder(item.value)  
        })  
      }  
    }  
    .width('100%')  
    .height('100%')  
  }  
}
分享
微博
QQ
微信
回复
2024-10-21 16:56:15
相关问题
DirectionalLayout 动态添加组件问题
4532浏览 • 1回复 待解决
ets怎么实现动态添加组件
3496浏览 • 1回复 待解决
有没有什么办法组件新增方法?
756浏览 • 1回复 待解决