混合开发中,uniapp嵌套h5页面的情况下,想进行双方通信,怎么办呢?
uniapp中,整个项目都是写在h5中的,相当于uniapp只是一个壳子,这样开发的话,就可以热更新:
一、h5→uniapp
①h5页面,需要在index.html中引入文件,在使用页面中就可以用postMessage把信息传过去。 index.html
js
<script type="text/javascript" src="./src/utils/uniwebview.js"></script>
<script>
document.addEventListener('UniAppJSBridgeReady', function() {
uni.webView.getEnv(function(res) {
console.log('当前环境:' + JSON.stringify(res));
});
});
</script>
②h5使用页面:
js
const onPrint = async (item) => {
const imageAddress = await projectApi.getPayQR(item.id);
uni.postMessage({
data: {
code: '5',
info: item.producerName,
time: dayjs().format('YYYY-MM-DD HH:mm'),
imageAddress: imageAddress,
}
});
}
③uniapp页面,在backMeaasge中获得h5传递过来的信息 h5→uniapp
js
<template>
<view class="content">
<web-view
src="http://192.168.xx.xxx:3000"
@message="backMessage"
></web-view>
</view>
</template>
<script>
backMessage(event) {
console.log('h5传回来的----', event.detail.data[0].code);
if(event.detail.data[0].code === 5) {
console.log('打印了', event.detail.data[0].info)
}
},
</script>
二、uniapp→h5
①uniapp中,
js
const currentWebview = that.$scope.$getAppWebview();
const html = currentWebview.children()[0];
html.evalJS(`blueresult(${JSON.stringify(list[i])})`);
②h5中,uniapp中的evalJs中的名字和window.后面的名字要一致。
js
window.blueresult = function(device) {
deviceList.value.push(device)
console.log("蓝牙传设备回来了:", deviceList.value);
}