[特殊字符] Harmony OS Next里的Web组件:网页加载的全流程掌控手册

🎉 Harmony OS Next里的Web组件:网页加载的全流程掌控手册

##Harmony OS Next ##Ark Ts ##教育

本文适用于教育科普行业进行学习,有错误之处请指出我会修改。

开发者必看的生命周期回调详解+代码实操指南

作为开发者,你可能经常需要加载本地或在线网页吧?ArkUI的Web组件就是你的超级武器库!它提供了9大关键生命周期回调,让你像开了上帝视角一样感知网页加载的每个心跳💓。


🚦 一、Web组件的9个关键生命周期时刻

1️⃣ aboutToAppear():组件诞生第一课

这是组件实例化后的第一个动作!在build()执行前,记得在这里做三件大事:

aboutToAppear(): void {webview.WebviewController.setWebDebuggingAccess(true); // 🔧开启调试模式customizeSchemes(); // 🌐设置自定义协议权限configCookie(); // 🍪初始化Cookie配置
}

⚠️ 警告:别在这里操作DOM!此时网页还是"胚胎"状态呢~


2️⃣ onControllerAttached:操控权交接仪式

当Controller成功绑定Web组件时触发,相当于拿到汽车钥匙🚗!重点提示:

.onControllerAttached(() => {console.log('🎯控制器已就位!');registerJavaScriptProxy(); // 📦注入JS对象setCustomUserAgent(); // 🕵️‍♂️设置伪装UAthis.controller.loadUrl(); // ⚡可安全调用
})

允许操作:loadUrl(), getWebId()
❌ ​​禁止操作​​:zoomIn(), executeJavaScript()(网页未加载别手痒!)


3️⃣ 拦截双雄:onLoadIntercept vs onOverrideUrlLoading
回调事件触发场景特殊限制使用建议
onLoadIntercept所有URL加载前通用拦截首选✅
onOverrideUrlLoading仅非iframe的HTTP(s)协议加载LoadUrl/iframe加载不触发⚠️特定协议过滤🚩

实战代码对比:

// 万能拦截器
.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:网页诞生第一声啼哭👶
.onPageBegin((event) => {console.log(`🌐网页开始加载:${event.url}`);
})

📌 重点:仅主frame触发!子frame加载时静默无感

5️⃣ onProgressChange:加载进度条实况直播
.onProgressChange((event) => {console.log(`📊加载进度:${event.newProgress}%`);// 主frame完成后仍可能收到子frame进度更新
})
6️⃣ onPageEnd:网页加载毕业典礼🎓
.onPageEnd((event) => {console.log(`🎉加载完成:${event.url}`);// ★最佳JS执行时机★this.controller.executeJavaScript('initPage()');
})

⚠️ 坑点预警:此时DOM可能还未渲染完成!别急着操作元素


🚨 三、异常处理与特殊时刻

7️⃣ onRenderExited:崩溃急救指南

渲染进程突然崩溃时(内存不足/代码异常),这是你的救命通道:

.onRenderExited((event) => {console.error(`💥渲染崩溃!原因码:${event.renderExitReason}`);saveRecoveryData(); // 🛟紧急保存数据this.controller.loadUrl(); // ♻️重启加载
})
8️⃣ onDisAppear:组件退休派对🎭

组件卸载时自动清理资源:

.onDisAppear(() => {promptAction.showToast({ message: '网页已隐藏👋', duration:2000 });releaseMemory(); // 🧹内存清理
})

⚡ 四、性能优化三板斧(附监控代码)

Web组件直接提供三大核心性能指标回调:

📊 性能指标对照表
指标名含义业务价值监控代码
FCP首次内容绘制时间用户感知速度⏱️onFirstContentfulPaint
FMP首次有效绘制时间核心内容可见性👁️onFirstMeaningfulPaint
LCP最大内容渲染时间页面填充完成度📏onLargestContentfulPaint

实战监控代码:

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

🧩 五、完整组件代码示例

// WebComponent.ets
import { webview, Header, WebResourceResponse } from '@kit.ArkWeb';@Entry
@Component
struct MyWebView {controller: webview.WebviewController = new webview.WebviewController();build() {Column() {Web({ src: $rawfile('index.html'),controller: this.controller }).onControllerAttached(() => { /* 控制器绑定 */ }).onPageBegin(() => { /* 加载开始 */ }).onFirstContentfulPaint(() => { /* FCP监控 */ })// ...其他回调挂载}}
}

🚀 六、前端页面最佳实践

<!-- index.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>

💎 重点总结表

阶段关键回调业务操作建议常见坑点
初始化aboutToAppear()调试模式/Cookie设置禁止操作网页元素
控制器绑定onControllerAttached注入JS对象/设置UA避免调用网页操作API
加载中onPageBegin+onProgress展示加载动画多frame进度不同步
加载完成onPageEnd执行JS脚本/埋点上报DOM可能未完成渲染
异常处理onRenderExited崩溃恢复/数据保存需主动重启加载
性能监控onFCP/onFMP/onLCP速度指标上报注意设备性能差异

终极提示:使用onPageVisible预加载次级资源,用onDisAppear释放内存,让你的Web组件丝滑如德芙🍫!


如有问题欢迎在评论区砸场子 👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/89128.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…

数字IC后端实现之Innovus中各种cell名字前缀物理含义

社区新一期T28 a7core 和T12nm A55数字IC后端实现训练营直播课开始预约报名啦&#xff01; 今天给大家分享下Innovus中各种常见cell命名规则及其物理含义。知道这些信息后&#xff0c;后续我们在debug后端项目问题时就可以更高效地定位到具体问题。做为数字IC后端工程师&#…

腐烂之息-(Breath of Decay VR ) 硬核VR游戏

《腐烂之息》 是一款沉浸式VR生存射击游戏&#xff0c;带你进入一个充满丧尸身影的末日世界。在灾难爆发三年后&#xff0c;你将从培养仓中醒来&#xff0c;面对一个废墟般的世界。作为幸存者&#xff0c;你必须依靠自己的智慧&#xff0c;在这个充满危险的世界中生存、同时揭开…

ChatGPT 辅助 PyTorch 开发:从数据预处理到 CNN 图像识别的全流程优化

技术点目录 第一章、ChatGPT与DeepSeek等大语言模型助力AI编程必备技能详解第二章、Python基础知识串讲第三章、PyTorch简介与环境搭建第五章、ChatGPT和DeepSeek等大语言模型助力统计分析与可视化第六章、ChatGPT和DeepSeek等大语言模型助力前向型神经网络第七章、ChatGPT和De…

js正则表达式使用 test match

文章目录 一、介绍二、案例regex.test(ip)用法ip.match(regex)用法 三、regex.test(ip) 和 ip.match(regex) 区别 一、介绍 正则表达式&#xff08;Regular Expression&#xff0c;简称 regex 或 regexp&#xff09;是一种用于描述字符串模式的工具。它可以用来搜索、匹配、替…

强化学习用于长期异质性效应评估学习笔记(三)

在【实验科学中策略的长期异质性效应量化方案探索&#xff08;一&#xff09;】提到了强化学习估计长期价值&#xff0c;将 A/B 策略看作是策略 π 的不同版本&#xff0c;构造马尔可夫决策过程&#xff08;MDP&#xff09;或部分可观测 MDP&#xff08;POMDP&#xff09;&…

for...in 循环深度解析

在JavaScript开发中&#xff0c;for...in循环是一个常见的语法结构&#xff0c;但它在遍历数组时存在很多潜在问题。这些问题如果不加以注意&#xff0c;可能导致意想不到的bug和性能问题。 for…in 循环的本质 for...in循环是设计用来遍历对象属性的&#xff0c;而不是专门为…

MH2213 32位Arm® Cortex®-M3 Core核心并内嵌闪存和SRAM

MH2213 32位Arm Cortex-M3 Core核心并内嵌闪存和SRAM 概述&#xff1a; MH2213 3 2位的Arm Cortex-M3 Core为实现MCU的需要提供了低成本的平台、缩减的引脚数目、降低的系统功耗&#xff0c;同时提供卓越的计算性能和先进的中断系统响应。 基础功能配表&#xff1a; MH2213 32位…

阿里云ACP云计算备考笔记 (6)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …

SQL注入攻击原理与防御全解析

目录 一、引言 二、SQL 注入原理 2.1 SQL 注入的概念 2.2 SQL 注入产生的原因 2.3 SQL 注入的本质 2.4 SQL 注入的关键点 三、SQL 注入的实现方法 3.1 常见的 SQL 注入场景 3.2 不同类型的 SQL 注入方式 3.3 SQL 注入的一般流程 四、SQL 注入的危害 4.1 数据泄露 …

【游戏设计】游戏视角类型及核心特点分析

目录 1 俯视视角 (Top-Down View)1.1 核心特点1.2 典型应用场景1.3 优缺点 2 侧视视角 (Side View)2.1 核心特点2.2 典型应用场景2.3 优缺点 3 等轴测视角 (Isometric View)3.1 核心特点3.2 典型应用场景3.3 优缺点 4 三种视图类型比较5 视角类型选择的黄金法则 视角&#xff0…

本地部署多智能体Manus

Manus作为一款通用型AI Agent产品,凭借其出色的表现引发了广泛的关注和热议。而如今,我们可以通过本地部署多智能体Manus,打造属于自己的智能协作平台,以满足特定需求并实现更高的自主性和安全性。 部署意义 数据安全与隐私保护 :本地部署使得数据无需上传至云端,可…

​​​​​​​《TCP/IP协议卷1》第9章 IP选路

&#x1f30d; 思考&#xff1a;IP 选路是什么&#xff1f;路由表的作用是什么&#xff1f;路由表是如何初始化的&#xff1f;如何更新的 &#xff1f;IP 如何根据路由表进行选路的&#xff1f;选路的方法有哪些&#xff1f; IP 选路是什么&#xff1f; IP选路&#xff0c;也…

ShardingSphere解析:分布式数据库中间件的分片设计与事务管理实践

引用 在现代互联网业务高速扩张的背景下&#xff0c;单机数据库的性能瓶颈与扩展性缺陷日益凸显。分库分表方案虽能有效解决数据存储压力&#xff0c;但手动实现分片路由、跨节点查询及分布式事务管理等复杂逻辑&#xff0c;往往导致开发成本剧增且难以维护。Apache ShardingS…

Langchain构建向量数据库和检索器

目录&#xff1a; 1、安装向量数据库2、代码示例2.1、向量数据库检索文档2.2、检索器2.3、检索器与模型结合 1、安装向量数据库 pip install langchain-chroma2、代码示例 2.1、向量数据库检索文档 #!/usr/bin/env pythonfrom langchain_openai import ChatOpenAI from lang…

C# .NET Core 源代码生成器(dotnet source generators)

介绍 在这篇博文中&#xff0c;我们将介绍源生成器的基础知识、涉及的主要类型、您可能遇到的一些常见问题、如何正确记录这些问题以及如何修复这些问题。 自 2020 年末首次推出 .NET 5 以来&#xff0c;源生成器就已经存在。自首次发布以来&#xff0c;它们已经有了许多改进&a…

Vue:表格动态渲染列,出现多个表格的情况下(弹窗表格和页面显示表格处理)

处理后效果 后端返回弹窗的列数据 后端返回的页面列数据 在正常情况下两者如果在组件中共用同一个key的话&#xff0c;会导致所有的表格中列名&#xff0c;都会是一样的(最后一次请求返回的列)&#xff0c;这样的话&#xff0c;打开弹窗也会影响到页面中已经渲染好的列。 代…

C#实战:解决NPOI读取Excel单元格数值0.00001显示为1E-05的问题

目录 问题复现 原因分析 1. Excel的底层存储机制 2. NPOI的默认读取行为 3. 精度丢失的误解 解决方案 方法一:使用DataFormatter获取格式化值(推荐) 方法二:修改Excel模板格式 方法三:数值类型转换处理 性能对比 总结 在最近的数据分析项目中,我遇到了一个看似…

每日学习一道数模题-2024国赛C题-农作物的种植策略

自研AI生成&#xff0c;仅供参考 数模AI智能体扣子是新一代 AI 大模型智能体开发平台。整合了插件、长短期记忆、工作流、卡片等丰富能力&#xff0c;扣子能帮你低门槛、快速搭建个性化或具备商业价值的智能体&#xff0c;并发布到豆包、飞书等各个平台。https://www.coze.cn/…

.NetCore 8 反射与源生成器(Reflection vs Source Generators)

示例代码&#xff1a;https://download.csdn.net/download/hefeng_aspnet/90959927 找到将 CSV 数据映射到类属性的快速方法 处理 CSV 文件时&#xff0c;一个常见的任务是读取文件并使用其内容填充类的属性。但如果可以自动化这个过程会怎样呢&#xff1f;在本文中&#xf…