这是用户在 2024-3-23 15:09 为 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-builderparam-0000001820999553 保存的双语快照页面,由 沉浸式翻译 提供双语支持。了解如何保存?
文档管理中心
您当前正在浏览HarmonyOS NEXT Developer Preview1版本的配套文档,该版本API能力级别为API 11 Beta,详细版本配套关系请参考版本说明

@BuilderParam装饰器:引用@Builder函数

更新时间: 2024-03-20 16:40
  • 毫无帮助
  • 帮助不大
  • 一般
  • 很好
  • 非常好
更新时间: 2024-03-20 16:40
添加收藏

当开发者创建了自定义组件,并想对该组件添加特定功能时,例如在自定义组件中添加一个点击跳转操作。若直接在组件内嵌入事件方法,将会导致所有引入该自定义组件的地方均增加了该功能。为解决此问题,ArkUI引入了@BuilderParam装饰器,@BuilderParam用来装饰指向@Builder方法的变量,开发者可在初始化自定义组件时对此属性进行赋值,为自定义组件增加特定的功能。该装饰器用于声明任意UI描述的一个元素,类似slot占位符。

说明

从API version 9开始,该装饰器支持在ArkTS卡片中使用。

装饰器使用说明

初始化@BuilderParam装饰的方法

@BuilderParam装饰的方法只能被自定义构建函数(@Builder装饰的方法)初始化。如果在API 11中和@Require结合使用,则必须父组件构造传参。

  • 使用所属自定义组件的自定义构建函数或者全局的自定义构建函数,在本地初始化@BuilderParam。

    1. @Builder function overBuilder() {}
    2. @Component
    3. struct Child {
    4. @Builder doNothingBuilder() {};
    5. // 使用自定义组件的自定义构建函数初始化@BuilderParam
    6. @BuilderParam customBuilderParam: () => void = this.doNothingBuilder;
    7. // 使用全局自定义构建函数初始化@BuilderParam
    8. @BuilderParam customOverBuilderParam: () => void = overBuilder;
    9. build(){}
    10. }
  • 用父组件自定义构建函数初始化子组件@BuilderParam装饰的方法。

    1. @Component
    2. struct Child {
    3. @Builder customBuilder() {}
    4. // 使用父组件@Builder装饰的方法初始化子组件@BuilderParam
    5. @BuilderParam customBuilderParam: () => void = this.customBuilder;
    6. build() {
    7. Column() {
    8. this.customBuilderParam()
    9. }
    10. }
    11. }
    12. @Entry
    13. @Component
    14. struct Parent {
    15. @Builder componentBuilder() {
    16. Text(`Parent builder `)
    17. }
    18. build() {
    19. Column() {
    20. Child({ customBuilderParam: this.componentBuilder })
    21. }
    22. }
    23. }

    图1 示例效果图

  • 需注意this指向正确。

    以下示例中,Parent组件在调用this.componentBuilder()时,this指向其所属组件,即“Parent”。@Builder componentBuilder()通过this.componentBuilder的形式传给子组件@BuilderParam customBuilderParam,this指向在Child的label,即“Child”。@Builder componentBuilder()通过():void=>{this.componentBuilder()}的形式传给子组件@BuilderParam customChangeThisBuilderParam,因为箭头函数的this指向的是宿主对象,所以label的值为“Parent”。

    复制
    1. @Component
    2. struct Child {
    3. label: string = `Child`
    4. @Builder customBuilder() {}
    5. @Builder customChangeThisBuilder() {}
    6. @BuilderParam customBuilderParam: () => void = this.customBuilder;
    7. @BuilderParam customChangeThisBuilderParam: () => void = this.customChangeThisBuilder;
    8. build() {
    9. Column() {
    10. this.customBuilderParam()
    11. this.customChangeThisBuilderParam()
    12. }
    13. }
    14. }
    15. @Entry
    16. @Component
    17. struct Parent {
    18. label: string = `Parent`
    19. @Builder componentBuilder() {
    20. Text(`${this.label}`)
    21. }
    22. build() {
    23. Column() {
    24. this.componentBuilder()
    25. Child({ customBuilderParam: this.componentBuilder, customChangeThisBuilderParam: ():void=>{this.componentBuilder()} })
    26. }
    27. }
    28. }

图2 示例效果图

使用场景

参数初始化组件

@BuilderParam装饰的方法可以是有参数和无参数的两种形式,需与指向的@Builder方法类型匹配。@BuilderParam装饰的方法类型需要和@Builder方法类型一致。

  1. class Tmp{
  2. label:string = ''
  3. }
  4. @Builder function overBuilder($$ : Tmp) {
  5. Text($$.label)
  6. .width(400)
  7. .height(50)
  8. .backgroundColor(Color.Green)
  9. }
  10. @Component
  11. struct Child {
  12. label: string = 'Child'
  13. @Builder customBuilder() {}
  14. // 无参数类型,指向的componentBuilder也是无参数类型
  15. @BuilderParam customBuilderParam: () => void = this.customBuilder;
  16. // 有参数类型,指向的overBuilder也是有参数类型的方法
  17. @BuilderParam customOverBuilderParam: ($$ : Tmp) => void = overBuilder;
  18. build() {
  19. Column() {
  20. this.customBuilderParam()
  21. this.customOverBuilderParam({label: 'global Builder label' } )
  22. }
  23. }
  24. }
  25. @Entry
  26. @Component
  27. struct Parent {
  28. label: string = 'Parent'
  29. @Builder componentBuilder() {
  30. Text(`${this.label}`)
  31. }
  32. build() {
  33. Column() {
  34. this.componentBuilder()
  35. Child({ customBuilderParam: this.componentBuilder, customOverBuilderParam: overBuilder })
  36. }
  37. }
  38. }

图3 示例效果图

尾随闭包初始化组件

在自定义组件中使用@BuilderParam装饰的属性时也可通过尾随闭包进行初始化。在初始化自定义组件时,组件后紧跟一个大括号“{}”形成尾随闭包场景。

说明
  • 此场景下自定义组件内有且仅有一个使用@BuilderParam装饰的属性。

  • 此场景下自定义组件不支持使用通用属性。

开发者可以将尾随闭包内的内容看做@Builder装饰的函数传给@BuilderParam。示例如下:

  1. @Component
  2. struct CustomContainer {
  3. @Prop header: string = '';
  4. @Builder closerBuilder(){}
  5. // 使用父组件的尾随闭包{}(@Builder装饰的方法)初始化子组件@BuilderParam
  6. @BuilderParam closer: () => void = this.closerBuilder
  7. build() {
  8. Column() {
  9. Text(this.header)
  10. .fontSize(30)
  11. this.closer()
  12. }
  13. }
  14. }
  15. @Builder function specificParam(label1: string, label2: string) {
  16. Column() {
  17. Text(label1)
  18. .fontSize(30)
  19. Text(label2)
  20. .fontSize(30)
  21. }
  22. }
  23. @Entry
  24. @Component
  25. struct CustomContainerUser {
  26. @State text: string = 'header';
  27. build() {
  28. Column() {
  29. // 创建CustomContainer,在创建CustomContainer时,通过其后紧跟一个大括号“{}”形成尾随闭包
  30. // 作为传递给子组件CustomContainer @BuilderParam closer: () => void的参数
  31. CustomContainer({ header: this.text }) {
  32. Column() {
  33. specificParam('testA', 'testB')
  34. }.backgroundColor(Color.Yellow)
  35. .onClick(() => {
  36. this.text = 'changeHeader';
  37. })
  38. }
  39. }
  40. }
  41. }

图4 示例效果图

以上内容对您是否有帮助?

  • 毫无帮助
  • 帮助不大
  • 一般
  • 很好
  • 非常好
意见反馈
更多帮助请到“社区论坛”,如需要其他帮助,请通过“智能客服”提问。
搜索 指南
  • 全部
  • 入门
共有0条内容
  • 解决方案

    精准高效的一站式服务支持,助力开发者商业成功

  • 合作咨询

    我们的专家服务团队将竭诚为您提供专业的合作咨询服务

  • 智能客服

    您的每一次的提问,都能匹配最合适的答案

  • 快速入门

    面向开发者提供快速入门指南,轻松找到你想要的各类资源