鸿蒙next web组件和h5 交互实战来了

news2024/11/13 8:09:28
前言导读

鸿蒙next web组件这个专题之前一直想讲一下 苦于没有时间,周末把代码研究的差不多了,所以就趁着现在这个时间节点分享给大家。也希望能对各位读者网友工作和学习有帮助,废话不多说我们正式开始。

效果图
  • 默认页面 上面H5 下面ArkUI

在这里插入图片描述

  • 在H5输入框输入需要传递的参数 点击按钮发送到ArkUI 展示

在这里插入图片描述

  • 在ArkU输入框输入需要传递的参数 点击按钮发送到H5端 展示

在这里插入图片描述

  • 最终效果 H5调用ArkUI ArkUI调用H5完成流程

在这里插入图片描述

具体实现
  • H5调 ArkUI
H5端代码简单实现
<!-- MainPage.html -->
<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" type="text/css" href="./css/main.css">
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>testApp</title>
</head>
<script>
    window.ohosCallNative.callNative('getProportion', {}, (data) => {
        document.getElementsByTagName("html")[0].style.fontSize = data + 'px';
    })
</script>
<body>
<div class="container">
    <div class="selectConcat">

        <div class="flex-input">
            <input type="tel" id="phone" placeholder="请输入你要传输的数据" oninput="changeVal(event)" value=""/>
        </div>
    </div>
        <div class="bottom-tip" onclick="towebview()">发送数据给鸿蒙原生端</div>

    <div class="select_tips">
        <div id="phone_tip">来自鸿蒙原生的数据</div>
        <div id="concat_tip"></div>
    </div>

</div>
<script src="./js/mainPage.js"></script>
</body>
</html>
调用ArkUI原生方法
function towebview() {
  let input = event.target.value;
  const tel = document.getElementById('phone').value;
  window.ohosCallNative.callNative('changeTel', { tel: tel });
}
添加js和ArkUI交互
Web({
  src: $rawfile('MainPage.html'),
  controller: this.webController
})
  .javaScriptAccess(true)
  .javaScriptProxy(this.jsBridge.javaScriptProxy)
  .height('50%')
  .onPageBegin(() => {
    this.jsBridge.initJsBridge();
  })
调用原生ArkUI 方法
get javaScriptProxy(): JavaScriptItem {
  let result: JavaScriptItem = {
    object: {
      call: this.call
    },
    name: 'JSBridgeHandle',
    methodList: ['call'],
    controller: this.controller
  }
  return result;
}


call = (func: string, params: string): void => {
  const paramsObject: ParamsItem = JSON.parse(params);
  let result: Promise<string> = new Promise((resolve) => resolve(''));
  switch (func) {
    case 'chooseContact':
      result = this.chooseContact();
      break;
    case 'changeTel':
      result = this.changeTel(paramsObject);
      break;
    case 'changeAmount':
      result = this.changeAmount();
      break;
    case 'getProportion':
      result = this.getProportion();
      break;
    default:
      break;
  }
  result.then((data: string) => {
    this.callback(paramsObject?.callID, data);
  })
}



/**
 * Change tel function.
 */
changeTel = (params: ParamsItem): Promise<string> => {
  Logger.info('手机号', JSON.stringify(params));
  const tel: string = params.data.tel ?? '';
  Logger.error("tel -- > "+tel)
  AppStorage.set<string>('tel', tel);
  return new Promise((resolve) => {
    resolve('success');
  })
}

我们通过JavaScriptItem 中的call 接收到H5那边调用 ArkUI 这边方法 拿到传过来的数据然后从存储再 AppStorage然后我们在UI上面展示

  • ArkUI 端代码实现


import { webview } from '@kit.ArkWeb';
import { display } from '@kit.ArkUI';
import { promptAction } from '@kit.ArkUI';
import JSBridge from '../common/utils/JsBridge';
import { CommonConstants } from '../common/constant/CommonConstant';
import Logger from '../common/utils/Logger';


@Extend(TextInput) function  inputStyle(){
  .placeholderColor($r('app.color.placeholder_color'))
  .height(45)
  .fontSize(18)
  .backgroundColor($r('app.color.background'))
  .width('80%')
  .padding({left:0})
  .margin({top:12})
}
//线条样式
@Extend(Line) function  lineStyle(){
  .width('100%')
  .height(1)
  .backgroundColor($r('app.color.line_color'))
}
//黑色字体样式
@Extend(Text) function  blackTextStyle(size?:number ,height?:number){
  .fontColor($r('app.color.black_text_color'))
  .fontSize(18)
  .fontWeight(FontWeight.Medium)
}


@Entry
@Component
struct SelectContact {
  @StorageLink('isClick') isClick: boolean = false;
  @StorageLink('tel') phoneNumber: string = '';
  @StorageLink('proportion') proportion: number = 0;
  @State towebstr:string='';


  @State chargeTip: Resource = $r('app.string.recharge_button');
  webController: webview.WebviewController = new webview.WebviewController();
  private jsBridge: JSBridge = new JSBridge(this.webController,this.towebstr,"获取到的数据");

  aboutToAppear() {
    display.getAllDisplays((err, displayClass: display.Display[]) => {
      if (err.code) {
        Logger.error('SelectContact Page', 'Failed to obtain all the display objects. Code: ' + JSON.stringify(err));
        return;
      }
      this.proportion = displayClass[0].densityDPI / CommonConstants.COMMON_VALUE;
      Logger.info('Succeeded in obtaining all the display objects. Data: ' + JSON.stringify(displayClass));
    });
  }

  build() {
    Column() {
      
      Web({
        src: $rawfile('MainPage.html'),
        controller: this.webController
      })
        .javaScriptAccess(true)
        .javaScriptProxy(this.jsBridge.javaScriptProxy)
        .height('50%')
        .onPageBegin(() => {
          this.jsBridge.initJsBridge();
        })

      Row(){
        Text('原生').blackTextStyle()
        TextInput({placeholder:'请输入要传递给H5的数据'})
          .maxLength(12)
          .type(InputType.Normal)
          .inputStyle()
          .onChange((value:string)=>{
            this.towebstr=value;
          }).margin({left:20})
      }.justifyContent(FlexAlign.SpaceBetween)
      .width('100%')
      .margin({top:8})
      Line().lineStyle().margin({left:80})

      Button('发送数据给网页')
        .width(CommonConstants.FULL_SIZE)
        .height($r('app.float.button_height'))
        .margin({ bottom: $r('app.float.button_margin_bottom'),top:20 })
        .onClick(() => {
          Logger.error("towebstr " +this.towebstr)
          this.jsBridge.chooseContact();
          this.webController.runJavaScript(`window.fromNative("${this.towebstr}")`)

        })

      Row(){
        Text('来自H5的数据').fontSize(15).fontColor(Color.Gray)
        Text(this.phoneNumber).fontSize(20).fontColor(Color.Red)
      }.justifyContent(FlexAlign.Center).margin({top:20})
    }
    .width(CommonConstants.FULL_SIZE)
    .height(CommonConstants.FULL_SIZE)
    .backgroundColor($r('app.color.page_color'))
    .padding({
      left: $r('app.float.margin_left_normal'),
      right: $r('app.float.margin_right_normal')
    })
  }
}
  • ArkUI 调用H5
Button('发送数据给网页')
  .width(CommonConstants.FULL_SIZE)
  .height($r('app.float.button_height'))
  .margin({ bottom: $r('app.float.button_margin_bottom'),top:20 })
  .onClick(() => {
    Logger.error("towebstr " +this.towebstr)
    this.jsBridge.chooseContact();
    this.webController.runJavaScript(`window.fromNative("${this.towebstr}")`)

  })
  • H5 端接收

window.fromNative = (text) => {
  document.getElementById('concat_tip').innerHTML = text
}

最后总结:

鸿蒙这边web组件和安卓的webview 以及ios的 wkwebview 比较像官方也给出了接口原生 ArkUI和H5能互相交互。文章案例中也给出具体的用法,各位可以查阅。如果有什么疑问也可以留言, 如果需要学习更多鸿蒙的知识可以瓜子你好我B站教程

课程地址

B站课程地址:www.bilibili.com/cheese/play…

项目内容:

团队介绍

团队介绍:作者: 坚果派-徐庆 坚果派由坚果等人创建,团队由12位华为HDE以及若干热爱鸿蒙的开发者和其他领域的三十余位万粉博主运营。专注于分享 HarmonyOS/OpenHarmony,ArkUI-X,元服务,仓颉,团队成员聚集在北京,上海,南京,深圳,广州,宁夏等地,目前已开发鸿蒙 原生应用,三方库60+,欢迎进行课程,项目等合作。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习--------------序列模型

目录 序列数据统计工具&#xff08;方案一&#xff09;马尔可夫假设&#xff08;方案二&#xff09;潜变量模型总结 序列模型基于马尔可夫假设方式该部分总代码 单步预测多步预测k步预测该部分总代码 序列数据 实际中数据是有时序结构的。 统计工具 在时间t观察带 x t x_t xt…

二叉搜索树(Java实现)

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多数据结构知识 1.概念 二叉搜索树又称二叉排序树,或者它是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都…

【kafka-01】kafka安装和基本核心概念

Kafka系列整体栏目 内容链接地址【一】afka安装和基本核心概念https://zhenghuisheng.blog.csdn.net/article/details/142213307【二】kafka集群搭建https://zhenghuisheng.blog.csdn.net/article/details/142253288 kafka安装和基本核心概念 一&#xff0c;kafka安装和基本核心…

MoneyPrinterTurbo 安装使用流程

项目地址&#xff1a; https://github.com/harry0703/MoneyPrinterTurbo 开发环境&#xff1a;mac 1 git 下载 # 下载代码到本地 git clone https://github.com/harry0703/MoneyPrinterTurbo.git cd MoneyPrinterTurbo2 docker 配源 在 docker 安装目录执行以下命令显示隐藏…

Spring模块详解Ⅳ(Spring ORM和Spring Transaction)

目录 Spring ORM&#xff08;Object-Relational Mapping&#xff09;作用核心组件使用步骤事务管理代码演示优点挑战总结 Spring Transaction&#xff08;Spring事务管理&#xff09;事务的基本概念Spring事务管理的类型声明式事务管理事务的传播行为&#xff08;Propagation&a…

【LabVIEW学习篇 - 25】:JKI状态机

文章目录 JKI状态机JKI状态机安装JKI状态机的基本了解状态机的运行原理示例 JKI状态机 JKI状态机的核心就是队列消息状态机用户事件处理器模式&#xff0c;JKI状态机采用指定格式的字符串来描述状态。 JKI状态机并没有采用队列而是采用指定的字符串进行存储&#xff0c;它封装…

【论文阅读】PERCEIVER-ACTOR: A Multi-Task Transformer for Robotic Manipulation

Abstract transformers凭借其对大型数据集的扩展能力&#xff0c;彻底改变了视觉和自然语言处理。但在机器人操作中&#xff0c;数据既有限又昂贵。通过正确的问题表述&#xff0c;操纵仍然可以从变形金刚中受益吗&#xff1f;我们使用peract来研究这个问题&#xff0c;peract…

图解Redis 02 | String数据类型的原理及应用场景

介绍 在 Redis 中&#xff0c;String 是一种重要的数据类型&#xff0c;是最基本的 key-value 结构&#xff0c;在这个结构中&#xff0c; value 是一个字符串。value 所能容纳的数据最大长度为512M。 需要注意的是&#xff0c;这里的字符串不只指文本数据&#xff0c;它还可…

Https AK--(ssl 安全感满满)

免责声明&#xff1a;本文仅做分享&#xff01; 目录 https探测 openssl Openssl连接服务器获取基本信息 连接命令&#xff1a; 指定算法连接: 测试弱协议连接是否可以连接: 得到的内容包括&#xff1a; sslscan 在线查询证书 https AK type 中间人AK sslsplit 工具…

【C++题解】1997. 孤独的素数

欢迎关注本专栏《C从零基础到信奥赛入门级&#xff08;CSP-J&#xff09;》 问题&#xff1a;1997. 孤独的素数 类型&#xff1a;二维数组 题目描述&#xff1a; 在一个 n 行 m 列的矩阵王国中&#xff0c;生活着一些整数&#xff0c;其中一些是素数&#xff0c;一些不是素数…

数据中心一体化智能运维方案

数据中心基础运维概述 在当今这个信息化的时代&#xff0c;数据中心作为支撑企业信息化建设的核心枢纽&#xff0c;其运维工作的重要性不言而喻。某数据中心深知运维工作的关键性&#xff0c;因此&#xff0c;从基础环境到网络、服务器存储以及基础软件&#xff0c;每一环节都力…

openeuler 22.03 lts sp4 使用 kubeadm 部署 k8s-v1.28.2 高可用集群

文章目录 [toc]废话篇这篇文章什么时候写的为什么是 openeuler为什么是 22.03 lts sp4高可用架构题外话 干活篇环境介绍系统初始化相关关闭防火墙关闭 selinux关闭 swap开启内核模块开启模块自动加载服务 sysctl 内核参数调整清空 iptables 规则安装各种依赖和工具修改 .bashrc…

R语言的基础知识R语言函数总结

R语言与数据挖掘&#xff1a;公式&#xff1b;数据&#xff1b;方法 R语言特征 对大小写敏感通常&#xff0c;数字&#xff0c;字母&#xff0c;. 和 _都是允许的(在一些国家还包括重音字母)。不过&#xff0c;一个命名必须以 . 或者字母开头&#xff0c;并且如果以 . 开头&…

Python数据分析案例60——扩展变量后的神经网络风速预测(tsfresh)

案例背景 时间序列的预测一直是经久不衰的实际应用和学术研究的对象&#xff0c;但是绝大多数的时间序列可能就没有太多的其他的变量&#xff0c;例如一个股票的股价&#xff0c;还有一个企业的用电量&#xff0c;人的血糖浓度等等&#xff0c;空气的质量&#xff0c;温度这些…

【工具推荐】Agently:一款灵活易用的 AI 应用开发框架

本文内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01; 如果对您有帮助&#xff0c;烦请点赞、关注、转发、订阅专栏&#xff01; 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】&#xff08;全…

LAMP环境搭建记录:基于VM的Ubuntu虚拟机

LAMP环境搭建记录&#xff1a;基于VM的Ubuntu虚拟机 我们从这样的角度出发&#xff1a; 一、简述LAMP环境 二、搭建LAMP环境 一、什么是LAMP环境 首先&#xff0c;该词是复合&#xff1a; ​ LAMP Linux Apache MySQL PHP 其中&#xff0c;逐项简述为&#xff1a; …

基于STM32的温度、电流、电压检测proteus仿真系统(OLED、DHT11、继电器、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STM32F103C8T6 采用DHT11读取温度、滑动变阻器模拟读取电流、电压。 通过OLED屏幕显示&#xff0c;设置电流阈值为80&#xff0c;电流小阈值为50&#xff0c;电压阈值为60&#xff0c;温度阈值…

幼儿与非幼儿识别系统源码分享

幼儿与非幼儿识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

跨域训练评估BEVal:自动驾驶 BEV 的跨数据集评估框架

跨域训练评估BEVal&#xff1a;自动驾驶 BEV 的跨数据集评估框架 Abstract 当前在自动驾驶中的鸟瞰图语义分割研究主要集中在使用单个数据集&#xff08;通常是nuScenes数据集&#xff09;优化神经网络模型。这种做法导致了高度专业化的模型&#xff0c;可能在面对不同环境或…

苹果手机怎么清理照片内存

在使用苹果手机的过程中&#xff0c;照片往往是占用大量存储空间的主要元凶。随着时间的推移&#xff0c;无论是拍照、截图还是通过应用下载的图片&#xff0c;都会逐渐堆积&#xff0c;消耗宝贵的内存资源。合理清理照片内存不仅可以帮助你释放空间&#xff0c;还能优化设备的…