HarmonyOS NEXT实战:加载本地网页资源

简介: 本教程介绍如何在HarmonyOS中使用Web组件加载本地页面和资源,通过实战示例展示如何优化应用启动体验、实现页面跳转及动态加载HTML内容,适用于教育和开发学习场景。

HarmonyOS Next实战##HarmonyOS SDK应用服务##教育

参考资料:
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/web-page-loading-with-web-components#%E5%8A%A0%E8%BD%BD%E6%9C%AC%E5%9C%B0%E9%A1%B5%E9%9D%A2

为了在启动、跳转、弱网等场景下减少用户等待感知,同时为动态内容加载争取时间,可以加载本地页面优化用户体验。

在下面的示例中展示加载本地页面文件的方法:
将本地页面文件放在应用的rawfile目录下,开发者可以在Web组件创建的时候指定默认加载的本地页面,并且加载完成后可通过调用loadUrl()接口变更当前Web组件的页面。

加载本地html文件时引用本地css样式文件可以通过以下方法实现。

<link rel="stylesheet" href="resource://rawfile/xxx.css">
<link rel="stylesheet" href="file:///data/storage/el2/base/haps/entry/cache/xxx.css">// 加载沙箱路径下的本地css文件。

加载 $r 或 $rawfile 本地页面

在resources/rawfile目录下
新增hello.html

<!DOCTYPE html>
<html>
  <body>
    <h1>Hello!</h1>
  </body>
</html>

新增helloAgain.html

<!DOCTYPE html>
<html>
  <body>
    <h1>Hello again!</h1>
  </body>
</html>

新增WebLocalPage

import {
    webview } from '@kit.ArkWeb';
import {
    BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct WebLocalPage {
   
  src: ResourceStr = $rawfile("hello.html")
  webController: webview.WebviewController = new webview.WebviewController();

  build() {
   
    Column({
    space: 10 }) {
   
      Text('WebPage')
        .fontSize(20)
        .fontWeight(FontWeight.Bold)
      Row({
    space: 10 }){
   
        Button('hello')
          .onClick(() => {
   
            try {
   
              // 点击按钮时,通过loadUrl,跳转到hello.html
              this.webController.loadUrl( $rawfile("hello.html"));
            } catch (error) {
   
              console.error(`ErrorCode: ${
     (error as BusinessError).code},  Message: ${
     (error as BusinessError).message}`);
            }
          })
        Button('hello again')
          .onClick(() => {
   
            try {
   
              // 点击按钮时,通过loadUrl,跳转到helloAgain.html
              this.webController.loadUrl( $rawfile("helloAgain.html"));
            } catch (error) {
   
              console.error(`ErrorCode: ${
     (error as BusinessError).code},  Message: ${
     (error as BusinessError).message}`);
            }
          })
      }

      Web({
    src: this.src, controller: this.webController })
        .width('100%')
        .layoutWeight(1)
        .horizontalScrollBarAccess(false)//设置是否显示横向滚动条
        .verticalScrollBarAccess(false) //设置是否显示纵向滚动条
    }
    .height('100%')
    .width('100%')
  }
}

通过 resource协议加载本地资源

将$rawfile替换为resource协议

import {
    webview } from '@kit.ArkWeb';
import {
    BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct WebLocalPage {
   
  // src: ResourceStr = $rawfile("hello.html")
  src: ResourceStr = 'resource://rawfile/hello.html'
  webController: webview.WebviewController = new webview.WebviewController();

  build() {
   
    Column({
    space: 10 }) {
   
      Text('WebPage')
        .fontSize(20)
        .fontWeight(FontWeight.Bold)
      Row({
    space: 10 }) {
   
        Button('hello')
          .onClick(() => {
   
            try {
   
              // 点击按钮时,通过loadUrl,跳转到hello.html
              // this.webController.loadUrl($rawfile("hello.html"));
              this.webController.loadUrl('resource://rawfile/hello.html');
            } catch (error) {
   
              console.error(`ErrorCode: ${
     (error as BusinessError).code},  Message: ${
     (error as BusinessError).message}`);
            }
          })
        Button('hello again')
          .onClick(() => {
   
            try {
   
              // 点击按钮时,通过loadUrl,跳转到helloAgain.html
              // this.webController.loadUrl($rawfile("helloAgain.html"));
              this.webController.loadUrl('resource://rawfile/helloAgain.html');
            } catch (error) {
   
              console.error(`ErrorCode: ${
     (error as BusinessError).code},  Message: ${
     (error as BusinessError).message}`);
            }
          })
      }

      Web({
    src: this.src, controller: this.webController })
        .width('100%')
        .layoutWeight(1)
        .horizontalScrollBarAccess(false)//设置是否显示横向滚动条
        .verticalScrollBarAccess(false) //设置是否显示纵向滚动条
    }
    .height('100%')
    .width('100%')
  }
}

加载HTML格式的文本数据

Web组件的src可直接加载HTML字符串。

// WebComponent.ets
import {
    webview } from '@kit.ArkWeb';
import {
    BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct WebComponent {
   
  controller: webview.WebviewController = new webview.WebviewController();
  htmlStr: string = "data:text/html, <html><body bgcolor=\"green\"><h1>Source:<pre>source</pre></h1></body></html>";

  build() {
   
    Column() {
   
      // 组件创建时,加载htmlStr
      Web({
    src: this.htmlStr, controller: this.controller })
    }
  }
}

Web组件可以通过loadData()接口实现加载HTML格式的文本数据。当开发者不需要加载整个页面,只需要显示一些页面片段时,可通过此功能来快速加载页面,当加载大量html文件时,需设置第四个参数baseUrl为"data"。

// WebComponent.ets
import {
    webview } from '@kit.ArkWeb';
import {
    BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct WebComponent {
   
  controller: webview.WebviewController = new webview.WebviewController();

  build() {
   
    Column() {
   
      Button('loadData')
        .onClick(() => {
   
          try {
   
            // 点击按钮时,通过loadData,加载HTML格式的文本数据
            this.controller.loadData(
              "<html><body bgcolor=\"white\">Source:<pre>source</pre></body></html>",
              "text/html",
              "UTF-8"
            );
          } catch (error) {
   
            console.error(`ErrorCode: ${
     (error as BusinessError).code},  Message: ${
     (error as BusinessError).message}`);
          }
        })
      // 组件创建时,加载www.example.com
      Web({
    src: 'www.example.com', controller: this.controller })
    }
  }
}
目录
相关文章
|
4月前
|
监控 JavaScript 编译器
从“天书”到源码:HarmonyOS NEXT 崩溃堆栈解析实战指南
本文详解如何利用 hiAppEvent 监控并获取 sourcemap、debug so 等核心产物,剖析了 hstack 工具如何将混淆的 Native 与 ArkTS 堆栈还原为源码,助力开发者掌握异常分析方法,提升应用稳定性。
563 65
|
5月前
|
开发者 容器
鸿蒙应用开发从入门到实战(十四):ArkUI组件Column&Row&线性布局
ArkUI提供了丰富的系统组件,用于制作鸿蒙原生应用APP的UI,本文主要讲解Column和Row组件的使用以及线性布局的方法。
428 12
|
5月前
|
API 数据处理
鸿蒙应用开发从入门到实战(十三):ArkUI组件Slider&Progress
ArkUI提供了丰富的系统组件,用于制作鸿蒙原生应用APP的UI,本文主要讲解滑块Slider和进度条Progress组件的使用。
245 1
|
5月前
|
JavaScript 开发者 索引
鸿蒙应用开发从入门到实战(九):ArkTS渲染控制
ArkTS拓展了TypeScript,可以结合ArkUI进行渲染控制,是的界面设计具有可编程性。本文简要描述鸿蒙应用开发中的条件渲染和循环渲染。
248 5
|
4月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
459 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
4月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
436 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
4月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
880 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
5月前
|
数据安全/隐私保护 开发者
鸿蒙应用开发从入门到实战(十一):ArkUI组件Text&TextInput
ArkUI提供了丰富的系统组件,用于制作鸿蒙原生应用APP的UI,本文主要讲解文本组件Text和TextInput的使用。
379 3
|
4月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
235 0
|
5月前
|
存储 缓存 5G
鸿蒙 HarmonyOS NEXT端云一体化开发-云存储篇
本文介绍用户登录后获取昵称、头像的方法,包括通过云端API和AppStorage两种方式,并实现上传头像至云存储及更新用户信息。同时解决图片缓存问题,添加上传进度提示,支持自动登录判断,提升用户体验。
236 1

热门文章

最新文章