背景
當(dāng)開(kāi)發(fā)者創(chuàng)建了自定義組件系吩,并想對(duì)該組件添加特定功能時(shí)摔桦,例如在自定義組件中添加一個(gè)點(diǎn)擊跳轉(zhuǎn)操作崖蜜。若直接在組件內(nèi)嵌入事件方法焰雕,將會(huì)導(dǎo)致所有引入該自定義組件的地方均增加了該功能衷笋。為解決此問(wèn)題芳杏,ArkUI引入了@BuilderParam裝飾器矩屁,@BuilderParam用來(lái)裝飾指向@Builder方法的變量,開(kāi)發(fā)者可在初始化自定義組件時(shí)對(duì)此屬性進(jìn)行賦值爵赵,為自定義組件增加特定的功能吝秕。該裝飾器用于聲明任意UI描述的一個(gè)元素,類(lèi)似slot占位符空幻。
裝飾器使用說(shuō)明
初始化@BuilderParam裝飾的方法
@BuilderParam裝飾的方法只能被自定義構(gòu)建函數(shù)(@Builder裝飾的方法)初始化烁峭。
- 使用所屬自定義組件的自定義構(gòu)建函數(shù)或者全局的自定義構(gòu)建函數(shù),在本地初始化@BuilderParam秕铛。
@Builder function overBuilder() {}
@Component
struct Child {
@Builder doNothingBuilder() {};
// 使用自定義組件的自定義構(gòu)建函數(shù)初始化@BuilderParam
@BuilderParam customBuilderParam: () => void = this.doNothingBuilder;
// 使用全局自定義構(gòu)建函數(shù)初始化@BuilderParam
@BuilderParam customOverBuilderParam: () => void = overBuilder;
build(){}
}
- 用父組件自定義構(gòu)建函數(shù)初始化子組件@BuilderParam裝飾的方法约郁。
@Component
struct Child {
// 使用父組件@Builder裝飾的方法初始化子組件@BuilderParam
@BuilderParam customBuilderParam: () => void;
build() {
Column() {
this.customBuilderParam()
}
}
}
@Entry
@Component
struct Parent {
@Builder componentBuilder() {
Text(`Parent builder `)
}
build() {
Column() {
Child({ customBuilderParam: this.componentBuilder })
}
}
}
使用場(chǎng)景
參數(shù)初始化組件
@Builder function overBuilder($$ : {label: string }) {
Text($$.label)
.width(400)
.height(50)
.backgroundColor(Color.Green)
}
@Component
struct Child {
label: string = 'Child'
// 無(wú)參數(shù)類(lèi)型,指向的componentBuilder也是無(wú)參數(shù)類(lèi)型
@BuilderParam customBuilderParam: () => void;
// 有參數(shù)類(lèi)型但两,指向的GlobalBuilder1也是有參數(shù)類(lèi)型的方法
@BuilderParam customOverBuilderParam: ($$ : { label : string}) => void;
build() {
Column() {
this.customBuilderParam()
this.customOverBuilderParam({label: 'global Builder label' } )
}
}
}
@Entry
@Component
struct Parent {
label: string = 'Parent'
@Builder componentBuilder() {
Text(`${this.label}`)
}
build() {
Column() {
this.componentBuilder()
Child({ customBuilderParam: this.componentBuilder, customOverBuilderParam: overBuilder })
}
}
}
尾隨閉包初始化組件
在自定義組件中使用@BuilderParam裝飾的屬性時(shí)也可通過(guò)尾隨閉包進(jìn)行初始化鬓梅。在初始化自定義組件時(shí),組件后緊跟一個(gè)大括號(hào)“{}”形成尾隨閉包場(chǎng)景谨湘。
此場(chǎng)景下自定義組件內(nèi)有且僅有一個(gè)使用@BuilderParam裝飾的屬性绽快。
開(kāi)發(fā)者可以將尾隨閉包內(nèi)的內(nèi)容看做@Builder裝飾的函數(shù)傳給@BuilderParam芥丧。示例如下:
// xxx.ets
@Component
struct CustomContainer {
@Prop header: string;
// 使用父組件的尾隨閉包{}(@Builder裝飾的方法)初始化子組件@BuilderParam
@BuilderParam closer: () => void
build() {
Column() {
Text(this.header)
.fontSize(30)
this.closer()
}
}
}
@Builder function specificParam(label1: string, label2: string) {
Column() {
Text(label1)
.fontSize(30)
Text(label2)
.fontSize(30)
}
}
@Entry
@Component
struct CustomContainerUser {
@State text: string = 'header';
build() {
Column() {
// 創(chuàng)建CustomContainer,在創(chuàng)建CustomContainer時(shí)坊罢,通過(guò)其后緊跟一個(gè)大括號(hào)“{}”形成尾隨閉包
// 作為傳遞給子組件CustomContainer @BuilderParam closer: () => void的參數(shù)
CustomContainer({ header: this.text }) {
Column() {
specificParam('testA', 'testB')
}.backgroundColor(Color.Yellow)
.onClick(() => {
this.text = 'changeHeader';
})
}
}
}
}