HarmonyOS—詳解自定義組件的生命周期

前言

自定義組件 的生命周期回調(diào)函數(shù)用于通知用戶該自定義組件的生命周期虚茶,這些回調(diào)函數(shù)是私有的,在運(yùn)行時(shí)由開發(fā)框架在特定的時(shí)間進(jìn)行調(diào)用仇参,不能從應(yīng)用程序中手動(dòng)調(diào)用這些回調(diào)函數(shù)嘹叫。

下圖展示的是被@Entry裝飾的 組件生命周期:

今天根據(jù)上面的流程圖,我們從自定義組件的初始創(chuàng)建诈乒、重新渲染和刪除來一一詳細(xì)解釋。

說明:允許在生命周期函數(shù)中使用Promise和異步回調(diào)函數(shù)怕磨,比如網(wǎng)絡(luò)資源獲取喂饥,定時(shí)器設(shè)置等;

aboutToAppear

aboutToAppear?(): void

aboutToAppear函數(shù)在創(chuàng)建自定義組件的新實(shí)例后肠鲫,在執(zhí)行其build()函數(shù)之前執(zhí)行员帮。允許在aboutToAppear函數(shù)中改變狀態(tài)變量,更改將在后續(xù)執(zhí)行build()函數(shù)中生效导饲。

注意??:從API version 9開始集侯,該接口支持在ArkTS卡片中使用。

aboutToDisappear

aboutToDisappear?(): void

aboutToDisappear函數(shù)在自定義組件析構(gòu)銷毀之前執(zhí)行帜消。不允許在aboutToDisappear函數(shù)中改變狀態(tài)變量棠枉,特別是@Link變量的修改可能會(huì)導(dǎo)致應(yīng)用程序行為不穩(wěn)定。

注意??:從API version 9開始泡挺,該接口支持在ArkTS卡片中使用辈讶。

onPageShow

onPageShow?(): void

頁面每次顯示時(shí)觸發(fā)一次,包括路由過程娄猫、應(yīng)用進(jìn)入前臺(tái)等場(chǎng)景贱除,僅@Entry裝飾的自定義組件生效。

onPageHide

onPageHide?(): void

頁面每次隱藏時(shí)觸發(fā)一次媳溺,包括路由過程月幌、應(yīng)用進(jìn)入前后臺(tái)等場(chǎng)景,僅@Entry裝飾的自定義組件生效悬蔽。

onBackPress

onBackPress?(): void

當(dāng)用戶點(diǎn)擊返回按鈕時(shí)觸發(fā)扯躺,僅@Entry裝飾的自定義組件生效。

@Entry
@Component
struct IndexComponent {
  @State textColor: Color = Color.Black;

  onPageShow() {
    this.textColor = Color.Blue;
    console.info('IndexComponent onPageShow');
  }

  onPageHide() {
    this.textColor = Color.Transparent;
    console.info('IndexComponent onPageHide');
  }

  onBackPress() {
    this.textColor = Color.Red;
    console.info('IndexComponent onBackPress');
  }

  build() {
    Column() {
      Text('Hello World')
        .fontColor(this.textColor)
        .fontSize(30)
        .margin(30)
    }.width('100%')
  }
}

onLayout9+

onLayout?(children: Array<LayoutChild>, constraint: ConstraintSizeOptions): void

框架會(huì)在自定義組件布局時(shí),將該自定義組件的子節(jié)點(diǎn)信息和自身的尺寸范圍通過onLayout傳遞給該自定義組件录语。不允許在onLayout函數(shù)中改變狀態(tài)變量倍啥。

注意??:從API version 9開始,該接口支持在ArkTS卡片中使用澎埠。

參數(shù)說明:

參數(shù)名稱 參數(shù)類型 參數(shù)說明
children Array<LayoutChild> 子組件布局信息虽缕。
constraint ConstraintSizeOptions 父組件constraint信息。

onMeasure9+

onMeasure?(children: Array<LayoutChild>, constraint: ConstraintSizeOptions): void

框架會(huì)在自定義組件確定尺寸時(shí)蒲稳,將該自定義組件的子節(jié)點(diǎn)信息和自身的尺寸范圍通過onMeasure傳遞給該自定義組件氮趋。不允許在onMeasure函數(shù)中改變狀態(tài)變量。

注意??:從API version 9開始江耀,該接口支持在ArkTS卡片中使用剩胁。
參數(shù)說明:

參數(shù)名稱 參數(shù)類型 參數(shù)說明
children Array<LayoutChild> 子組件布局信息。
constraint ConstraintSizeOptions 父組件constraint信息决记。

LayoutChild9+

子組件布局信息。

從API version 9開始倍踪,該接口支持在ArkTS卡片中使用系宫。

參數(shù)名稱 參數(shù)類型 描述
name string 子組件名稱。
id string 子組件id建车。
constraint ConstraintSizeOptions 子組件約束尺寸扩借。
borderInfo LayoutBorderInfo 子組件border信息。
position Position 子組件位置坐標(biāo)缤至。
measure (childConstraint: ConstraintSizeOptions) => void 調(diào)用此方法對(duì)子組件的尺寸范圍進(jìn)行限制潮罪。
layout (LayoutInfo: LayoutInfo) => void 調(diào)用此方法對(duì)子組件的位置信息進(jìn)行限制。

LayoutBorderInfo9+

子組件border信息领斥。

從API version 9開始嫉到,該接口支持在ArkTS卡片中使用。

參數(shù)名稱 參數(shù)類型 描述
borderWidth EdgeWidths 邊框?qū)挾阮愋驮侣澹糜诿枋鼋M件邊框不同方向的寬度何恶。
margin Margin 外邊距類型,用于描述組件不同方向的外邊距嚼黔。
padding Padding 內(nèi)邊距類型细层,用于描述組件不同方向的內(nèi)邊距。

LayoutInfo9+

子組件layout信息唬涧。

從API version 9開始疫赎,該接口支持在ArkTS卡片中使用。

參數(shù)名稱 參數(shù)類型 描述
position Position 子組件位置坐標(biāo)碎节。
constraint ConstraintSizeOptions 子組件約束尺寸捧搞。
@Entry
@Component
struct Index {
  build() {
    Column() {
      CustomLayout() {
        ForEach([1, 2, 3], (index) => {
          Text('Sub' + index)
            .fontSize(30)
            .borderWidth(2)
        })
      }
    }
  }
}



@Component
struct CustomLayout {
  @BuilderParam builder: () => {};

  onLayout(children: Array<LayoutChild>, constraint: ConstraintSizeOptions) {
    let pos = 0;
    children.forEach((child) => {
      child.layout({ position: { x: pos, y: pos }, constraint: constraint })
      pos += 100;
    })
  }

  onMeasure(children: Array<LayoutChild>, constraint: ConstraintSizeOptions) {
    let size = 100;
    children.forEach((child) => {
      child.measure({ minHeight: size, minWidth: size, maxWidth: size, maxHeight: size })
      size += 50;
    })
  }

  build() {
    this.builder()
  }
}

運(yùn)行效果如下:

總結(jié)

自定義組件的生命周期 回調(diào)函數(shù) 用于通知用戶該自定義組件的生命周期,這些回調(diào)函數(shù)是私有的,在運(yùn)行時(shí)由開發(fā)框架在特定的時(shí)間進(jìn)行調(diào)用实牡,不能從應(yīng)用程序中手動(dòng)調(diào)用這些回調(diào)函數(shù)陌僵。合理的掌握和使用組件的生命周期函數(shù)可以幫助我們更好開發(fā)和實(shí)現(xiàn)需求功能。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末创坞,一起剝皮案震驚了整個(gè)濱河市碗短,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌题涨,老刑警劉巖偎谁,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異纲堵,居然都是意外死亡巡雨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門席函,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铐望,“玉大人,你說我怎么就攤上這事茂附≌埽” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵营曼,是天一觀的道長乒验。 經(jīng)常有香客問我,道長蒂阱,這世上最難降的妖魔是什么锻全? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮录煤,結(jié)果婚禮上鳄厌,老公的妹妹穿的比我還像新娘。我一直安慰自己妈踊,他們只是感情好部翘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著响委,像睡著了一般新思。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赘风,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天夹囚,我揣著相機(jī)與錄音,去河邊找鬼邀窃。 笑死荸哟,一個(gè)胖子當(dāng)著我的面吹牛假哎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鞍历,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼舵抹,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了劣砍?” 一聲冷哼從身側(cè)響起惧蛹,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎刑枝,沒想到半個(gè)月后香嗓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡装畅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年靠娱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掠兄。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡像云,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚂夕,到底是詐尸還是另有隱情迅诬,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布双抽,位于F島的核電站百框,受9級(jí)特大地震影響闲礼,放射性物質(zhì)發(fā)生泄漏牍汹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一柬泽、第九天 我趴在偏房一處隱蔽的房頂上張望慎菲。 院中可真熱鬧,春花似錦锨并、人聲如沸露该。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽解幼。三九已至,卻和暖如春包警,著一層夾襖步出監(jiān)牢的瞬間撵摆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國打工害晦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留特铝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像鲫剿,于是被迫代替她去往敵國和親鳄逾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容