uniapp 小程序 web-view 打开H5页面传参以及调用postMessage回传参数

article/2025/8/12 10:41:11

uniapp 小程序 web-view 打开H5页面传参以及调用postMessage回传参数

  • uniapp 运行微信小程序,在小程序内利用 web-view 打开H5页面进行数据流转的总结。

  • 首先做点准备工作,官网明确的说了小程序是不支持本地的,那怎么进行调试呢,这里也简单,我们使用 node.js 起一个本地服务器,然后在 uniapp 中使用。

    • 这里直接把 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 就是我们要访问的路径,运行,出现这个信息就是运行成功了。

uniap 小程序 web-view

  • 这里我们要创建两个文件,index和auto

  • 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[2]);}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>
  • 最终效果

  • 最后说一下为什么创建两个文件,为什么在auto中通过监听和提交数据的形式拿到H5页面传过来的参数,首先,笔者最开始也是在一个文件中使用web-view组件,但是发现无论怎么做 H5页面 uni.navigateBack({ delta: 1 }) 这行代码就是不生效,,,不生效就无法触发@message,就拿不到H5页面的参数,浪费了好长时间,最后才发现不是不生效,而是在一个页面中没有能 navigateBack 返回的页面,,,,就无法触发@message。

  • 最后分两个文件,这样就能 navigateBack 然后触发 @message 了,也正是因为这样,我们的 auto 中嵌套的H5页面在执行 uni.navigateBack({ delta: 1 }) 这段代码之后,会回到index页面。所以使用监听和提交数据的方式拿到H5页面的数据,这样就能在index文件中展示了。好了,到这里就结束了,记录我的踩坑之旅。


http://www.hkcw.cn/article/ywNgmkDCyo.shtml

相关文章

mac 下载nvm

先在终端查看是否安装brew brew -v显示版本&#xff0c;开始下一步&#xff0c;如果不显示版本&#xff0c;则需要先安装brew 安装brew 使用brew安装nvm 执行安装命令 brew install nvm配置环境变量 配置环境变量之前&#xff0c;先查看nvm下载的位置 brew list nvm这是…

Android的uid~package~pid的关系

UID &#xff1a; Linux 系统级用户标识&#xff0c;Android 中每个应用安装时分配唯一 UID&#xff08;如 1000&#xff09;。 Package&#xff1a; Android 应用包名(例如android)&#xff0c;一个 UID 可关联多个 Package&#xff08;共享 UID 场景如android:sharedUserI…

Rust 学习笔记:发布一个 crate 到 crates.io

Rust 学习笔记&#xff1a;发布一个 crate 到 crates.io Rust 学习笔记&#xff1a;发布一个 crate 到 crates.io提供有用的文档注释常用标题文档注释作为测试注释所包含的项目 使用 pub use 导出一个方便的公共 API设置 crates.io 账户添加 metadata 到一个新的 crate发布到 c…

大白话 Seata 分布式事务浅析,详解TCC模式

大家好&#xff0c;我是此林。 说到分布式事务&#xff0c;第一时间想到 Seata&#xff0c;它支持多种事务模型&#xff0c;比如&#xff1a;XA模式、AT模式、TCC模式、Saga模式(长事务)。 其中 TCC 模式是高性能分布式事务解决方案&#xff0c;适用于核心系统等对 性能有很高…

超标量处理器设计6-指令解码

1. 指令缓存 指令缓存本质上是一个FIFO, 它能够将指令按照程序中指定的顺序存储起来&#xff0c;这样指令在解码的时候&#xff0c;仍然可以按照程序中指定的顺序进行解码。指令缓存是超标量处理器中必须的部件&#xff0c;其原因有两个&#xff1a; 1. 每周期可以取指的个数大…

技嘉华硕微星主板BIOS开启TPM模块教程

目录 一. TPM模块安装 二. 在BIOS开启TPM功能 华硕主板&#xff08;Intel平台&#xff09; 华硕主板&#xff08;AMD平台&#xff09; 技嘉主板&#xff08;Intel平台&#xff09; 技嘉主板&#xff08;AMD平台&#xff09; 微星主板&#xff08;Intel平台&#xff09; …

java基础知识

ASCII码 1. next() 示例​​ 读取一个字符串&#xff08;遇到空格或换行符停止&#xff09; 运行示例&#xff1a;​​ 输入: 张三 李四 输出: 张三 // 只读取了"张三"&#xff0c;"李四"留在输入缓冲区

【解决】【亲测下载obsidian可行】打不开github.com 或者 加速访问 github

Windows系统 基本思路&#xff1a;通过修改IP绑定来实现加速访问 1、hosts文件目录 C:\Windows\System32\drivers\etc\hosts2、修改内容 2.1 ping github.com 在Windows的cmd页面下直接输入&#xff1a; ping github.comPS&#xff1a;这一步只是看一下&#xff0c;没在后…

逆向入门(1)

前言&#xff1a; 本篇文章面向想入门逆向的新手小白。 NSSCTF和BUUCTF是两个刷题网站&#xff0c;知识点下面会有对应的题&#xff0c;大家可以自己试着做一下 NSSCTF:https://www.nssctf.cn/problem BUUCTF:https://buuoj.cn/challenges 1.看exe模式&#xff08;位数&am…

经典算法回顾之最小生成树

最小生成树&#xff08;Minimum Spanning Tree&#xff0c;简称MST&#xff09;是图论中的一个重要概念&#xff0c;主要用于解决加权无向图中连接所有顶点且总权重最小的树结构问题。本文对两种经典的算法即Prim算法和Kruskal算法进行回顾&#xff0c;并对后者的正确性给出简单…

Java八股文智能体——Agent提示词(Prompt)

这个智能体能够为正在学习Java八股文的同学提供切实帮助&#xff1a;不仅可以帮你优化答案表述&#xff0c;还能直接解答八股文相关问题——它会以面试者的视角&#xff0c;给出贴合求职场景的专业回答。 将以下内容发送给任何一个LLM&#xff0c;他会按照你提示词的内容&…

VScode编译调试debug,gpu的cuda程序,Nsight

进行下面操作的前提是&#xff0c;我们的环境已经能跑简单的CUDA程序了。 一、安装Nsight 二、创建launch.json文件 {"version": "0.2.0","configurations": [{"name": "CUDA C: Launch","type": "cuda-gdb…

飞牛fnNAS存储空间模式详解

目录 一、NAS的存储空间 二、多硬盘对NAS速度的提升原理 三、多硬盘对数据安全的提升原理 四、多硬盘对容量的提升原理 五、磁盘阵列模式 六、飞牛NAS支持的存储模式 七、具体如何选择存储空间模式 在数字化时代,数据是个人和企业发展的核心资产,但面临硬盘损坏、病毒…

vue3: baidusubway using typescript

项目结构&#xff1a; <!--npm install -D tailwindcss-3d BaiduSubwayMap.vue npm install -D tailwindcss postcss autoprefixer--> <template><div class"relative w-full h-screen"><!-- 地图容器 --><div id"subway-container…

【递归、搜索与回溯】专题二、二叉树中的深搜

文章目录 1.计算布尔二叉树的值1.1 题目1.2 思路1.3 代码 2.求根节点到叶节点数字之和2.1 题目2.2 思路2.3 代码 3.二叉树剪枝3.1 题目3.2 思路3.3 代码 4.验证二叉搜索树4.1 题目4.2 思路4.3 代码 5.二叉搜索树中第K小的元素5.1 题目5.2 思路5.3 代码 6.二叉树的所有路径6.1 题…

Windows商店中的免费扫雷游戏应用

《扫雷》是一款经典的单人益智小游戏&#xff0c;1992年微软发布的Windows 3.1中加入该游戏&#xff0c;从此风靡全世界。游戏目标是通过逻辑推理&#xff0c;在最短的时间内根据点击格子出现的数字找出所有非雷格子&#xff0c;同时避免踩雷。 此Windows应用实现了经典扫雷的…

无法运用pytorch环境、改环境路径、隔离环境

一.未建虚拟环境时 1.创建新项目后&#xff0c;直接运行是这样的。 2.设置中Virtualenv找不到pytorch环境&#xff1f;因为此时没有创建新虚拟环境。 3.选择conda环境&#xff08;全局环境&#xff09;时&#xff0c;是可以下载环境的。 运行结果如下&#xff1a; 是全局环境…

古老的传说(Player、Stage)是否还能在蓝桥云课ROS中重现-250601(失败)

古老的传说是否还能在蓝桥云课ROS中重现-250601 经典复现何其难&#xff0c;百分之二就凉凉&#xff01; 古老的传说 那是很久很久以前的故事……上个世纪的一个机器人项目 Player、Stage这个项目最早起源于1999年&#xff0c;由美国南加州大学机器人研究实验室开发&#xff0…

机器学习:逻辑回归与混淆矩阵

本文目录&#xff1a; 一、逻辑回归Logistic Regression二、混淆矩阵&#xff08;一&#xff09;精确率precision&#xff08;二&#xff09;召回率recall&#xff08;三&#xff09;F1-score&#xff1a;了解评估方向的综合预测能力&#xff08;四&#xff09;Roc曲线&#xf…

Spring是如何实现属性占位符解析

Spring属性占位符解析 核心实现思路1️⃣ 定义占位符处理器类2️⃣ 处理 BeanDefinition 中的属性3️⃣ 替换具体的占位符4️⃣ 加载配置文件5️⃣ Getter / Setter 方法 源码见&#xff1a;mini-spring 在使用 Spring 框架开发过程中&#xff0c;为了实现配置的灵活性&#xf…