
十一、动态构建UI元素 原创
装饰器@Builder
装饰器@BuilderParam
<font style="color:rgba(0, 0, 0, 0.9);">BuilderParam</font>
该装饰器用于声明任意UI描述的一个元素,类似slot占位符。
链接
简而言之:就是自定义组件允许外部传递 UI
2.1单个@BuilderParam参数
:::info 使用尾随闭包的方式传入:
- 组件内有且仅有一个使用 @BuilderParam 装饰的属性,即可使用尾随闭包
- 内容直接在 {} 传入即可
注意:
- 此场景下自定义组件不支持使用通用属性。
:::
:::info
- 添加自定义组件:
- 定义默认的 Builder
- 添加BuilderParam,添加类型,并设置默认的 Builder
- 组件内部使用 BuilderParam
- 外部使用自定义组件,分别测试传递,不传递 UI 的情况
:::
2.2多个@BuilderParam参数
子组件有多个BuilderParam,必须通过参数的方式来传入
:::info 核心步骤:
- 自定义组件-定义:
- 添加多个 @BuilderParam ,并定义默认值
- 自定义组件-使用
- 通过参数的形式传入多个 Builder,比如
SonCom({ titleBuilder: this.fTitleBuilder, contentBuilder: this.fContentBuilder })
:::
装饰器@Styles
装饰器@Extend
装饰器@CustomDialog
自定义组件@Component
自定义组件基础
在ArkUI中,UI显示的内容均为组件,
由框架直接提供的称为系统组件,由开发者定义的称为自定义组件。
相比于之前学习的轻量级 UI 复用机制 @Builder,
自定义组件的功能更为强大,因为自定义组件可以通过<font style="color:rgba(0, 0, 0, 0.9);">@Prop @Link @BuilderParam</font>
实现父子组件进行传递组件和参数。
开发中如果要进行 UI 或业务逻辑进行复用,需要掌握自定义组件的能力。
1.1基本使用
:::success 说明
自定义组件名、类名、函数名不能和系统组件名相同。
:::
- struct:自定义组件基于struct实现,struct + 自定义组件名 + {...}的组合构成自定义组件,不能有继承关系。对于struct的实例化,可以省略new。
- @Component:@Component装饰器仅能装饰struct关键字声明的数据结构。
- build()函数:build()函数用于定义自定义组件的声明式UI描述,自定义组件必须定义build()函数。
- @Entry:@Entry装饰的自定义组件将作为UI页面的入口。在单个UI页面中,最多可以使用@Entry装饰一个自定义组件。
- @Preview:如果想要单独预览组件,可以使用@Preview 进行装饰
1.2成员函数/变量
自定义组件除了必须要实现build()函数外,还可以定义其他的成员函数,以及成员变量
:::info 注意:
- 不支持静态函数、静态成员变量
- 成员函数、变量均为私有
:::
:::info
- 添加自定义组件
- 定义成员变量(普通变量、状态变量)
- 定义成员函数
- 调用函数,修改成员变量(普通变量、状态变量)
- 使用自定义组件
- 无参数调用
- 传递参数调用
:::
1.3通用样式
自定义组件可以通过点语法的形式设置通用样式,通用事件
:::info
- 添加自定义组件,随意设置内容
- 使用自定义组件,通过点语法设置通用样式
:::
:::info 说明
ArkUI给自定义组件设置样式时,相当于给MyComponent2套了一个不可见的容器组件,而这些样式是设置在容器组件上的,而非直接设置给MyComponent2的Button组件。通过渲染结果我们可以很清楚的看到,背景颜色红色并没有直接生效在Button上,而是生效在Button所处的开发者不可见的容器组件上。
:::
