HarmonyOS鴻蒙學習筆記(28)@entry和@Component的生命周期

@entry和@Component的生命周期

  • @entry和@Component的關系
    • @Component生命周期
    • @Entry生命周期
  • 生命周期流程圖
  • 生命周期展示示例代碼
  • 參考資料

HarmonyOS的生命周期可以分為@Compnent的生命周期和@Entry的生命周期,也就是自定義組件的生命周期和頁面的生命周期。

@entry和@Component的關系

@Component生命周期

@Component即自定義組件,可以組合多個系統組件實現UI的復用,可以調用組件的生命周期。其生命周期有2個:
aboutToAppear:組件即將出現時回調該接口,具體時機為在創建自定義組件的新實例后,在執行其build()函數之前執行。
aboutToDisappear:aboutToDisappear函數在自定義組件析構銷毀之前執行。不允許在aboutToDisappear函數中改變狀態變量,特別是@Link變量的修改可能會導致應用程序行為不穩定。不建議在生命周期aboutToDisappear內使用async await,如果在生命周期的aboutToDisappear使用異步操作(Promise或者回調方法),自定義組件將被保留在Promise的閉包中,直到回調方法被執行完,這個行為阻止了自定義組件的垃圾回收。

@Entry生命周期

@Entry即應用的UI頁面。可以由一個或者多個自定義組件組成,@Entry裝飾的自定義組件為頁面的入口組件,即頁面的根節點,一個頁面有且僅能有一個@Entry。只有被@Entry裝飾的組件才可以調用頁面的生命周期。其生命周期有三個方法
onPageShow:頁面每次顯示時觸發一次,包括路由過程、應用進入前臺等場景。

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

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

生命周期流程圖

生命周期流程如下圖所示,下圖展示的是被@Entry裝飾的組件(頁面)生命周期。
在這里插入圖片描述
可以看出先執行@Compent組件的aboutToAppear和build,然后在執行@Entry的onPageShow.邏輯也很簡單,只有先構建@Component組件,整個UI才能展示出來。

生命周期展示示例代碼

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

// Index.ets
import router from '@ohos.router';

struct MyComponent { showChild: boolean = true; 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');}// 組件生命周期aboutToDisappear() {console.info('MyComponent aboutToDisappear');}build() {Column() {// this.showChild為true,創建Child子組件,執行Child aboutToAppearif (this.showChild) {Child()}// this.showChild為false,刪除Child子組件,執行Child aboutToDisappearButton('delete Child').margin(20).backgroundColor(this.btnColor).onClick(() => {this.showChild = false;})// push到page頁面,執行onPageHideButton('push to next page').onClick(() => {router.pushUrl({ url: 'pages/page' });})}}
}
struct Child { title: string = 'Hello World';// 組件生命周期aboutToDisappear() {console.info('[lifeCycle] Child aboutToDisappear')}// 組件生命周期aboutToAppear() {console.info('[lifeCycle] Child aboutToAppear')}build() {Text(this.title).fontSize(50).margin(20).onClick(() => {this.title = 'Hello ArkUI';})}
}//第二個頁面 page.ets


struct page { textColor: Color = Color.Black; num: number = 0onPageShow() {this.num = 5}onPageHide() {console.log("page onPageHide");}onBackPress() { // 不設置返回值按照false處理this.textColor = Color.Greythis.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,也是頁面的入口組件,即頁面的根節點;

  • 一個是Child,是MyComponent的子組件。

  • 應用冷啟動的初始化流程為:MyComponent aboutToAppear --> MyComponent build --> Child aboutToAppear --> Child build --> Child build執行完畢 --> MyComponent build執行完畢 --> Index onPageShow。

  • 點擊“delete Child”,if綁定的this.showChild變成false,刪除Child組件,會執行Child aboutToDisappear方法。誰消失就執行誰的 aboutToDisapper方法

  • 點擊“push to next page”,調用router.pushUrl接口,跳轉到另外一個頁面,當前Index頁面隱藏,執行頁面生命周期Index onPageHide。此處調用的是router.pushUrl接口,Index頁面被隱藏,并沒有銷毀,所以只調用onPageHide。跳轉到新頁面后,執行初始化新頁面的生命周期的流程。

  • 如果調用的是router.replaceUrl,則當前Index頁面被銷毀,執行的生命周期流程將變為:Index onPageHide --> MyComponent aboutToDisappear --> Child aboutToDisappear。可以看出組件的銷毀是從組件樹上直接摘下子樹,所以先調用父組件的aboutToDisappear,再調用子組件的aboutToDisappear,(所謂皮之不存毛將焉附),然后執行初始化新頁面的生命周期流程。

  • 點擊返回按鈕,觸發頁面生命周期Index onBackPress,且觸發返回一個頁面后會導致當前Index頁面被銷毀。

  • 最小化應用或者應用進入后臺,觸發Index onPageHide。當前Index頁面沒有被銷毀,所以并不會執行組件的aboutToDisappear。應用回到前臺,執行Index onPageShow。

  • 退出應用,執行Index onPageHide --> MyComponent aboutToDisappear --> Child aboutToDisappear。

參考資料

頁面和自定義組件生命周期

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19890.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19890.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19890.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【傳知代碼】雙深度學習模型實現結直腸癌檢測(論文復現)

前言:在醫學領域,科技的進步一直是改變人類生活的關鍵驅動力之一。隨著深度學習技術的不斷發展,其在醫學影像診斷領域的應用正日益受到關注。結直腸癌是一種常見但危害極大的惡性腫瘤,在早期發現和及時治療方面具有重要意義。然而…

快手發布大模型產品“可圖”,超20種創新AI圖像玩法限免上線

近日,快手自研大模型產品“可圖”(Kolors)正式對外開放,支持文生圖和圖生圖兩類功能,已上線20余種AI圖像玩法。目前,用戶可以通過“可圖大模型”官方網站和微信小程序,免費使用各項AI圖像功能。…

純分享#126個電商平臺集合(包含60個不同國家)值得一看

01 亞洲 中國 淘寶:擁有大量的賣家和商品種類,主要面向中國市場。天貓:淘寶旗下的B2C電商平臺,提供品質保證、正品保障的商品。京東:中國第二大B2C電商平臺,提供品質保證、正品保障的商品。蘇寧易購: 中國家電連鎖巨頭蘇寧旗下的…

反VC情緒:加密市場需要新的分布式代幣發行方式

GME事件 GME事件反應了社交媒體在金融決策中的影響力,散戶投資者群體通過集體行動,改變了很多人對股市的看法和參與方式。 GME事件中,meme扮演了核心角色。散戶投資者使用各種meme來溝通策略、激勵持股行為,創造了一種反對華爾街…

【車載開發系列】汽車開發常用工具說明

【車載開發系列】汽車開發常用工具說明 【車載開發系列】汽車開發常用工具說明 【車載開發系列】汽車開發常用工具說明一. CANbedded二. Davinci Configurator Pro三. Davinci Developer-AUTOSAR軟件組件設計工具四. MICROSAR五. MICROSAR OS六. CANdelaStudio七. Volcano VSB八…

Mysql基礎教程(11):DISTINCT

MySQL DISTINCT 用法和實例 當使用 SELECT 查詢數據時,我們可能會得到一些重復的行。比如學生表中有很多重復的年齡。如果想得到一個唯一的、沒有重復記錄的結果集,就需要用到 DISTINCT 關鍵字。 MySQL DISTINCT用法 在 SELECT 語句中使用 DISTINCT 關…

Spring Boot 項目中使用 JSP

文章目錄 Spring Boot 項目中使用 JSP項目結構引入依賴包編寫頁面和后臺運行方式一:Maven 命令運行方式二:在 IDEA 中運行方式三:打 war 包部署運行 Spring Boot 項目中使用 JSP 在 Spring Boot 項目中不是不可以使用 JSP 。想在 Spring Boo…

【React】封裝一個好用方便的消息框(Hooks Bootstrap 實踐)

引言 以 Bootstrap 為例,使用模態框編寫一個簡單的消息框: import { useState } from "react"; import { Modal } from "react-bootstrap"; import Button from "react-bootstrap/Button"; import bootstrap/dist/css/b…

打開C語言常用的內存函數大門(二)—— memmove()函數 (內含memmove的講解和模擬實現)

文章目錄 1. 前言2. memmove()函數2.1 memmove()函數與memcpy()函數的差異2.2 memmove()函數的原型2.3 memmove()函數的使用案例 3. memmove()函數的模擬實現4. 總結 1. 前言 在之前,我向大家介紹了C語言中的一個常用的內存函數memcpy函數。如果你還沒看的話&#…

碼隨想錄算法訓練營Day 52 | 動態規劃part13 | 300.最長遞增子序列、674. 最長連續遞增序列 、718. 最長重復子數組

代碼隨想錄算法訓練營Day 52 | 動態規劃part13 | 300.最長遞增子序列、674. 最長連續遞增序列 、718. 最長重復子數組 文章目錄 代碼隨想錄算法訓練營Day 52 | 動態規劃part13 | 300.最長遞增子序列、674. 最長連續遞增序列 、718. 最長重復子數組300.最長遞增子序列一、一維DP…

12k Star!Continue:Github Copilot 開源本地版、開發效率和隱私保護兼得、豐富功能、LLM全覆蓋!

原文鏈接:(更好排版、視頻播放、社群交流、最新AI開源項目、AI工具分享都在這個公眾號!) 12k Star!Continue:Github Copilot 開源本地版、開發效率和隱私保護兼得、豐富功能、LLM全覆蓋! &…

Beamer中二階導、一階導數的顯示問題

Beamer中二階導、一階導數的顯示問題 在beamer中表示 f ′ f f′和 f ′ ′ f f′′時發現導數符號距離 f f f很近 \documentclass{beamer} \usepackage{amsmath,amssymb}\begin{document} \begin{frame}\frametitle{Derivative}Derivative:\[f^{\prime}(x) \quad f \quad…

C# 讀取txt大文件

1GB以下 using System.Text;namespace DotnetReadTxt;class Program {static void Main(string[] args){try{Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);var gb2312 Encoding.GetEncoding("GB2312");int index 0;using (StreamReader sr ne…

conda與pip的鏡像源與代理設置

conda與pip的鏡像源與代理設置 一、前言二、conda鏡像源設置2.1conda默認鏡像源介紹2.2通過終端設置鏡像源2.3通過配置文件設置鏡像源 三、pip鏡像源設置3.1pip默認鏡像源介紹3.2通過終端臨時設置鏡像源3.3通過配置文件設置一個或多個鏡像源 四、conda代理設置4.1通過終端設置代…

數據結構與算法筆記:基礎篇 - 棧:如何實現瀏覽器的前進和后退功能?

概述 瀏覽器的前進、后退功能,你肯定很熟悉吧? 當依次訪問完一串頁面 a-b-c 之后,點擊瀏覽器的后退按鈕,就可以查看之前瀏覽過的頁面 b 和 a。當后退到頁面 a,點擊前進按鈕,就可以重新查看頁面 b 和 c。但…

放開了去的 ulimit

放開了去的 ulimit 放開了去的 ulimitulimit簡介臨時修改打開文件數目永久修改系統總打開句柄限制更多信息 放開了去的 ulimit ulimit簡介 對于高并發或者頻繁讀寫文件的應用程序而言,有時可能需要修改系統能夠打開的最多文件句柄數,否則就可能會出現t…

HTTPS 原理技術

HTTPS原理技術 背景簡介原理總結 背景 隨著年齡的增長,很多曾經爛熟于心的技術原理已被歲月摩擦得愈發模糊起來,技術出身的人總是很難放下一些執念,遂將這些知識整理成文,以紀念曾經努力學習奮斗的日子。本文內容并非完全原創&am…

Element-ui使用上傳時彈框選擇文件類型

實現效果 1,點擊上傳,上傳文件; 2,選擇文件; 3,彈框選擇文件類型; 4,選擇類型后確定上傳; 一,上傳 跳過; 二,定義彈框下拉框…

Coolmuster Android Assistant: 手機數據管理的全能助手

在數字化時代,智能手機不僅是通訊工具,更是個人數據的中心。隨著數據量的不斷增加,如何有效管理和保護這些數據成為了一個重要議題。Coolmuster Android Assistant應運而生,它是一款專為安卓用戶設計的綜合數據管理軟件&#xff0…

EXCEL數據透視圖中的日期字段,怎樣自動分出年、季度、月的功能?

在excel里,這個果然是有個設置的地方,修改后就好了。 點擊文件選項卡,選項,在高級里,將圖示選項的勾選給取消,然后再創建數據透視表或透視圖,日期就不會自動組合了: 這個選項只對新…