HarmonyOS 鸿蒙Next Web组件的onMessageEventExt如何接收到的result为一个数组且数组中的数据为对象

发布于 1周前 作者 nodeper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next Web组件的onMessageEventExt如何接收到的result为一个数组且数组中的数据为对象

Web组件的onMessageEventExt 接收到的result如何能接收到一个数组,且数组中的数据是一个对象。源码中的数组接收的时候是string | number | boolean 有什么方式可以改来兼容一下,因为现在h5发送的参数当中包含了方法,不能直接转成字符串传输

2 回复

目前getArray这个接口仅支持Array<string | number | boolean>,目前是不支持传对象

如果是h5那边传对象内有方法,可以尝试先将对象转成JSON字符串,再转换成ArkTs内定义的对应对象

JSON转对象需要用此三方库

鸿蒙目前支持异步执行JavaScript脚本,并通过回调方式返回脚本执行的结果。

具体参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-webview

想要将H5传递的对象字符串转化为ArkTs对象,需要先在ArkTs定义对象,然后使用deserialize将其转化为对应的对象 比如说想将{ name: ‘nicek’, age: 15, gender: ‘男’ }这个对象转化为ArkTs的对象,那么就要先在ArkTs里定义一个这个类,再用deserialize将其转化为对应的对象 参考代码如下:

xxx.ets

……

webController: webview.WebviewController = new webview.WebviewController();

class jsonData{
  @Expose
  name?: string;
  @Expose
  age?: number;
  @Expose
  gender?: string;
}

Web(src:"……",controller: this.webController)
.onMessageEventExt((result)=>{
const response:jsonData = deserialize(jsonData,result.getString())//接受的result是一个字符串
const responseArray:jsonData[] = deserializeArray(jsonData,result.getArray())//接受的result是一个数组
})

……

开发者您好,这个是ets端的完整代码

import { Expose,deserialize, deserializeArray } from 'class-transformer';
import { webview } from '@kit.ArkWeb';

class jsonData{
  @Expose
  name?: string;
  @Expose
  age?: number;
  @Expose
  gender?: string;
}

@Entry
@Component
struct Demo {
  webController: webview.WebviewController = new webview.WebviewController();
  nativePort: webview.WebMessagePort | null = null;
  ports: webview.WebMessagePort[] = [];
  message: webview.WebMessageExt = new webview.WebMessageExt();
  @State msg1: string = "";
  @State msg2: string = "";

  build() {
    Row() {
      Web({
        src:$rawfile("index.html"),
        controller: this.webController
      })
      .javaScriptAccess(true)
      .onPageEnd(()=>{
        // 1. 创建消息端口
        this.ports = this.webController.createWebMessagePorts(true);
        // 2. 发送端口1到HTML5
        this.webController.postMessage("init_web_messageport", [this.ports[1]], "*");
        // 3. 保存端口0到本地
        this.nativePort = this.ports[0];
        this.nativePort.onMessageEventExt((result) => {
          console.log("In ArkTS side got message");
          try {
            let type = result.getType();
            console.log("In ArkTS side getType:" + type);
            switch (type) {
              case webview.WebMessageType.STRING: {
                this.msg1 = "result type:" + typeof (result.getString());
                this.msg2 = "result getString:" + ((result.getString()));
                const response:jsonData = deserialize(jsonData,result.getString())//接受的result是一个字符串
                break;
              }
              case webview.WebMessageType.ARRAY: {
                this.msg1 = "result type:" + typeof (result.getArray());
                this.msg2 = "result getArray:" + result.getArray();
                const responseArray:jsonData[] = deserializeArray(jsonData,result.getArray().toString())//接受的result是一个数组
                break;
              }
              default: {
                this.msg1 = "default break, type:" + type;
                break;
              }
            }
          } catch (error) {
            console.error(`ErrorCode: ${error.code}, Message: ${error.message}`);
          }
        });
      })
      .height('100%')
    }
  }
}

更多关于HarmonyOS 鸿蒙Next Web组件的onMessageEventExt如何接收到的result为一个数组且数组中的数据为对象的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙系统中,Next Web组件的onMessageEventExt方法用于接收来自其他组件或系统的消息事件。若要使该方法接收到的result为一个数组且数组中的数据为对象,你需要确保发送消息时传递的数据格式正确。

在发送消息时,应将数据构造成一个包含对象的数组格式。例如,在JavaScript中,你可以这样构造数据:

let data = [
    {key1: 'value1', key2: 'value2'},
    {key3: 'value3', key4: 'value4'}
];
// 假设sendMessage是发送消息的方法
sendMessage('eventName', data);

在接收端,即onMessageEventExt方法中,你可以通过参数获取到这个数组,并遍历或处理数组中的对象。示例代码如下:

onMessageEventExt(event) {
    let result = event.data; // 获取传递的数据
    if (Array.isArray(result)) {
        result.forEach(item => {
            // item即为数组中的对象,可按需处理
            console.log(item);
        });
    } else {
        console.error('Received data is not an array');
    }
}

确保发送和接收的数据格式一致,且onMessageEventExt方法能够正确解析和处理传递的数据。

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部