页面和自定义组件生命周期
学习了解鸿蒙开发的页面和自定义组件生命周期
ArkUI提供了一种轻量的UI元素复用机制@Builder,其内部UI结构固定,仅与使用方进行数据传递,开发者可以将重复使用的UI元素抽象成一个方法,在build方法里调用。
为了简化语言,我们将@Builder
装饰的函数也称为“自定义构建函数”。
定义的语法:
@Builder MyBuilderFunction() {}
使用方法:
this.MyBuilderFunction()
@Builder
方法,该方法被认为是该组件的私有、特殊类型的成员函数。build
方法和其他自定义构建函数中调用。定义的语法:
@Builder function MyGlobalBuilderFunction() { ... }
使用用法:
MyGlobalBuilderFunction()
自定义构建函数的参数传递有 按值传递 和 按引用传递 两种,均需遵守以下规则:
按引用传递参数时,传递的参数可为状态变量,且状态变量的改变会引起@Builder方法内的UI刷新。
class Tmp {
paramA1: string = ''
}
function overBuilder(params: Tmp) {
Row() {
Text(`UseStateVarByReference: ${params.paramA1} `)
}
}
struct Parent {
label: string = 'Hello';
build() {
Column() {
// 在父组件中调用overBuilder组件时,
// 把this.label通过引用传递的方式传给overBuilder组件。
overBuilder({ paramA1: this.label })
Button('Click me').onClick(() => {
// 单击Click me后,UI文本从Hello更改为ArkUI。
this.label = 'ArkUI';
})
}
}
}
按引用传递参数时,如果在@Builder
方法内调用自定义组件,ArkUI提供 $$ 作为按引用传递参数的范式。
class Tmp {
paramA1: string = ''
}
function overBuilder($$: Tmp) {
Row() {
Column() {
Text(`overBuilder===${$$.paramA1}`)
HelloComponent({message: $$.paramA1})
}
}
}
struct HelloComponent {
message: string;
build() {
Row() {
Text(`HelloComponent===${this.message}`)
}
}
}
struct Parent {
label: string = 'Hello';
build() {
Column() {
// 在父组件中调用overBuilder组件时,
// 把this.label通过引用传递的方式传给overBuilder组件。
overBuilder({paramA1: this.label})
Button('Click me').onClick(() => {
// 单击Click me后,UI文本从Hello更改为ArkUI。
this.label = 'ArkUI';
})
}
}
}
调用@Builder
装饰的函数默认按值传递。当传递的参数为状态变量时,状态变量的改变不会引起@Builder
方法内的UI刷新。所以当使用状态变量的时候,推荐使用 按引用传递 。
@Builder function overBuilder(paramA1: string) {
Row() {
Text(`UseStateVarByValue: ${paramA1} `)
}
}
@Entry
@Component
struct Parent {
@State label: string = 'Hello';
build() {
Column() {
overBuilder(this.label)
}
}
}
@Builder
通过按引用传递的方式传入参数,才会触发动态渲染UI,并且参数只能是一个。@Builder
如果传入的参数是两个或两个以上,不会触发动态渲染UI。@Builder
传入的参数中同时包含按值传递和按引用传递两种方式,不会触发动态渲染UI。@Builder
的参数必须按照对象字面量的形式,把所需要的属性一一传入,才会触发动态渲染UI。