基于:HarmonyOS开发者3.1/4.0版本配套的开发者文档,对应API能力级别为API 9 Release
ARkTS以声明方式组合和扩展组件来描述应用程序的UI,还提供了基本的属性、事件、子组件配置方法
创建组件包含有参数和无参数两种方式(具体根据组件的构造方法)
如果组件的接口定义咩有包含必选构造参数,则组件后面的()
不需要配置任何内容,如:
Column() {
Text('item 1')
Divider()
Text('item 2')
}
如果组件的接口定义包含构造参数,可以在组件后面的()
配置相应参数:
// string类型的参数
Text('test')
// $r形式引入应用资源,可应用于多语言场景
Text($r('app.string.title_value'))
// 无参数形式
Text()
// 变量或表达式也可以用于参数赋值,表达式返回的结果类型必须满足参数类型要求
Text(`count: ${this.count}`)
属性方法以.
链式调用的方式配置系统组件的样式和其他属性,建议每个属性方法单独写一行
// 配置Text组件字体的大小
Text('test')
.fontSize(12)
// 配置组件的多个属性,还可以传入变量或者表达式
Image('test.jpg')
.alt('error.jpg')
.width(this.count % 2 === 0 ? 100 : 200)
.height(this.offset + 100)
// 对于一些系统组件,ArkUI还为其预定义了一些枚举类型供调用
Text('hello')
.fontSize(20)
.fontColor(Color.Red)
.fontWeight(FontWeight.Bold)
事件方法以.
链式调用的方式配置系统组件支持的事件,建议每个事件方法单独写一行
// 使用剪头函数配置组件的事件方法
Button('Click me')
.onClick(() => {
this.myText = 'ArkUI';
})
// 使用匿名函数,要求使用bind,以确保函数中的this指向当前组件
Button('add counter')
.onClick(function(){
this.counter += 2;
}.bind(this))
// 使用组件成员函数
myClickHandler(): void {
this.counter += 2;
}
...
Button('add counter')
.onClick(this.myClickHandler.bind(this))
如果组件支持子组件配置,则需要再尾随闭包{...}
中为组件添加子组件的UI描述(组件嵌套)
Column() {
Text('Hello')
.fontSize(100)
Divider()
Text(this.myText)
.fontSize(100)
.fontColor(Color.Red)
}
自定义组件具有以下特点:
成员函数/变量
成员函数具有以下约束:
自定义组件的成员变量有以下约束:
@Component
struct MyComponent {
private countDownFrom: number = 0;
private color: Color = Color.Blue;
build() {
}
}
@Entry
@Component
struct ParentComponent {
private someColor: Color = Color.Pink;
build() {
Column() {
// 创建MyComponent实例,并将创建MyComponent成员变量countDownFrom初始化为10,将成员变量color初始化为this.someColor
MyComponent({ countDownFrom: 10, color: this.someColor })
}
}
}
build()函数
所有声明在build函数的语言,统称为UI描述语言,需要遵循:
自定义组件通过“.”链式调用的形式设置通用样式
设置样式时并不是直接设置给自定义组件的,相当于给自定义组件套一个不可见的容器,样式被设置给这个容器
页面生命周期如下:
组件生命周期:
自定义组件的创建和渲染流程
第4步会保存两个map:
自定义组件的重新渲染
当事件句柄被触发改变了状态变量时,或者LocalStorage / AppStorage中的属性更改,并导致绑定的状态量更改其值时:
自定义组件的删除
如果if组件的分支改变,或者ForEach循环渲染中数组的个数改变,组件将被删除:
ArkUI还提供了更轻量化的UI元素复用机制@Builder,被@Builder修饰的函数遵循build函数语法规则,开发者可将简单的UI元素抽象成一个方法,在build中调用
@Builder修饰的函数也叫自定义构建函数
自定义组件内自定义构建函数
定义的语法:
@Builder MyBuilderFunction({ ... })
使用方法:
this.MyBuilderFunction({ ... })
全局自定义构建函数
定义的语法:
@Builder function MyGlobalBuilderFunction({ ... })
使用方法:
MyGlobalBuilderFunction()
参数传递规则
自定义构建函数的参数传递有按值传递和按引用传递两种方式,需要遵循以下规则:
按引用传递参数
传递的参数可以为状态变量,且状态变量的改变会引起@Builder方法内的UI刷新,传递方式为$$
@Builder function ABuilder($$: { paramA1: string }) {
Row() {
Text(`UseStateVarByReference: ${$$.paramA1} `)
}
}
@Entry
@Component
struct Parent {
@State label: string = 'Hello';
build() {
Column() {
// 在Parent组件中调用ABuilder的时候,将this.label引用传递给ABuilder
ABuilder({ paramA1: this.label })
Button('Click me').onClick(() => {
// 点击“Click me”后,UI从“Hello”刷新为“ArkUI”
this.label = 'ArkUI';
})
}
}
}
按值传递参数
传递的参数发生变化时,不会引起@Builder内UI刷新
@Builder function ABuilder(paramA1: string) {
Row() {
Text(`UseStateVarByValue: ${paramA1} `)
}
}
@Entry
@Component
struct Parent {
label: string = 'Hello';
build() {
Column() {
ABuilder(this.label)
}
}
}