【HarmonyOS 4.0】@BuilderParam 装饰器

花瓣小跑  金牌会员 | 2025-2-13 13:09:42 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 969|帖子 969|积分 2907

1. @BuilderParam 装饰器

   

  • @BuilderParam 装饰器用于装饰自界说组件(struct)中的属性,其装饰的属性可作为一个UI布局的占位符,待创建该组件时,可通过参数为其传入详细的内容。
  • 参数必须满足俩个条件:
    2.1 参数类型必须是个函数;
    2.2 参数必须是个UI布局;
  • 因此这个参数就是 @Builder 方法

  • 使用所属自界说组件的自界说构建函数或者全局自界说构建函数,必要在当地初始化@BuilderParam。
  1. @Builder
  2. function GlobalDoNothingBuilder(): void {
  3. }
  4. @BuilderParam stateComp: () => void = GlobalDoNothingBuilder
复制代码
1.1 代码案例如下:
  1. // 第一个Builder
  2. @Builder
  3. export function imageBuilder() {
  4.   Column({ space: 10 }) {
  5.     Image($r('app.media.app_icon'))
  6.       .width('70%')
  7.       .height('70%')
  8.       .objectFit(ImageFit.Contain)
  9.     Text('@BuilderParam装饰器:引用@Builder函数')
  10.       .fontSize(16)
  11.       .fontWeight(FontWeight.Bold)
  12.   }
  13. }
  14. // 第二个Builder
  15. @Builder
  16. export function textBuilder() {
  17.   Column({ space: 10 }) {
  18.     Text('@BuilderParam装饰器:引用@Builder函数')
  19.       .fontSize(16)
  20.       .fontWeight(FontWeight.Bold)
  21.     Text('当开发者创建了自定义组件,并想对该组件添加特定功能时,例如在自定义组件中添加一个点击跳转操作。若直接在组件内嵌入事件方法,将会导致所有引入该自定义组件的地方均增加了该功能。为解决此问题,ArkUI引入了@BuilderParam装饰器,@BuilderParam用来装饰指向@Builder方法的变量,开发者可在初始化自定义组件时对此属性进行赋值,为自定义组件增加特定的功能。该装饰器用于声明任意UI描述的一个元素,类似slot占位符。')
  22.       .fontSize(14)
  23.       .textOverflow({ overflow: TextOverflow.Ellipsis })
  24.       .maxLines(6)
  25.   }
  26. }
  27. // 自定义子组件
  28. import { textBuilder } from './TextBuilder'
  29. @Extend(Column)
  30. function columnStyle() {
  31.   .width('90%')
  32.   .height(180)
  33.   .borderRadius(10)
  34.   .shadow({ radius: 20 })
  35.   .padding(10)
  36. }
  37. @Component
  38. export struct Card {
  39.   @BuilderParam content: () => void = textBuilder
  40.   build() {
  41.     Column({ space: 20 }) {
  42.       Column() {
  43.         this.content()
  44.       }
  45.       .columnStyle()
  46.     }
  47.   }
  48. }
  49. // 父组件
  50. import { imageBuilder } from "./ImageBuilder"
  51. import { textBuilder } from './TextBuilder'
  52. import { Card } from "./Card"
  53. @Entry
  54. @Component
  55. struct Index {
  56.   private scroller: Scroller = new Scroller()
  57.   build() {
  58.     Scroll(this.scroller) {
  59.       Column({ space: 20 }) {
  60.         Card({ content: imageBuilder })
  61.         Card({ content: textBuilder })
  62.         Divider()
  63.         Card({ content: textBuilder })
  64.         Card({ content: imageBuilder })
  65.       }
  66.       .width('100%')
  67.     }
  68.   }
  69. }
复制代码
1.2 如果一个组件只界说一个 @BuilderParam 属性,那么创建该组件时,也可直接通过“子组件”的方式传入详细的UI布局。
  1. // 子组件
  2. @Extend(Column)
  3. function columnStyle() {
  4.   .width('90%')
  5.   .height(180)
  6.   .borderRadius(10)
  7.   .shadow({ radius: 20 })
  8.   .padding(10)
  9. }
  10. @Component
  11. export struct Card {
  12.   @BuilderParam content: () => void
  13.   build() {
  14.     Column({ space: 20 }) {
  15.       Column() {
  16.         this.content()
  17.       }
  18.       .columnStyle()
  19.     }
  20.   }
  21. }
  22. // 父组件
  23. import { Card } from "./Card"
  24. @Entry
  25. @Component
  26. struct Index {
  27.   build() {
  28.     Column({ space: 20 }) {
  29.       Card() {
  30.         Column({ space: 10 }) {
  31.           Image($r('app.media.app_icon'))
  32.             .width('70%')
  33.             .height('70%')
  34.             .objectFit(ImageFit.Contain)
  35.           Text('@BuilderParam装饰器:引用@Builder函数')
  36.             .fontSize(16)
  37.             .fontWeight(FontWeight.Bold)
  38.         }
  39.       }
  40.     }
  41.     .height('100%')
  42.     .width('100%')
  43.   }
  44. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

花瓣小跑

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表