鴻蒙自定義組件生命周期

在開始之前惠奸,我們先明確自定義組件和頁面的關系:

  • 自定義組件:@Component裝飾的UI單元梅誓,可以組合多個系統(tǒng)組件實現UI的復用,可以調用組件的生命周期佛南。
  • 頁面:即應用的UI頁面梗掰。可以由一個或者多個自定義組件組成嗅回,@Entry裝飾的自定義組件為頁面的入口組件及穗,即頁面的根節(jié)點,一個頁面有且僅能有一個@Entry绵载。只有被@Entry裝飾的組件才可以調用頁面的生命周期埂陆。

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

  • onPageShow:頁面每次顯示時觸發(fā)一次焚虱,包括路由過程、應用進入前臺等場景懂版。
  • onPageHide:頁面每次隱藏時觸發(fā)一次鹃栽,包括路由過程躯畴、應用進入后臺等場景民鼓。
  • onBackPress:當用戶點擊返回按鈕時觸發(fā)薇芝。

組件生命周期,即一般用@Component裝飾的自定義組件的生命周期丰嘉,提供以下生命周期接口:

  • aboutToAppear:組件即將出現時回調該接口夯到,具體時機為在創(chuàng)建自定義組件的新實例后,在執(zhí)行其build()函數之前執(zhí)行饮亏。
  • onDidBuild:組件build()函數執(zhí)行完成之后回調該接口耍贾,不建議在onDidBuild函數中更改狀態(tài)變量、使用animateTo等功能克滴,這可能會導致不穩(wěn)定的UI表現逼争。
  • aboutToDisappear:aboutToDisappear函數在自定義組件析構銷毀之前執(zhí)行。不允許在aboutToDisappear函數中改變狀態(tài)變量劝赔,特別是@Link變量的修改可能會導致應用程序行為不穩(wěn)定誓焦。

生命周期流程如下圖所示,下圖展示的是被@Entry裝飾的組件(頁面)生命周期着帽。


0000000000011111111.20241105122222.86175125760562943871986980520675.png

以下示例展示了生命周期的調用時機:

// Index.ets
import { router } from '@kit.ArkUI';

@Entry
@Component
struct MyComponent {
  @State showChild: boolean = true;
  @State btnColor:string = "#FF007DFF";

  // 只有被@Entry裝飾的組件才可以調用頁面的生命周期
  onPageShow() {
    console.info('Index onPageShow');
  }
  // 只有被@Entry裝飾的組件才可以調用頁面的生命周期
  onPageHide() {
    console.info('Index onPageHide');
  }

  // 只有被@Entry裝飾的組件才可以調用頁面的生命周期
  onBackPress() {
    console.info('Index onBackPress');
    this.btnColor ="#FFEE0606";
    return true // 返回true表示頁面自己處理返回邏輯杂伟,不進行頁面路由;返回false表示使用默認的路由返回邏輯仍翰,不設置返回值按照false處理
  }

  // 組件生命周期
  aboutToAppear() {
    console.info('MyComponent aboutToAppear');
  }

  // 組件生命周期
  onDidBuild() {
    console.info('MyComponent onDidBuild');
  }

  // 組件生命周期
  aboutToDisappear() {
    console.info('MyComponent aboutToDisappear');
  }

  build() {
    Column() {
      // this.showChild為true赫粥,創(chuàng)建Child子組件,執(zhí)行Child aboutToAppear
      if (this.showChild) {
        Child()
      }
      // this.showChild為false予借,刪除Child子組件越平,執(zhí)行Child aboutToDisappear
      Button('delete Child')
        .margin(20)
        .backgroundColor(this.btnColor)
        .onClick(() => {
        this.showChild = false;
      })
      // push到page頁面,執(zhí)行onPageHide
      Button('push to next page')
        .onClick(() => {
          router.pushUrl({ url: 'pages/page' });
        })
    }
  }
}

@Component
struct Child {
  @State title: string = 'Hello World';
  // 組件生命周期
  aboutToDisappear() {
    console.info('[lifeCycle] Child aboutToDisappear');
  }

  // 組件生命周期
  onDidBuild() {
    console.info('[lifeCycle] Child onDidBuild');
  }

  // 組件生命周期
  aboutToAppear() {
    console.info('[lifeCycle] Child aboutToAppear');
  }

  build() {
    Text(this.title)
      .fontSize(50)
      .margin(20)
      .onClick(() => {
        this.title = 'Hello ArkUI';
      })
  }
}

// page.ets
@Entry
@Component
struct page {
  @State textColor: Color = Color.Black;
  @State num: number = 0;

  onPageShow() {
    this.num = 5;
  }

  onPageHide() {
    console.log("page onPageHide");
  }

  onBackPress() { // 不設置返回值按照false處理
    this.textColor = Color.Grey;
    this.num = 0;
  }

  aboutToAppear() {
    this.textColor = Color.Blue;
  }

  build() {
    Column() {
      Text(`num 的值為:${this.num}`)
        .fontSize(30)
        .fontWeight(FontWeight.Bold)
        .fontColor(this.textColor)
        .margin(20)
        .onClick(() => {
          this.num += 5;
        })
    }
    .width('100%')
  }
}

以上示例中灵迫,Index頁面包含兩個自定義組件秦叛,一個是被@Entry裝飾的MyComponent,也是頁面的入口組件瀑粥,即頁面的根節(jié)點挣跋;一個是Child,是MyComponent的子組件狞换。只有@Entry裝飾的節(jié)點才可以使頁面級別的生命周期方法生效避咆,因此在MyComponent中聲明當前Index頁面的頁面生命周期函數(onPageShow / onPageHide / onBackPress)。MyComponent和其子組件Child分別聲明了各自的組件級別生命周期函數(aboutToAppear / onDidBuild/aboutToDisappear)修噪。

  • 應用冷啟動的初始化流程為:MyComponent aboutToAppear --> MyComponent build --> MyComponent onDidBuild--> Child aboutToAppear --> Child build --> Child onDidBuild --> Index onPageShow查库。
  • 點擊“delete Child”,if綁定的this.showChild變成false黄琼,刪除Child組件樊销,會執(zhí)行Child aboutToDisappear方法。
  • 點擊“push to next page”,調用router.pushUrl接口现柠,跳轉到另外一個頁面,當前Index頁面隱藏弛矛,執(zhí)行頁面生命周期Index onPageHide够吩。此處調用的是router.pushUrl接口,Index頁面被隱藏丈氓,并沒有銷毀周循,所以只調用onPageHide。跳轉到新頁面后万俗,執(zhí)行初始化新頁面的生命周期的流程湾笛。
  • 如果調用的是router.replaceUrl,則當前Index頁面被銷毀闰歪,執(zhí)行的生命周期流程將變?yōu)椋篒ndex onPageHide --> MyComponent aboutToDisappear --> Child aboutToDisappear嚎研。上文已經提到,組件的銷毀是從組件樹上直接摘下子樹库倘,所以先調用父組件的aboutToDisappear临扮,再調用子組件的aboutToDisappear,然后執(zhí)行初始化新頁面的生命周期流程教翩。
  • 點擊返回按鈕杆勇,觸發(fā)頁面生命周期Index onBackPress,且觸發(fā)返回一個頁面后會導致當前Index頁面被銷毀饱亿。
  • 最小化應用或者應用進入后臺蚜退,觸發(fā)Index onPageHide。當前Index頁面沒有被銷毀彪笼,所以并不會執(zhí)行組件的aboutToDisappear钻注。應用回到前臺,執(zhí)行Index onPageShow杰扫。
  • 退出應用队寇,執(zhí)行Index onPageHide --> MyComponent aboutToDisappear --> Child aboutToDisappear。
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末章姓,一起剝皮案震驚了整個濱河市佳遣,隨后出現的幾起案子,更是在濱河造成了極大的恐慌凡伊,老刑警劉巖零渐,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異系忙,居然都是意外死亡诵盼,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來风宁,“玉大人洁墙,你說我怎么就攤上這事〗洳疲” “怎么了热监?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長饮寞。 經常有香客問我孝扛,道長,這世上最難降的妖魔是什么幽崩? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任苦始,我火速辦了婚禮,結果婚禮上慌申,老公的妹妹穿的比我還像新娘陌选。我一直安慰自己,他們只是感情好太示,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布柠贤。 她就那樣靜靜地躺著,像睡著了一般类缤。 火紅的嫁衣襯著肌膚如雪臼勉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天餐弱,我揣著相機與錄音宴霸,去河邊找鬼。 笑死膏蚓,一個胖子當著我的面吹牛瓢谢,可吹牛的內容都是我干的。 我是一名探鬼主播驮瞧,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼氓扛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了论笔?” 一聲冷哼從身側響起采郎,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狂魔,沒想到半個月后蒜埋,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡最楷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年整份,在試婚紗的時候發(fā)現自己被綠了待错。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡烈评,死狀恐怖火俄,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情讲冠,我是刑警寧澤烛占,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站沟启,受9級特大地震影響,放射性物質發(fā)生泄漏犹菇。R本人自食惡果不足惜德迹,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望揭芍。 院中可真熱鬧胳搞,春花似錦、人聲如沸称杨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姑原。三九已至悬而,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锭汛,已是汗流浹背笨奠。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留唤殴,地道東北人般婆。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像朵逝,于是被迫代替她去往敵國和親蔚袍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內容