@Builder裝飾器:自定義構(gòu)建函數(shù)

2024-01-25 12:01 更新

前面章節(jié)介紹了如何創(chuàng)建一個自定義組件。該自定義組件內(nèi)部UI結(jié)構(gòu)固定,僅與使用方進(jìn)行數(shù)據(jù)傳遞。ArkUI還提供了一種更輕量的UI元素復(fù)用機(jī)制@Builder,@Builder所裝飾的函數(shù)遵循build()函數(shù)語法規(guī)則,開發(fā)者可以將重復(fù)使用的UI元素抽象成一個方法,在build方法里調(diào)用。

為了簡化語言,我們將@Builder裝飾的函數(shù)也稱為“自定義構(gòu)建函數(shù)”。

說明

從API version 9開始,該裝飾器支持在ArkTS卡片中使用。

裝飾器使用說明

自定義組件內(nèi)自定義構(gòu)建函數(shù)

定義的語法:

  1. @Builder MyBuilderFunction(){ ... }

使用方法:

  1. this.MyBuilderFunction()
  • 允許在自定義組件內(nèi)定義一個或多個@Builder方法,該方法被認(rèn)為是該組件的私有、特殊類型的成員函數(shù)。
  • 自定義構(gòu)建函數(shù)可以在所屬組件的build方法和其他自定義構(gòu)建函數(shù)中調(diào)用,但不允許在組件外調(diào)用。
  • 在自定義函數(shù)體中,this指代當(dāng)前所屬組件,組件的狀態(tài)變量可以在自定義構(gòu)建函數(shù)內(nèi)訪問。建議通過this訪問自定義組件的狀態(tài)變量而不是參數(shù)傳遞。

全局自定義構(gòu)建函數(shù)

定義的語法:

  1. @Builder function MyGlobalBuilderFunction(){ ... }

使用方法:

  1. MyGlobalBuilderFunction()
  • 全局的自定義構(gòu)建函數(shù)可以被整個應(yīng)用獲取,不允許使用this和bind方法。
  • 如果不涉及組件狀態(tài)變化,建議使用全局的自定義構(gòu)建方法。

參數(shù)傳遞規(guī)則

自定義構(gòu)建函數(shù)的參數(shù)傳遞有按值傳遞按引用傳遞兩種,均需遵守以下規(guī)則:

  • 參數(shù)的類型必須與參數(shù)聲明的類型一致,不允許undefined、null和返回undefined、null的表達(dá)式。
  • 在自定義構(gòu)建函數(shù)內(nèi)部,不允許改變參數(shù)值。如果需要改變參數(shù)值,且同步回調(diào)用點,建議使用@Link。
  • @Builder內(nèi)UI語法遵循UI語法規(guī)則。
  • 只有傳入一個參數(shù),且參數(shù)需要直接傳入對象字面量才會按引用傳遞該參數(shù),其余傳遞方式均為按值傳遞。

按引用傳遞參數(shù)

按引用傳遞參數(shù)時,傳遞的參數(shù)可為狀態(tài)變量,且狀態(tài)變量的改變會引起@Builder方法內(nèi)的UI刷新。ArkUI提供$$作為按引用傳遞參數(shù)的范式。

  1. ABuilder( $$ : { paramA1: string, paramB1 : string } );
  1. @Builder function ABuilder($$: { paramA1: string }) {
  2. Row() {
  3. Text(`UseStateVarByReference: ${$$.paramA1} `)
  4. }
  5. }
  6. @Entry
  7. @Component
  8. struct Parent {
  9. @State label: string = 'Hello';
  10. build() {
  11. Column() {
  12. // 在Parent組件中調(diào)用ABuilder的時候,將this.label引用傳遞給ABuilder
  13. ABuilder({ paramA1: this.label })
  14. Button('Click me').onClick(() => {
  15. // 點擊“Click me”后,UI從“Hello”刷新為“ArkUI”
  16. this.label = 'ArkUI';
  17. })
  18. }
  19. }
  20. }

按值傳遞參數(shù)

調(diào)用@Builder裝飾的函數(shù)默認(rèn)按值傳遞。當(dāng)傳遞的參數(shù)為狀態(tài)變量時,狀態(tài)變量的改變不會引起@Builder方法內(nèi)的UI刷新。所以當(dāng)使用狀態(tài)變量的時候,推薦使用按引用傳遞。

  1. @Builder function ABuilder(paramA1: string) {
  2. Row() {
  3. Text(`UseStateVarByValue: ${paramA1} `)
  4. }
  5. }
  6. @Entry
  7. @Component
  8. struct Parent {
  9. @State label: string = 'Hello';
  10. build() {
  11. Column() {
  12. ABuilder(this.label)
  13. }
  14. }
  15. }
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號