记一次微信小程序与webviewH5通信的踩坑记录

 更新时间:2024年07月24日 10:40:51   作者:踩坑工程师  
uniapp开发小程序的过程中主、分包有大小限制,随着业务的增加,使用web-view加载H5的方式,往往纯加载并不能满足业务需求,这个时候就得了解小程序与H5的交互,这篇文章主要给大家介绍了关于微信小程序与webviewH5通信的踩坑记录,需要的朋友可以参考下

背景

近期公司需要将H5网页嵌入到微信小程序内,这个仅需要引入webview即可:

<web-view :src="webViewUrl"></web-view>

但对于部分同学可能需要进一步的开发,例如二者之间数据传输,接下来为大家奉上自己的踩坑记录。

 实践

1、H5传递与微信小程序

首先在H5环境,我们想要与微信小程序通信,必须引入相关SDK,例如,我的微信小程序是由uniapp框架开发的,所以通信之前,我们需要将uniapp的SDK引入到我们的H5项目当中。下载地址

引用下载文件

import uni from "@/public/uni.webview.1.5.4.js";
//如果提示uni.postMessage 不是function,就在 uni.webview.1.5.4.js 里面将 uni 替换掉,如替换成 webUni(建议 查找 全选 替换)
import webUni from "@/public/uni.webview.1.5.4.js";

随后我们便可以先检查当前环境

 webUni.getEnv(function(res) {
    console.log('当前环境:' + JSON.stringify(res));
});

向小程序传递参数(window.postMessage)

根据官方文档说明,我们采用window.postMessage()

const obj= {params: "传递参数"}

window.postMessage({
    data: obj
});

这时需要我们在webview标签加上@message属性,监听接收参数

<template>
	<view class="">
		<web-view :src="webViewUrl" @message="handleMessage"></web-view>
	</view>
</template>
<script>
	export default {
		data() {
		  return {
		    webViewUrl: 'http://localhost:80',
		  }
		},
		methods: {
		  handleMessage(event){
		  	console.log(event.detail.data);
            //打印结果
            //data:{params: "参数示例"}
		  },
		  
		},
	}
</script>

这里要注意官方说明!!!

所以,在H5传递参数的方法中,要一并触发相关api

const obj= {params: "传递参数"}

window.postMessage({
    data: obj
});

//后退
webUni.navigateBack({
    delta: 1
});

//组件销毁(也就是关闭页面)
uni.redirectTo({
	url: 'test?id=1'
});
uni.reLaunch({
	url: 'test?id=1'
});
uni.switchTab({
	url: '/pages/index/index'
});

//分享
uni.share()

//根据自身情况选其一

 但在实际应用中,我们可能不会采用这种方法,因为想要触发@message事件,总是要在特定时机才可以,所以我们也可以选择更为直接的方法:路径传参

//在H5界面编写
//首先声明参数变量
const params = {data: "Are you ok?"}

//假如我们要跳转到小程序的login页面,我们可以这样做
webUni.navigateTo({
  url: `/pages/login/login?message=${params}`,
});

//在小程序编写
//login页面就可以在页面加载时接收路径参数
onLoad(){
	const routes = getCurrentPages()
	const curParam = routes[routes.length - 1]
    const jsonString = decodeURIComponent(curParam.options.message);
	const data = JSON.parse(jsonString);
	console.log(data);
    //打印结果
    //params:{data: "Are you ok?"}
},

 这样小程序便可以接收到H5传递的参数了。

2、微信小程序与H5通信

微信小程序传递参数给H5就相对简单了,例如我们的H5链接是localhost,我们就可以:

<template>
	<view class="">
		<web-view :src="webViewUrl" @message="handleMessage"></web-view>
	</view>
</template>
<script>
	export default {
		data() {
		  return {
		    webViewUrl: 'http://localhot:3000',
		  }
		},
		onShow(options) {
            //声明要传递给H5的参数
            let params = {
                data: "这是要给H5的参数"
            }
			this.webViewUrl = `http://localhot:3000?${JSON.stringify(params)}`
		},
		methods: {
		  handleMessage(event){
		  	console.log(event.detail.data);
		  }
		},
	}
</script>

下面我们便可以在H5环境监听url的路径参数

// 获取地址栏的查询字符串(不包括URL的域名和路径)
const queryString = new URLSearchParams(window.location.search).toString();

// 如果查询字符串不为空,则尝试解析它
if (queryString) {
      //首先,使用decodeURIComponent来解码这个字符串
      const decodedString: string = decodeURIComponent(queryString);

      // 注意,这里末尾有一个'='号,需要移除它
      const jsonString = decodedString.slice(0, -1);

      // 现在,使用JSON.parse来解析JSON字符串
      const jsonObject = JSON.parse(jsonString);
      console.log("已接收到小程序的参数",jsonObject);
}

至此,小程序与H5便实现了,相互通信。

总结

微信小程序与H5通信是在日常开发中总会遇到的场景,我第一次接触的时候,由于没有经验,走了不少弯路,所以在这里分享一下自己的经验,希望能帮助到正在学习的同学

到此这篇关于微信小程序与webviewH5通信踩坑的文章就介绍到这了,更多相关微信小程序与webviewH5通信内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue3常用的指令之v-bind和v-on指令用法

    vue3常用的指令之v-bind和v-on指令用法

    vue的v-on与v-bind,v-on就是用于绑定事件的,下面这篇文章主要给大家介绍了关于vue3常用的指令之v-bind和v-on指令用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • vue的路由映射问题及解决方案

    vue的路由映射问题及解决方案

    这篇文章主要介绍了vue的路由映射问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 解决vue的过渡动画无法正常实现问题

    解决vue的过渡动画无法正常实现问题

    今天小编就为大家分享一篇解决vue的过渡动画无法正常实现问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • vue同步父子组件和异步父子组件的生命周期顺序问题

    vue同步父子组件和异步父子组件的生命周期顺序问题

    这篇文章主要介绍了vue同步父子组件和异步父子组件的生命周期顺序问题,需要的朋友可以参考下
    2018-10-10
  • Vue中使用Element UI的Table组件实现嵌套表格功能

    Vue中使用Element UI的Table组件实现嵌套表格功能

    这篇文章主要介绍了Vue中使用Element UI的Table组件实现嵌套表格功能,演示如何在Vue中使用Element UI的Table组件实现嵌套表格,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • 详解vue+axios给开发环境和生产环境配置不同的接口地址

    详解vue+axios给开发环境和生产环境配置不同的接口地址

    这篇文章主要介绍了详解vue+axios给开发环境和生产环境配置不同的接口地址,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • vue使用反向代理解决跨域问题方案

    vue使用反向代理解决跨域问题方案

    这篇文章主要为大家介绍了vue使用反向代理解决跨域问题方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Vue3使用Univer Docs创建在线编辑Excel的示例代码

    Vue3使用Univer Docs创建在线编辑Excel的示例代码

    本文介绍了如何在Vue3项目中集成UniverDocs,一个基于Luckysheet的企业文档与数据协同解决方案,指导了从安装到在页面中使用的步骤,以及注意事项,如数据格式转换和二次开发的灵活性,需要的朋友可以参考下
    2025-04-04
  • 深入浅出分析vue2和vue3的区别

    深入浅出分析vue2和vue3的区别

    这篇文章主要介绍了vue2和vue3的区别,较为详细的分析了vue2与vue3的常见区别与使用方法,需要的朋友可以参考下
    2023-06-06
  • vue利用Moment插件格式化时间的实例代码

    vue利用Moment插件格式化时间的实例代码

    Moment.js 是一个 JavaScript 日期处理类库,用于解析、检验、操作、以及显示日期。这篇文章主要给大家介绍了关于vue利用Moment插件格式化时间的相关资料,需要的朋友可以参考下
    2021-05-05

最新评论