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