鸿蒙_自定义组件包含多个引用自定义构建函数@BuilderParam时的用法

有时候我们为了增加自定义组件的灵活性,可能放置多个引用自定义构建函数(通过@BuilderParam修饰的变量,指向一个自定义构建函数),那么和只有一个时有什么区别呢,我们新建一个页面来测试一下:

TypeScript 复制代码
@Entry
@Component
struct TestBuilderParamInMultiComponent {
  @State message: string = 'Test @BuilderParam In Multiple Component';

  //编写一个自定义构建函数,用于替换自定义组件的部分UI
  @Builder
  builderInMainPage() {
    Row() {
      Text('在父组件中定义、').fontColor(Color.Green)
      Text('自定义构建函数作为参数')
    }
  }

  build() {
    Column() {
      Text(this.message)
        .margin({ bottom: 10 })
        .fontSize(15)
        .fontWeight(FontWeight.Bold)

      //不传参(如果自定义组件内的builderParamInComp加了@Require不传会报错)
      CompWithTwoBuilderParam()

      // 普通传参1个
      CompWithTwoBuilderParam({
        builderParam2InComp: this.builderInMainPage
      })

      // 普通传参2个
      CompWithTwoBuilderParam({
        builderParam1InComp: this.builderInMainPage,
        builderParam2InComp: this.builderInMainPage
      })

      //尾随闭包不可用,会报错
      /*CompWithTwoBuilderParam() {
        Row() {
          Text('尾随闭包不适用多@BuilderParam参数')
        }
      }*/

    }
    .padding(10)
    .height('100%')
    .width('100%')
  }
}

//自定义组件
@Component
struct CompWithTwoBuilderParam {
  //自定义构建函数1
  @Builder
  builder1InComp() {
    Text('1、自定义构建函数1的默认内容')
  }
  //自定义构建函数2
  @Builder
  builder2InComp() {
    Text('2、自定义构建函数2的默认内容')
  }

  //引用自定义构建函数1(把自定义构建函数整体作为一个参数)
  //@Require
  @BuilderParam
  builderParam1InComp: () => void = this.builder1InComp;

  //引用自定义构建函数2
  //@Require
  @BuilderParam
  builderParam2InComp: () => void = this.builder2InComp;

  build() {
    Column({ space: 10 }) {
      Text('这是一个自定义组件').fontWeight(FontWeight.Bold)
      this.builderParam1InComp()
      this.builderParam2InComp()
    }
    .padding(10)
    .width('100%')
    .margin({ bottom: 10 })
    .border({ width: 1, color: Color.Blue })
  }
}

通过测试我们发现,在有多个@BuilderParam修饰的参数时,之前的尾随闭包方式不可用了,因为尾随闭包在调用自定义组件时,在后边大括号内直接写UI组件,是不指定参数名的,那么当参数大于1个时,就不知道该传给谁了,所以就不能再使用了。另外,如果我们在参数上没有设置@Require的必传验证,那么我们可以不传参或传部分参数,未传参的则保持默认值。


实际运行效果如下:

相关推荐
想你依然心痛17 小时前
HarmonyOS ArkUI Swiper 轮播组件深度封装与工程化实践
swiper·arkui·lazyforeach·轮播组件·自动播放·指示器定制·一多适配
想你依然心痛17 小时前
HarmonyOS ArkUI Scroll 滚动容器组件深度封装与工程化实践
arkui·下拉刷新·scroll·上拉加载·lazyforeach·滚动容器·嵌套滚动
程序员黑豆19 小时前
鸿蒙应用开发:@Provider 与 @Consumer 跨组件双向同步详解
前端·harmonyos
程序员黑豆20 小时前
鸿蒙应用开发之跨组件传参:@Provide 与 @Consume 跨层级数据同步详解
前端·harmonyos
懿路向前20 小时前
【HarmonyOS学习笔记】2026-07-30 | 小艺开放平台智能体接入实战
笔记·学习·harmonyos
大锅盖120 小时前
HarmonyOS ArkTS 的新手练手样例:从 Text 和 Button 开始,做一个会变化的计数页面
华为·harmonyos
袁震1 天前
小图传输,大图呈现——用 HarmonyOS 7 端侧 AI 实现 4 倍图像超分重建
人工智能·华为·harmonyos
结网的兔子1 天前
【前端开发】Web端迁移至 uni-app 及鸿蒙扩展方案对比
前端·uni-app·harmonyos
落叶飘飘s1 天前
餐饮服务与软件创新的融合:解析海底捞 APP 的 Flutter 鸿蒙开发之路
flutter·华为·harmonyos
qizayaoshuap1 天前
# HarmonyOS ArkTS 滑动删除列表实战(三):交互式列表增删操作
华为·harmonyos