动态

详情 返回 返回

HarmonyOS Next應用開發——自定義組件的使用 - 动态 详情

【高心星出品】

自定義組件的使用

在ArkUI中,UI顯示的內容均為組件,由框架直接提供的稱為系統組件,由開發者定義的稱為自定義組件。在進行 UI 界面開發時,通常不是簡單的將系統組件進行組合使用,而是需要考慮代碼可複用性、業務邏輯與UI分離,後續版本演進等因素。因此,將UI和部分業務邏輯封裝成自定義組件是不可或缺的能力。

創建自定義組件

自定義組件的基本結構

@Component
export struct hellocomponent{
  // 狀態變量
  @State message:string ='hello component'
  // 私有變量
  private content
  // 構建函數 寫法跟build類似
  @Builder
  genxx(aa){
   
  }
  // 構建UI界面 一個文本顯示框
  build(){
     Text(this.message)
       .border({color:Color.Red,width:1,radius:5})
       .fontSize(22)
       .fontWeight(FontWeight.Bolder)
       .width('100%')
       .padding(5)
       .onClick(()=>{
         this.message=this.content
       })
  }
}

@Component是組件的註解,聲明一個組件;

export對外共享該組件,struct生命組件名稱;

可以有成員變量、@builder註解的函數和build函數構成。

使用自定義組件

UI入口組件

@Entry裝飾的自定義組件將作為UI頁面的入口。在單個UI頁面中,最多可以使用@Entry裝飾一個自定義組件。

// 引入其他自定義組件
import { hellocomponent } from '../components/hellocomponents'
@Entry
@Component
struct Index {
  // 狀態變量
  @State message: string = 'Hello World'
  // 成員變量
  private flag:boolean
  // 構建函數 寫法同build函數
  @Builder
  genxx(){
    
  }
  // 構建ui函數
  build() {
    Row() {
      Column() {
       //  自定義組件的使用
       hellocomponent({content:'hello arkui'})
      }
      .width('100%')
    }
    .height('100%')
  }
}
  • 入口組件與自定義組件唯一的區別就是build函數。

自定義組件的build函數要求有唯一的容器,如上row作為唯一容器,自定義組件並沒有該要求。

  • 入口組件使用自定義組件的時候可以直接調用,並且初始化其中的成員變量。
  • build函數中不能使用一些語法:

    • 不能聲明變量
    • 不能日誌打印
    • 不能調用非@builder修飾的函數

自定義組件生命週期

  • 頁面生命週期,即被@Entry裝飾的組件生命週期,提供以下生命週期接口:

onPageShow:頁面每次顯示時觸發一次,包括路由過程、應用進入前台等場景。

onPageHide:頁面每次隱藏時觸發一次,包括路由過程、應用進入後台等場景。

onBackPress:當用户點擊返回按鈕時觸發。

  • 組件生命週期,即一般用@Component裝飾的自定義組件的生命週期,頁面也可以定義這些生命週期函數,提供以下生命週期接口:

aboutToAppear:組件即將出現時回調該接口,具體時機為在創建自定義組件的新實例後,在執行其build()函數之前執行。
aboutToDisappear:在自定義組件析構銷燬之前執行。不允許在aboutToDisappear函數中改變狀態變量,特別是@Link變量的修改可能會導致應用程序行為不穩定。

在這裏插入圖片描述

自定義組件完整寫法

/**
 *作者:gxx
 *日期:2024-03-13 17:25:59
 *介紹:
 *自定義組件
 **/

@Component
export struct hellocomponent{
  // 狀態變量
  @State message:string ='hello component'
  // 私有變量
  private content
  // 構建函數 寫法跟build類似
  @Builder
  genxx(aa){

  }
  // 樣式函數 全局樣式
  @Styles
  genstyle(aa){

  }
  // 構建UI界面
  build(){
     Text(this.message)
       .border({color:Color.Red,width:1,radius:5})
       .fontSize(22)
       .fontWeight(FontWeight.Bolder)
       .width('100%')
       .padding(5)
       .onClick(()=>{
         this.message=this.content
       })
  }
  aboutToAppear(){
    console.info("gxx 自定義組件準備顯示")
  }
  aboutToDisappear(){
    console.info("gxx 自定義組件準備消失")
  }
}

入口界面完整寫法

// 引入其他自定義組件
import { hellocomponent } from '../components/hellocomponents'
@Entry
@Component
struct Index {
  // 狀態變量
  @State message: string = 'Hello World'
  // 成員變量
  private flag:boolean
  // 構建函數 寫法同build函數
  @Builder
  genxx(){

  }
  // 構建ui函數
  build() {
    Row() {
      Column() {
       //  自定義組件的使用
       hellocomponent({content:'hello arkui'})
      }
      .width('100%')
    }
    .height('100%')
  }

aboutToAppear(){
  console.info("gxx頁面準備顯示")
}
aboutToDisappear(){
  console.info("gxx頁面準備消失")
}
onPageShow(){
  console.info("gxx頁面顯示")
}
onPageHide(){
  console.info("gxx頁面消失")
}
onBackPress(){
  console.info("gxx頁面被點擊了後退")
}

}
user avatar xiaoyuindebuilder 头像 HarmonyOS5 头像 heimatengyun 头像 feichangkudexiang 头像 yanyanyan_ 头像
点赞 5 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.