uniapp 小步伐 web-view 打开H5页面传参以及调用postMessage回传参数
uniapp 小步伐 web-view 打开H5页面传参以及调用postMessage回传参数[*] uniapp 运行微信小步伐,在小步伐内利用 web-view 打开H5页面举行数据流转的总结。
[*] 起首做点准备工作,官网明确的说了小步伐是不支持本地的,那怎么举行调试呢,这里也简朴,我们利用 node.js 起一个本地服务器,然后在 uniapp 中利用。https://i-blog.csdnimg.cn/direct/06f0a1915be349f8a0c72276f6e35817.png
[*] 这里直接把 js 代码贴出来,直接复制就可以了
const http = require('http');
const fs = require('fs');
const path = require('path');
function startServer() {
const server = http.createServer((req, res) => {
// 设置通用响应头
res.setHeader('Content-Type', 'text/html; charset=utf-8');
let stream;
switch (req.url) {
case '/h5.html':
// 首页内容
filePath = 'h5.html';
break;
}
if (filePath) {
// 获取文件流
stream = fs.createReadStream(path.join(__dirname, filePath), 'utf8');
// 监听错误事件
stream.on('error', (err) => {
console.error('Stream error:', err);
// 重写响应头
res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' });
res.end('500 Internal Server Error');
});
stream.pipe(res);
} else {
// 如果没有设置文件路径,发送404响应
res.writeHead(404, { 'Content-Type': 'text/html; charset=utf-8' });
res.end('404 Not Found');
}
});
server.listen(3000, '127.0.0.1', () => {
console.log('Server is listening on port 3000');
});
}
module.exports = { startServer };
startServer()
[*]node本地服务
[*] 然后这个地方要留意一下,这里的 html 文件就是一会要在内嵌在小步伐中的文件,而且要留意,这个文件要跟 node.js 在同一级文件夹内,然后谁人 case 就是我们要访问的路径,https://i-blog.csdnimg.cn/direct/200000060ff043d4987cc664e114457a.png运行,出现这个信息就是运行乐成了。https://i-blog.csdnimg.cn/direct/f79f391b42524c6483197df9aa532c6b.png
uniap 小步伐 web-view
[*] 这里我们要创建两个文件,index和autohttps://i-blog.csdnimg.cn/direct/c709f1ad48174d51b142fa7dddd0f274.png
[*] index 文件中代码如下,这里我们写一个按钮然后跳到 auto 然后在auto文件中内嵌H5页面,同时监听 login 事件,拿到 auto 的页面提交的参数。等下会表明为什么这么做。
<template>
<view class="content">
<view class="text-area">
<text class="title">{{ title }}</text>
</view>
<view>
<button @click="clickUrl">点击跳转H5</button>
</view>
<view>
h5页面传过来的参数:{{ paramsH5.userName }} {{ paramsH5.message }}</view
>
</view>
</template>
<script>
export default {
data() {
return {
title: "微信小程序页面1",
paramsH5: { userName: "", message: "" },
};
},
onLoad() {
uni.$on("login", (usnerinfo) => {
this.paramsH5 = usnerinfo;
});
},
onUnload() {
// 移除监听事件
uni.$off("login");
},
methods: {
clickUrl(params) {
uni.navigateTo({
url: "/pages/auto/index",
});
},
},
};
</script>
<style>
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
}
.text-area {
display: flex;
justify-content: center;
margin: 24rpx;
font-size: 48rpx;
font-weight: bold;
color: black;
}
.title {
font-size: 36rpx;
color: #8f8f94;
}
</style>
[*] auto 文件中代码如下,这里的 http://127.0.0.1:3000/h5.html?name=iadajelkljwieqjeojqoi1j231j 就是我们访问H5页面的链接,问号背面就是向H5页面通报的参数。目前网上小步伐对H5页面传参数的方法基本都是通过 url 的方法,其他方法必要各位自行查阅了,这里的 @message="handleMessage" 就是拿到H5页面传返来的数据,拿到之后我们通过 uni.$emit 提交到 index 页面展示。
<template>
<view class="content">
<web-view
@load="loadSuccess"
@error="loadError"
src="http://127.0.0.1:3000/h5.html?name=iadajelkljwieqjeojqoi1j231j"
@message="handleMessage"
></web-view>
</view>
</template>
<script>
export default {
data() {
return {
title: "微信小程序页面2",
};
},
onLoad() {},
methods: {
handleMessage(data) {
console.log("接收到的消息:", data.detail.data);
uni.$emit("login", {
userName: "unier",
message: data.detail.data,
});
},
loadSuccess() {
console.log("加载成功");
},
loadError() {
console.log("加载失败");
},
},
};
</script>
<style>
</style>
[*] H5页面代码如下,这里要留意,调用完 uni.postMessage({ action: 'someAction', data: 'someData' }) 回传数据后,要调用 uni.navigateBack({ delta: 1 }); 因为官网是这样表明的 ( 会在特定时机(后退、组件销毁、分享)触发并收到消息。 ),所以要调用后退,不然 @message="handleMessage" 无法接收消息,另有 JS-SDK 的引入,这个引入的方法官网都有,我这边是只有微信,所以就只引了微信的,留意引入的次序,uni sdk 放到body下面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>H5页面</title>
<style>
.title {
font-size: 24px;
font-weight: bold;
text-align: center;
}
.wxParams {
font-size: 24px;
font-weight: bold;
text-align: center;
margin: 12px;
}
#paramsText {
text-align: center;
}
</style>
</head>
<body>
<div id="app">
<h1 class="title">这是一个H5页面</h1>
<div class="title"><button id="backBtn">传参返回微信小程序</button></div>
<div class="wxParams">小程序页面传过来的参数:</div>
<div id="paramsText"></div>
</div>
<!-- 微信 JS-SDK 如果不需要兼容小程序,则无需引用此 JS 文件。 -->
<script type="text/javascript">
document.write('<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js"><\/script>');
</script>
</body>
<script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></script>
<script type="text/javascript">
// 获取小程序中传过来的参数并展示
document.querySelector('#paramsText').innerHTML = getQuery('name')
function getQuery(name) {
// 正则:[找寻'&' + 'url参数名字' = '值' + '&']('&'可以不存在)
let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
let r = window.location.search.substr(1).match(reg);
if (r != null) {
// 对参数值进行解码
return decodeURIComponent(r);
}
return null;
}
// 待触发 `UniAppJSBridgeReady` 事件后,即可调用 uni 的 API。
document.addEventListener('UniAppJSBridgeReady', function () {
console.log('UniAppJSBridgeReady加载完成');
uni.getEnv(function (res) {
console.log('当前环境:' + JSON.stringify(res));
});
document.querySelector('#backBtn').addEventListener('click', function (evt) {
uni.postMessage({ action: 'someAction', data: 'someData' })
uni.navigateBack({ delta: 1 });
});
});
</script>
</html>
[*] 最闭幕果https://i-blog.csdnimg.cn/direct/19fef1934a684a2e94e351e5cf526c41.png
https://i-blog.csdnimg.cn/direct/e8c3c91cc3cb481087fb566c1a014b26.png
https://i-blog.csdnimg.cn/direct/23377cd262a04d118fd5120a0e47ebf1.png
[*] 末了说一下为什么创建两个文件,为什么在auto中通过监听和提交数据的情势拿到H5页面传过来的参数,起首,笔者最开始也是在一个文件中利用web-view组件,但是发现无论怎么做 H5页面 uni.navigateBack({ delta: 1 }) 这行代码就是不生效,,,不生效就无法触发@message,就拿不到H5页面的参数,浪费了好长时间,末了才发现不是不生效,而是在一个页面中没有能 navigateBack 返回的页面,,,,就无法触发@message。
[*] 末了分两个文件,这样就能 navigateBack 然后触发 @message 了,也正是因为这样,我们的 auto 中嵌套的H5页面在执行 uni.navigateBack({ delta: 1 }) 这段代码之后,会回到index页面。所以利用监听和提交数据的方式拿到H5页面的数据,这样就能在index文件中展示了。好了,到这里就竣事了,记录我的踩坑之旅。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]