前言
上一篇文章我们介绍了声明式UI描述和自定义组件的基本用法,现在我们系统的看看自定义组件的结构、成员函数、变量等.在 《遥遥领先,HaemonyOS的ArkTS应用入门实操》文章里面我们讲解了 ArkTS 的基本代码组成,这里我们看看具体的组件结构.
组件的基本结构
Struct 基本结构
自定义组件基于struct实现
struct 自定义组件名 {...}的组合构成自定义组件
- 不能有继承关系
- 对于struct的实例化 可以省略new
Custom components cannot extend or implement other classes and interfaces. <etsLint> 自定义组件无法扩展或实现其他类和接口。<etsLint> ⚠️ 自定义组件名、类名、函数名不能和系统组件名相同
Component 基本结构
A function or a method can only be decorated by one of the 'Extend, Builder and Styles'. <etsLint> 函数或方法只能由“扩展、生成器和样式”之一修饰。<etsLint>
- struct被@Component装饰后具备组件化的能力
- 需要实现build方法描述UI
This custom component must have a 'build' function. <etsLint> 此自定义组件必须具有“build”功能。<etsLint>
- 一个struct只能被一个@Component装饰
Duplicate decorators for struct are not allowed. <etsLint> 不允许使用重复的 struct 装饰器。<etsLint>
Build 基本结构
build()函数用于定义自定义组件的声明式UI描述,自定义组件必须定义build()函数
This custom component must have a 'build' function. <etsLint> 此自定义组件必须具有“build”功能。<etsLint>
Build() 函数
所有声明在build()函数的语言,我们统称为UI描述.
- @Entry装饰的自定义组件,其build()函数下的根节点唯一且必要,且必须为容器组件,其中ForEach禁止作为根节点。
- @Component装饰的自定义组件,其build()函数下的根节点唯一且必要,可以为非容器组件,其中ForEach禁止作为根节点。
和 Vue2 一样需要根节点只能一个
- 不允许声明本地变量
- 不允许在UI描述里直接使用console.info,但允许在方法或者函数里使用
- 不允许创建本地的作用域
- 不允许调用没有用@Builder装饰的方法,允许系统组件的参数是TS方法的返回值
- 不允许switch语法,如果需要使用条件判断那么就只能用 IF 来判断了
- 不允许使用表达式
Entry 基本结构
@Entry装饰的自定义组件将作为UI页面的入口
在单个UI页面中,最多可以使用@Entry装饰一个自定义组件,将相当于 Java 当中的 Main 函数
Duplicate decorators for struct are not allowed. <etsLint> 不允许使用重复的 struct 装饰器。<etsLint>
函数/变量
自定义组件除了必须要实现build()函数外,还可以实现其他成员函数.成员函数具有以下约束.
- 不支持静态函数。
- 成员函数的访问是私有的。
自定义组件可以包含成员变量,成员变量具有以下约束:
- 不支持静态成员变量。
- 所有成员变量都是私有的,变量的访问规则与成员函数的访问规则相同。
- 自定义组件的成员变量本地初始化有些是可选的,有些是必选的。具体是否需要本地初始化,是否 需要从父组件通过参数传递初始化子组件的成员变量
组件的参数规定
在上面的 Build函数当中我们讲到了可以在 build 当中使用方法或者使用 @Builder
来修饰的函数里创建自定义组件
我们在创建自定义组件的过程中,根据装饰器的规则来初始化自定义组件的参数
代码语言:go复制// Entry 标记当前组件是入口组件,比如Java当中的Main (标记后就变成了一个独立的页面)
@Entry
// Component 装饰器: 需要使用装饰器来标志(相当于 Java 里面的 Bean) 用来修饰类结构、方法、变量
@Component
// struct 结构体 就是一个自定义的组件,和VUE一样哪里都可以用
struct Order {
// 定义变量
// @State 变量名称: 变量类型(TS语法不知道的可以去学学基础) = 对应变量类型的数据
@State message: string = 'Hello World'
private flag: string = '父组件私有'
// 构建组件为页面元素
build() {
// 根节点唯一且必要,必须为容器组件
Row() {
ParentComponent({ countDownFrom: 36, flag: this.flag })
.onClick(() => {
console.info('方法或者函数里面允许!');
})
}
}
}
// 子组件
@Component
struct ParentComponent {
private countDownFrom: number = 0;
private flag: string = '子组件私有'
build() {
Column() {
Text(`${this.countDownFrom}`).fontSize(30)
Divider()
Text(`${this.flag}`).fontSize(30)
}
}
}
ok 自定义组件的知识点差不多搞定,还剩下一些装饰器的玩法.
最后
我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!
本期结束咱们下次再见