微信小程序Webview与H5通信

devtools/2024/11/30 13:04:27/

背景

        近期有个小程序>微信小程序需要用到web-view嵌套H5的场景,该应用场景需要小程序中频繁传递数据到H5进行渲染,且需要保证页面不刷新。

        由于小程序>微信小程序与H5之间的通信限制比较大,显然无法满足于我的业务场景

探索

        由于小程序>微信小程序与webview的环境是完全隔离的,且没有突破的地方,只能将关键点放在已开放的方式上来;中间有利用公共存储空间cookie、SessionStorageLocalStorage,但是很遗憾,无法突破,后面也采用websocket利用服务器来进行双向交互,但是由于网络的不稳定性,导致数据可能会有一定的延迟。

思路

        既然小程序只能通过改变url链接来向H5传递参数,那么我就动态改变url来传递即可,但是还需要解决的问题是,一旦改变url页面会重新加载,这个是不能接受的。

        路由的hash模式正好可以做到这一点,那么我们通过动态改变urlhash值,H5页面监听hash值的变化就能完美解决该问题了,话不多说,直接开干。

实战

小程序

web-view代码

<web-view src="{{url}}{{hashStr}}"></web-view>

 小程序js代码,代码通过setInterval模拟实时传递不同参数到H5

javascript">Component({data: {url: `http://127.0.0.1:8080/home?type=wx`,hashStr: '',},methods: {onLoad: function () {const _this = this;           setInterval(() => {//此处模拟动态改变url的hash值给h5传值const postData={name: 'zhangsan',time: +new Date()}_this.setData({hashStr:`#time=${JSON.stringify(postData)}`})}, 2000);},}
});

注意:hashStr的值必须以#开始,浏览器才会识别为hash,否则无效

H5应用

在js中添加一个hashchange监听window.location.hash的变化即可

javascript">
window.onhashchange = function() {console.log('The hash has changed!');const newHash = window.location.hash;console.log('New hash:', newHash);
};

以上方式即可完美解决我的应用场景


以为结束了,其实还没有,上面的方式的确可行,但是我是vue项目呀,其中还用到了vue-router组件,通过上述直接监听页面还是会刷新

 由于使用了vue-router插件,那么hash的变化,vue-router会默认通过hash来进行导航,也会加载刷新页面,所以我们还需要设置一个路由守卫,用来判断如果path没有变化,只是hash改变,则不进行导航具体配置如下:

javascript">import {createRouter, createWebHashHistory} from "vue-router";const routes= [ {path: '/home',name: 'home',component: () => import('../components/Home.vue')},
]
const router = createRouter({history: createWebHashHistory(),routes
});router.beforeEach((to, from, next) => {if (to.path===from.path) {     next(false); // 阻止导航行为} else {next(); // 正常导航}
});export default router;

注意点:

1、小程序>微信小程序会对url进行decodeURIComponent编码,故在解析的的时候,注意使用encodeURIComponent解码

2、如果动态改变url的hash频率过快,由于vue-router在内部调用了history.replaceState(),如果太频繁会触发浏览器的安全策略抛出一个SecurityError错误,这个可能是我的vue-router版本浏览器兼容性问题导致的,对此没有深究,有哪位大佬知道的麻烦为小弟解惑。

SecurityError: Failed to execute replaceState onHistory: Attempt to use history.replaceState() more than100 times per 30 secondsin


http://www.ppmy.cn/devtools/138201.html

相关文章

田忌赛马五局三胜问题matlab代码

问题描述&#xff1a;在可以随机选择出场顺序的情况下&#xff0c;如果把比赛规则从三局两胜制改为五局三胜制&#xff0c;齐王胜出的概率是上升了还是下降了&#xff1f;五局三胜的赛制下&#xff0c;大家的马重新分为5个等级。前提条件仍然是齐王每种等级的马都优于田忌同等级…

docker入门学习笔记

docker的定义 docker是一个用于构建、运行、传送 应用程序的平台。 为什么要使用docker &#xff1f; 在开发测试库环境中测试成功后&#xff0c;打包成集装箱&#xff0c;到生产环境也是能够成功的。而传统的安装方式不仅繁琐&#xff0c;并且在测试环境安装后&#xff0c;到…

添加事务,封装响应数据

&#xff08;4&#xff09;在业务中添加事务管理 创建平台事务管理器》实际是jdbc的事务 public class JdbcConfig {Beanpublic PlatformTransactionManager transactionManager(DataSource ds){DataSourceTransactionManager transactionManager new DataSourceTransacti…

Elasticsearch 分片分配策略讲解与实战

ES 分片分配策略讲解与实战 Elasticsearch分片分配策略讲解与实战:深入探索与实践指南1. 引言1.1 博客目的与读者定位1.2 Elasticsearch分片分配的重要性2. Elasticsearch分片分配基础2.1 分片与副本的概念2.2 分片分配的目标3. 分片分配策略详解3.1 分片分配的基本原则3.2 影…

课程学习 (Curriculum Learning) 介绍及其在 DeepSpeed 框架中的应用:中英双语

中文版 课程学习 (Curriculum Learning) 介绍及其在 DeepSpeed 框架中的应用 1. 课程学习的概念 课程学习&#xff08;Curriculum Learning&#xff09;是机器学习中的一种训练策略&#xff0c;灵感来源于人类学习的过程——从简单到复杂逐步掌握知识。具体来说&#xff0c;…

大厂也在用的分布式链路追踪:TraceIdFilter + MDC + Skywalking

痛点 查线上日志时&#xff0c;同一个 Pod 内多线程日志交错&#xff0c;很难追踪每个请求对应的日志信息。 日志收集工具将多个 Pod 的日志收集到同一个数据库中后&#xff0c;情况就更加混乱不堪了。 解决 TraceId MDC 前端每次请求时&#xff0c;添加 X-App-Trace-Id 请…

Python PDF转JPG图片小工具

Python PDF转JPG图片小工具 1.简介 将单个pdf装换成jpg格式图片 Tip: 1、软件窗口默认最前端&#xff0c;不支持调整窗口大小&#xff1b; 2、可通过按钮选择PDF文件&#xff0c;也可以直接拖拽文件到窗口&#xff1b; 3、转换质量有5个档位&#xff0c;&#xff08;0.25&a…

C++类的自动转换和强制类型转换

目录 一、类型转换 二、转换函数 一、类型转换 C⽀持内置类型隐式类型转换为类类型对象&#xff0c;需要有相关内置类型为参数的构造函数 简单说就是可以将内置类型转化为自定义类型 示例&#xff1a; class Test { public:Test(int n1 0):num1(n1){}void pr…