鴻蒙Next Web組件生命周期詳解:從加載到銷毀的全流程掌控

想要精通鴻蒙應用開發?Web組件的9大生命周期回調是你必須掌握的上帝視角!

在鴻蒙應用開發中,Web組件是我們加載本地或在線網頁的強大工具。它提供了完整的生命周期回調體系,讓開發者能夠精準感知網頁加載的每個階段,從而優化用戶體驗并處理各種業務場景。

一、Web組件生命周期概述

ArkUI的Web組件提供了9個關鍵生命周期回調,覆蓋了從組件初始化、網頁加載、進度監控到異常處理和資源清理的全過程。這些回調函數讓我們能夠像開了"上帝視角"一樣掌控網頁加載的每個細節。

為了幫助你快速建立整體認識,下面這張圖梳理了Web組件的核心生命周期回調及其典型觸發場景:

圖表

代碼

二、初始化階段的生命周期

1. aboutToAppear() - 組件誕生第一課

這是組件實例化后的第一個生命周期回調,在build()函數執行前觸發。在這里我們可以進行一些初始化操作:

typescript

aboutToAppear(): void {webview.WebviewController.setWebDebuggingAccess(true); // 開啟調試模式customizeSchemes(); // 設置自定義協議權限configCookie(); // 初始化Cookie配置
}

???注意:此時網頁還是"胚胎"狀態,不要在這里操作DOM!

2. onControllerAttached - 操控權交接儀式

當Controller成功綁定Web組件時觸發,相當于拿到了操作Web組件的"鑰匙"。

typescript

.onControllerAttached(() => {console.log('🎯控制器已就位!');registerJavaScriptProxy(); // 注入JS對象setCustomUserAgent(); // 設置自定義用戶代理this.controller.loadUrl(); // 可安全調用加載URL
})

??允許的操作:loadUrl(), getWebId()
??禁止的操作:zoomIn(), executeJavaScript()(網頁未加載不要調用!)

三、網頁加載過程的生命周期

3. 攔截雙雄:onLoadIntercept vs onOverrideUrlLoading

Web組件提供了兩個重要的攔截回調,用于控制網頁加載過程:

回調事件觸發場景特殊限制使用建議
onLoadIntercept所有URL加載前通用攔截首選 ?
onOverrideUrlLoading僅非iframe的HTTP(s)協議加載LoadUrl/iframe加載不觸發 ??特定協議過濾 🚩

實戰代碼對比:

typescript

// 萬能攔截器
.onLoadIntercept((event) => {if (event.data.getRequestUrl().includes('ads')) {console.log('🛑攔截廣告請求!');return true; // 阻斷加載}return false;
})// 協議專項處理
.onOverrideUrlLoading((req) => {if (req.getRequestUrl() === 'about:blank') {console.log('🚫拒絕空白頁請求');return true; }return false;
})

4. onPageBegin - 網頁開始加載

當網頁開始加載時觸發,且只在主frame觸發(iframe或frameset的內容加載不會觸發此回調):

typescript

.onPageBegin((event) => {console.log(`🌐網頁開始加載:${event.url}`);
})

5. onProgressChange - 加載進度實況直播

這個回調讓我們能夠獲取當前頁面加載的進度信息,非常適合實現進度條功能:

typescript

.onProgressChange((event) => {console.log(`📊加載進度:${event.newProgress}%`);// 注意:主frame完成后仍可能收到子frame進度更新
})

6. onPageEnd - 網頁加載完成

當網頁加載完成時觸發,也只在主frame觸發

typescript

.onPageEnd((event) => {console.log(`🎉加載完成:${event.url}`);// ★最佳JS執行時機★this.controller.executeJavaScript('initPage()');
})

???坑點預警:此時DOM可能還未渲染完成!不要急著操作DOM元素。

四、性能監控生命周期

Web組件直接提供了三大核心Web性能指標回調,幫助我們監控頁面加載性能:

指標名含義業務價值監控代碼
FCP首次內容繪制時間用戶感知速度 ??onFirstContentfulPaint
FMP首次有效繪制時間核心內容可見性 👁?onFirstMeaningfulPaint
LCP最大內容渲染時間頁面填充完成度 📏onLargestContentfulPaint

實戰監控代碼:

typescript

.onFirstContentfulPaint(event => {console.log(`🚩FCP指標:${event.firstContentfulPaintMs}ms`);
})
.onFirstMeaningfulPaint(event => {console.log(`🚀FMP指標:${event.firstMeaningfulPaintMs}ms`);
})
.onLargestContentfulPaint(event => {console.log(`📌LCP指標:${event.largestContentfulPaintMs}ms`);
})

五、異常處理生命周期

7. onRenderExited - 渲染進程崩潰處理

當渲染進程異常退出時(內存不足/代碼異常),這個回調是我們的救命通道:

typescript

.onRenderExited((event) => {console.error(`💥渲染崩潰!原因碼:${event.renderExitReason}`);saveRecoveryData(); // 緊急保存數據this.controller.loadUrl(); // ??重啟加載
})

8. onDisAppear - 組件卸載時的清理

組件卸載時觸發,用于自動清理資源:

typescript

.onDisAppear(() => {promptAction.showToast({ message: '網頁已隱藏👋', duration:2000 });releaseMemory(); // 🧹內存清理
})

六、完整組件代碼示例

下面是一個整合了主要生命周期回調的完整Web組件示例:

typescript

// WebComponent.ets
import { webview, Header, WebResourceResponse } from '@kit.ArkWeb';@Entry
@Component
struct MyWebView {controller: webview.WebviewController = new webview.WebviewController();aboutToAppear(): void {// 初始化配置webview.WebviewController.setWebDebuggingAccess(true);customizeSchemes();configCookie();}build() {Column() {Web({ src: $rawfile('index.html'),controller: this.controller }).onControllerAttached(() => {console.log('控制器綁定完成');registerJavaScriptProxy();setCustomUserAgent();}).onLoadIntercept((event) => {// URL攔截邏輯return false;}).onPageBegin((event) => {console.log(`開始加載:${event.url}`);}).onProgressChange((event) => {console.log(`加載進度:${event.newProgress}%`);}).onPageEnd((event) => {console.log(`加載完成:${event.url}`);this.controller.executeJavaScript('initPage()');}).onFirstContentfulPaint((event) => {console.log(`FCP指標:${event.firstContentfulPaintMs}ms`);}).onRenderExited((event) => {console.error(`渲染崩潰!原因碼:${event.renderExitReason}`);this.controller.loadUrl();}).onDisAppear(() => {releaseMemory();})}}
}

七、前端頁面最佳實踐

為了最大化利用Web組件的生命周期特性,前端頁面也需要做相應優化:

html

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><!-- 重要提示:預加載關鍵資源 --><link rel="preload" href="main.css" as="style">
</head>
<body><!-- 首屏優先展示內容 --><h1 data-fcp-marker>歡迎使用ArkWeb!</h1><!-- 延遲加載非核心資源 --><script defer src="analytics.js"></script>
</body>
</html>

八、常見問題與避坑指南

  1. 不要在aboutToAppear中操作DOM:此時網頁還未創建,操作DOM會失敗。

  2. onPageEnd不能保證DOM已渲染:如果需要操作DOM,建議使用setTimeout延遲執行或監聽DOMContentLoaded事件。

  3. 謹慎使用異步操作:在aboutToDisappear中避免使用async/await,否則會阻止組件的垃圾回收。

  4. 及時清理資源:在onDisAppear中釋放定時器、事件監聽器等資源,防止內存泄漏。

總結

通過熟練掌握Web組件的9大生命周期回調,我們能夠:- 精準控制網頁加載過程 🤖 - 優化性能體驗 🚀 - 有效處理異常情況 🚑 - 避免內存泄漏和資源浪費 💾

終極提示:使用onPageVisible預加載次級資源,用onDisAppear釋放內存,讓你的Web組件絲滑如德芙!

希望這篇博客能幫助你全面掌握鴻蒙Next Web組件的生命周期管理。如有任何問題,歡迎在評論區討論!

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

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

相關文章

python學習進階之異常和文件操作(三)

文章目錄1.程序異常2.文件操作3.json操作1.程序異常 1.1 異常 異常概念&#xff1a; 程序在運行時, 如果Python解釋器遇到到一個錯誤, 則會停止程序的執行, 并且提示一些錯誤信息, 這就是異常 拋出異常&#xff1a; 程序停止執行并且提示錯誤信息這個動作, 通常稱之為拋出(ra…

NodeJS 8 ,從 0 到 1:npm 包發布與更新全流程指南( 含多場景適配與踩坑總結 )

目錄 前言 一、準備工作 1.1 開發環境搭建 1.1.1 環境安裝 1.1.2 配置問題 1.2 賬號注冊 1.2.1 賬號注冊&#xff08;兩種方式&#xff09; 1.2.2 登錄驗證 1.2.3 個人設置 1.2.4 安全配置 1.3 初始配置 1.3.1 初始項目目錄 1.3.2 關鍵字段詳解 1.3.3 手動完善 二…

BERT中文預訓練模型介紹

bert-base-chinese 是由谷歌基于 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;模型預訓練得到的適用于中文任務的模型版本。以下從多個方面對其進行詳細解釋&#xff1a; 模型概述 BERT 是一種基于 Transformer 架構的預訓練語言模型…

Archon01-項目部署

Archon01-項目部署當前已經參考B站視頻針對代碼進行修改&#xff0c;可直接使用BigModel智譜的GLM-4.5替換openAI進行使用&#xff0c;部署環境&#xff08;Python3.12-slim環境&#xff09;1-核心知識點關鍵字&#xff1a; Docker Supabase Archon BigModel Python1&#xff0…

HarmonyOS時間戳完全指南:DevEco Studio中的時間處理與實戰應用

時間戳是現代應用開發中不可或缺的基礎功能&#xff0c;無論是日志記錄、數據同步、緩存管理還是狀態追蹤都離不開時間戳的支持。本文將深入探討在DevEco Studio中如何處理和使用時間戳&#xff0c;并提供豐富的實戰示例。一、時間戳基礎概念什么是時間戳&#xff1f;時間戳&am…

論文筆記:On the Biology of a Large Language Model

《關于大型語言模型的生物學》&#xff08;On the Biology of a Large Language Model&#xff09;的文章&#xff0c;深入探究了 Anthropic 公司 Claude 3.5 Haiku 模型的內部工作機制。研究人員將理解語言模型比作生物學研究&#xff0c;旨在揭示其復雜行為背后的“神經回路”…

TCP/IP、HTTP 和 HTTPS簡介

我們來系統地介紹一下 TCP/IP、HTTP 和 HTTPS。它們之間的關系可以概括為&#xff1a;??HTTP 和 HTTPS 是運行在 TCP/IP 基礎網絡架構之上的具體應用協議??。為了更直觀地理解它們之間的關系&#xff0c;我們可以參考下面的網絡分層模型&#xff1a;flowchart TDsubgraph A…

【30】C#實戰篇——獲取路徑下的文件名(不包含路徑和擴展名),文件名由連續的數字編號+連續的字母編號組成,并分離出文件名數字部分和英文部分

文章目錄1 要求2 分析 與 實現1 要求 寫一個函數&#xff0c;獲取路徑下的文件名&#xff08;不包含路徑和擴展名&#xff09;&#xff0c;并分離出文件名fileName &#xff0c;文件名編號SN&#xff0c;文件名前綴WMT &#xff1b; 輸入文件路徑&#xff0c;解析出不帶"…

EasyExcel部署Docker缺少字體報錯

報文 java.lang.NullPointerException: nullat sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)at sun.awt.FontConfiguration.init(FontConfiguration.java:107)at sun.awt.…

從“收款工具”到“智能中樞”:AI如何重構POS系統的技術架構與商業價值?

引?:從交易終端到智能中樞的?字路? 在現代商業的繁忙圖景中 ,銷售點( Point of Sale, POS) 系統?期以來被視為交易流程的終點 ——?個簡單完成收款、打印票據的?具。然? ,這?認知正在被迅速顛覆。 隨著數字經濟的深 化 ,POS系統已演變為連接顧客、 商品與服務的…

unity以戰斗截圖并加上微信二維碼分享

開發游戲時&#xff0c;會遇到戰斗結算&#xff0c;成就等獎勵界面&#xff0c;鼓勵玩家分享到朋友圈&#xff0c;這時通常會在圖片上加上一些內容&#xff0c;比如游戲Logo&#xff0c;二維碼下載等內容。現在分享一下我制作游戲分享圖片的過程。第一步首先截圖&#xff0c;截…

新手向:實現驗證碼程序

本文將從零開始&#xff0c;通過一個簡單的驗證碼程序。即使你沒有任何編程基礎&#xff0c;也能跟著這篇文章一步步學習。第一章&#xff1a;Java開發環境搭建1.1 安裝JDK要開始Java編程&#xff0c;首先需要安裝Java開發工具包(JDK)。JDK是Java開發的核心環境&#xff0c;包含…

使用Flask實現接口回調地址

使用Flask實現接口回調地址 一、接口回調的基本概念 接口回調&#xff08;Callback&#xff09;是一種異步通信機制&#xff0c;當某個事件發生時&#xff08;如支付完成、任務結束&#xff09;&#xff0c;服務提供方會主動調用預先配置的URL&#xff08;即回調地址&#xff0…

vue2+jessibuca播放h265視頻

文檔地址&#xff1a;http://jessibuca.monibuca.com/api.html#background 1,文件放在public中 2,在html中引入 3&#xff0c;子組件 <template><div :id"container id"></div> </template><script> export default {props: [url,…

Behavioral Fingerprinting of Large Language Models

Behavioral Fingerprinting of Large Language Models Authors: Zehua Pei, Hui-Ling Zhen, Ying Zhang, Zhiyuan Yang, Xing Li, Xianzhi Yu, Mingxuan Yuan, Bei Yu Deep-Dive Summary: 行為指紋識別大型語言模型 摘要 當前的大型語言模型&#xff08;LLMs&#xff09;基…

某互聯網大廠的面試go語言從基礎到實戰的經驗和總結

### 一面 #### 1. **實習項目**- 可以簡要描述你的項目經歷&#xff0c;最好是與職位相關的項目。如果是與技術棧相關的項目&#xff0c;比如 Go、C、Golang 或 Python&#xff0c;重點講述項目中的技術細節和你如何解決問題。#### 2. **Go學習多久**- 說明你學習 Go 語言的時間…

掌握Java控制流:編程決策的藝術

控制流語句是用來 控制程序執行順序 的關鍵工具&#xff0c;它們允許你根據不同的條件執行不同的代碼塊&#xff0c;或者重復執行某段代碼。這使得程序能夠根據輸入和情況做出智能的決策&#xff0c;而不僅僅是線性的執行。1. 條件語句 (Conditional Statements)條件語句允許你…

Docker 安裝 MySQL 和 Redis 完整指南

前言 在開發環境中,使用 Docker 安裝數據庫服務是一種快速、便捷的方式。本文將詳細介紹如何在 macOS 上使用 Docker 安裝 MySQL 和 Redis,并解決國內網絡訪問 Docker Hub 的問題。 環境準備 macOS 系統 Docker Desktop 已安裝 網絡連接 配置 Docker 國內鏡像源 方法一:通…

Spring Boot---自動配置原理和自定義Starter

1.自動配置原理2.自定義starter①dmybatis-spring-boot-autoconfigure步驟一&#xff1a;先創建項目步驟二&#xff1a;導入響應的依賴步驟三&#xff1a;創建自動配置的配置類步驟四&#xff1a;創建配置文件項目結構②dmybatis-spring-boot-starter步驟一&#xff1a;先創建項…

【后端】MySQL 常用 SQL 語句大全

整理一份 MySQL 常用 SQL 語句大全&#xff0c;從基礎操作到進階查詢&#xff0c;都涵蓋。方便日常開發和學習參考。1. 數據庫操作-- 查看所有數據庫 SHOW DATABASES;-- 創建數據庫 CREATE DATABASE db_name;-- 刪除數據庫 DROP DATABASE db_name;-- 使用數據庫 USE db_name;--…