uni-app中nvue页面如何监听5+创建的webview内h5发出的uni.postMessage
问题描述
vue页面可以通过globalEvent.addEventListener
监听到:
plus.globalEvent.addEventListener('plusMessage', function(msg){
if(msg.data.args.data.name == 'postMessage'){
console.log('子页面返回的数据为:'+JSON.stringify(msg.data.args.data.arg));
}
});
但在nvue页面无论是上面的方法还是通过$on
,都无法监听到postMessage
。请问在nvue页面如何监听postMessage
,最好能提供一个示例。
最小复现demo见下方安装包:demo.zip
参考文档: vue-向-nvue-通讯
版本信息
项目创建方式 | 基座版本 |
---|---|
未提及 | 3.4.15 |
webview和uni-app的双向通信可以使用以下方式:
webview/h5 发送消息:
plus.webview.postMessageToUniNView({
type: ‘toUniAPP’,
args: {
arg1: ‘123’
}
}, ‘__uniapp__service’);
uni-app 接受消息:
plus.globalEvent.addEventListener(‘plusMessage’, (message)=>{
// message打印的结果:
// {
// “data”: {
// “type”: “toUniAPP”,
// “args”: {
// “arg1”: “123”
// }
// },
// “targetId”: “__uniapp__service”,
// “originId”: “NWindow101677899611098”
// }
})
这个方法也是在vue页面可以,在nvue页面就不行了
回复 feat: 大佬,解决了吗
回复 1***@qq.com: 换vue页面了,而且addEventListener这个方式监听如果不移除监听,后续再进入页面会重复触发,但监听的plusMessage是系统内部事件,不确定移除后会有什么影响,所以目前在用 [ webview组件+5+api操控webview的大小与位置 ] 的方案
nvue页面还是监听不到这个,请问现在有办法了吗?
在uni-app中,如果你需要在nvue页面监听通过5+ API创建的webview内H5页面发出的uni.postMessage
消息,你可以结合5+的plus.webview
对象与addEventListener
方法来实现。以下是一个示例代码,展示了如何在nvue页面中实现这一功能。
nvue页面代码示例
首先,确保你的nvue页面已经创建了一个webview,并且加载了H5页面。
<template>
<div>
<web-view id="my-webview" src="http://your-h5-page-url.com"></web-view>
</div>
</template>
<script>
export default {
onLoad() {
// 获取webview对象
const webview = plus.webview.getWebviewById('my-webview');
// 监听message事件
webview.addEventListener('message', (event) => {
// event.message即为H5页面通过uni.postMessage发送的数据
console.log('Received message from H5:', event.message);
// 你可以在这里处理接收到的消息
this.handleMessage(event.message);
});
},
methods: {
handleMessage(message) {
// 处理接收到的消息,例如解析JSON数据
try {
const data = JSON.parse(message);
// 根据data执行相应操作
console.log('Parsed message:', data);
} catch (error) {
console.error('Error parsing message:', error);
}
}
}
}
</script>
<style>
/* 样式根据需要调整 */
</style>
H5页面代码示例
在你的H5页面中,你可以使用uni.postMessage
来发送消息到nvue页面中的webview。
// 发送消息到nvue页面
uni.postMessage({
data: JSON.stringify({
type: 'example',
content: 'Hello from H5!'
})
});
注意事项
- 确保5+环境:上述代码依赖于5+ API,因此请确保你的应用是在5+环境中运行,如HBuilderX打包的App。
- 消息格式:在发送和接收消息时,注意数据格式的一致性。本例中,H5页面发送的是JSON字符串,nvue页面接收后需要解析。
- 错误处理:在实际应用中,应添加更多的错误处理逻辑,以确保应用的健壮性。
通过上述代码,你可以在uni-app的nvue页面中监听通过5+创建的webview内H5页面发出的uni.postMessage
消息,并根据消息内容执行相应的操作。