当前位置: 首页 > news >正文

HarmonyOS ArkWeb 系列之组件四种加载方式:loadUrl、loadData、rawfile 和 resource 协议完全指南

文章目录

    • 先把四种方式整体过一遍
    • 方式一:加载在线 URL
    • 方式二:rawfile — 加载本地 HTML 文件
    • 方式三:resource 协议 — 动态加载本地资源
    • 方式四:loadData — 直接渲染 HTML 字符串
    • 流程图:四种加载方式对比
    • 加载富文本数据(loadRichText)
    • 加载后动态切换页面
    • 选哪种方式?

Web 组件怎么显示内容?说白了就一件事:告诉它"去哪里拿页面"。HarmonyOS ArkWeb 提供了四种截然不同的加载方式,分别适合不同场景。搞清楚这四种方式,开发体验直接上一个台阶。

先把四种方式整体过一遍

方式典型用法适合场景
在线 URLWeb({ src: 'https://...' })加载网络页面
rawfileWeb({ src: $rawfile('index.html') })加载本地 HTML 文件
resource 协议Web({ src: 'resource://rawfile/index.html' })动态切换本地资源
loadDatacontroller.loadData(htmlStr, ...)直接渲染 HTML 字符串

下面逐一拆解。

方式一:加载在线 URL

最基础的用法,直接传网址:

import{webview}from'@kit.ArkWeb';import{BusinessError}from'@kit.BasicServicesKit';@Entry@Componentstruct LoadUrlPage{controller:webview.WebviewController=newwebview.WebviewController();build(){Column(){Button('跳转到 example1.com').onClick(()=>{try{// 页面已经显示后,用 loadUrl 切换到新地址this.controller.loadUrl('https://www.example1.com');}catch(error){console.error(`ErrorCode:${(errorasBusinessError).code}, Message:${(errorasBusinessError).message}`);}})// 组件创建时先加载这个地址Web({src:'https://www.example.com',controller:this.controller}).width('100%').height('100%')}}}

几个要注意的点

  • Web({ src })里的地址是组件初始加载的页面
  • 要切换页面,调controller.loadUrl(),不要直接修改 src
  • http 地址需要在module.json5里申请网络权限:ohos.permission.INTERNET

方式二:rawfile — 加载本地 HTML 文件

把 HTML 文件放在src/main/resources/rawfile/目录下,用$rawfile()引用:

import{webview}from'@kit.ArkWeb';@Entry@Componentstruct RawfilePage{controller:webview.WebviewController=newwebview.WebviewController();build(){Column(){// $rawfile('index.html') 指向 src/main/resources/rawfile/index.htmlWeb({src:$rawfile('index.html'),controller:this.controller}).width('100%').height('100%')}}}

rawfile 里的 HTML 可以正常引用同目录下的 CSS、JS、图片:

<!-- src/main/resources/rawfile/index.html --><!DOCTYPEhtml><html><head><linkrel="stylesheet"href="style.css"></head><body><h1>本地页面</h1><scriptsrc="app.js"></script></body></html>

方式三:resource 协议 — 动态加载本地资源

$rawfile()是编译期静态引用,如果你想运行时动态指定本地文件路径,就用resource://rawfile/协议:

import{webview}from'@kit.ArkWeb';import{BusinessError}from'@kit.BasicServicesKit';@Entry@Componentstruct ResourceLoadPage{controller:webview.WebviewController=newwebview.WebviewController();build(){Column(){Button('加载 index1.html').onClick(()=>{try{// resource://rawfile/ 后面跟文件名,运行时动态指定this.controller.loadUrl('resource://rawfile/index1.html');}catch(error){console.error(`ErrorCode:${error.code}, Message:${error.message}`);}})// 初始加载 index.htmlWeb({src:'resource://rawfile/index.html',controller:this.controller}).width('100%').height('100%')}}}

resource://rawfile/$rawfile()指向同一个目录,区别是前者是字符串,可以拼接、动态构造。

方式四:loadData — 直接渲染 HTML 字符串

不需要任何文件,直接把 HTML 内容当字符串传进去渲染:

import{webview}from'@kit.ArkWeb';import{BusinessError}from'@kit.BasicServicesKit';@Entry@Componentstruct LoadDataPage{controller:webview.WebviewController=newwebview.WebviewController();// 要渲染的 HTML 内容@StatehtmlContent:string='<!DOCTYPE html>'+'<html><head><title>动态内容</title></head>'+'<body>'+'<h1 style="color: #007AFF;">这是动态生成的内容</h1>'+'<p>无需任何文件,直接渲染字符串</p>'+'</body></html>';build(){Column(){Button('刷新内容').onClick(()=>{try{this.controller.loadData(this.htmlContent,'text/html',// mimeType'UTF-8'// encoding);}catch(error){console.error(`ErrorCode:${(errorasBusinessError).code}, Message:${(errorasBusinessError).message}`);}})Web({src:'about:blank',controller:this.controller}).width('100%').height('100%')}}}

loadData非常适合:

  • 展示用户生成的富文本内容(帖子、文章详情)
  • 渲染模板 + 数据拼接出的动态页面
  • 在不依赖网络的情况下显示格式化内容

流程图:四种加载方式对比

加载富文本数据(loadRichText)

如果只是展示纯 HTML 片段,还有个更简单的方式loadRichText,不需要完整的 HTML 文档结构:

import{webview}from'@kit.ArkWeb';import{BusinessError}from'@kit.BasicServicesKit';@Entry@Componentstruct RichTextPage{controller:webview.WebviewController=newwebview.WebviewController();build(){Column(){Button('加载富文本').onClick(()=>{try{// 直接传 HTML 片段,不需要 <html><body> 等标签this.controller.loadRichText('<h2>标题</h2><p>正文内容,<b>加粗</b>,<i>斜体</i></p>');}catch(error){console.error(`ErrorCode:${(errorasBusinessError).code}, Message:${(errorasBusinessError).message}`);}})Web({src:$rawfile('index.html'),controller:this.controller}).width('100%').height('100%')}}}

加载后动态切换页面

加载完成后,可以在onPageEnd里做后续操作。比如页面 A 加载完了,自动预加载页面 B:

import{webview}from'@kit.ArkWeb';@Entry@Componentstruct AutoNavigatePage{controller:webview.WebviewController=newwebview.WebviewController();build(){Column(){Web({src:'https://www.example.com',controller:this.controller}).onPageEnd((event)=>{if(event){console.info('当前页加载完成:',event.url);// 在这里可以执行跳转、注入脚本等操作}}).width('100%').height('100%')}}}

选哪种方式?

  • 纯展示网络内容→ 在线 URL
  • App 内嵌静态页面(帮助文档、协议页面)→ rawfile
  • 根据用户行为动态切换本地页→ resource 协议
  • 渲染动态数据(API 返回的富文本、模板页)→ loadData / loadRichText

四种方式没有高下之分,选对场景就好。

http://www.jsqmd.com/news/842319/

相关文章:

  • 别再只会用Audition变调器了!iZotope算法和Audition算法到底怎么选?保姆级对比指南
  • 如何高效推动区域科技创新成果转化?
  • SARScape 5.6 踩坑实录:DEM导入报错?可能是这个文件后缀在捣鬼
  • NotebookLM数学研究辅助实战手册(从LaTeX建模到自动定理生成)
  • ZYNQ --- Linux成长之路 --- 从VDMA到FrameBuffer:LCD驱动的实战解析
  • Audiveris:如何将纸质乐谱快速转换为可编辑数字格式的完整指南
  • 2026年降AIGC全指南:10款降AI工具深度实测,手把手教你保留格式降低AI率 - 降AI实验室
  • 不止于对比实验:用PlatEMO 3.0的GUI模式高效调试你的自定义算法
  • UE5.1 C++项目编译太慢?试试修改这个XML文件,我的编译时间从6秒降到了1.5秒
  • 嵌入式Linux SPI调试:手把手教你用spidev_test和spi-tools搞定硬件通信
  • 从10M到1G:深入拆解Xilinx TEMAC IP核的接口选择与配置陷阱(MII/GMII/RGMII/SGMII全解析)
  • 2026年钦州权威黄金回收机构TOP5实测排行:崇左黄金回收/防城港黄金回收/南宁黄金回收/桂林黄金回收/百色黄金回收/选择指南 - 优质品牌商家
  • ncmdump解密指南:3分钟掌握网易云NCM格式转换核心技术
  • 科研党必备:用wget批量下载Zenodo数据集,告别手动点击的烦恼
  • 企业微信欢迎语功能教程:新客户添加后如何自动触达?
  • 5GC核心网元入门:从AMF到UPF,一张图看懂5G网络里的‘新部门’都是干啥的
  • Windows 11 LTSC 如何快速添加微软商店?3分钟一键部署教程
  • Trinket驱动I2C LCD与DHT22:极简引脚实现温湿度监测
  • Windows Server 2016上Winmail邮件服务器搭建保姆级教程(含虚拟机环境配置与内外网测试)
  • 3分钟让你的安卓手机变身万能键盘鼠标:USB HID Client实用指南
  • Qt 知识点及简易思维导图
  • 399裂变模式开发介绍【系统代码】
  • SAP 实战篇:Script脚本进阶,从录制到智能循环批量处理
  • 告别create_ap:在Ubuntu 22.04上用NetworkManager原生配置WiFi热点(不断开原有连接)
  • 2026年Q2郴州黄金回收鉴定机构排行实测:郴州银元回收鉴定/郴州各类名酒回收/郴州名表回收/郴州名酒回收鉴定/选择指南 - 优质品牌商家
  • 2026年5月新发布:智创云客如何以GEO优化重塑四川企业营销格局? - 2026年企业推荐榜
  • 终极解密:快速将QQ音乐加密格式转换为MP3/FLAC的完整指南
  • DSU-120的CompAck响应机制与CHI.E协议解析
  • MMDetection3D模块详解:从体素编码到检测头,手把手教你配置PointPillars与SECOND
  • 3分钟快速上手:用TMSpeech将电脑声音实时转为字幕的完整指南