微信小程序Webview与H5通信
背景
近期有个微信小程序需要用到web-view嵌套H5的场景,该应用场景需要小程序中频繁传递数据到H5进行渲染,且需要保证页面不刷新。
由于微信小程序与H5之间的通信限制比较大,显然无法满足于我的业务场景

探索
由于微信小程序与webview的环境是完全隔离的,且没有突破的地方,只能将关键点放在已开放的方式上来;中间有利用公共存储空间cookie、SessionStorage和LocalStorage,但是很遗憾,无法突破,后面也采用websocket利用服务器来进行双向交互,但是由于网络的不稳定性,导致数据可能会有一定的延迟。
思路
既然小程序只能通过改变url链接来向H5传递参数,那么我就动态改变url来传递即可,但是还需要解决的问题是,一旦改变url页面会重新加载,这个是不能接受的。
路由的hash模式正好可以做到这一点,那么我们通过动态改变url的hash值,H5页面监听hash值的变化就能完美解决该问题了,话不多说,直接开干。
实战
小程序
web-view代码
<web-view src="{{url}}{{hashStr}}"></web-view>
小程序js代码,代码通过setInterval模拟实时传递不同参数到H5
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的变化即可
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改变,则不进行导航;具体配置如下:
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
相关文章:
微信小程序Webview与H5通信
背景 近期有个微信小程序需要用到web-view嵌套H5的场景,该应用场景需要小程序中频繁传递数据到H5进行渲染,且需要保证页面不刷新。 由于微信小程序与H5之间的通信限制比较大,显然无法满足于我的业务场景 探索 由于微信小程序与webview的环境是…...
Debezium Engine监听binlog实现缓存更新与业务解耦
飞书文档 解决缓存与数据源数据不一致的方案有很多, 各有优缺点; 1.0、旁路缓存策略, 直接同步更新 读取流程: 查询缓存。如果缓存命中,则直接返回结果。如果缓存未命中,则查询数据库。将数据库查询到的数据写入缓存,并设置一个…...
docker搭建socks5代理
准备工作 VPS安全组/策略放行相应端口如启用了防火墙,放行相应端口 实际操作 我们选用“历史悠久”的Dante socks5 代理服务器,轻量、稳定。Github也有对dante进行进一步精简的镜像,更为适宜。github项目地址如下: https://gi…...
scanf函数和printf函数的格式化输入输出
#include<stdio.h> int main() {int a;double b;char c;scanf("a%d,b%lf:c%c",&a,&b,&c); //float型输入时使用%f占位,double型使用%lf占位;输出时二者相同都是%f即可。if(a>0)printf("a%-10d,b%20.3lf,c%c",a…...
Day31 贪心算法 part05
56. 合并区间 本题也是重叠区间问题,如果昨天三道都吸收的话,本题就容易理解了。 代码随想录 class Solution {public int[][] merge(int[][] intervals) {Arrays.sort(intervals, (a,b) -> Integer.compare(a[0], b[0]));List<int[]> result …...
uniapp连接mqtt频繁断开原因和解决方法
mqtt参考文档:MQTT.js 入门教程 | EMQ、MQTT.js 入门教程 - EMQX - 博客园 uniapp引用MQTT频繁断开的问题可能由于以下几个原因导致: 网络不稳定:频繁断开可能是由于网络不稳定导致的,可以尝试优化网络连接。 心跳机制问题&…...
【数据结构-队列】力扣641. 设计循环双端队列
设计实现双端队列。 实现 MyCircularDeque 类: MyCircularDeque(int k) :构造函数,双端队列最大为 k 。 boolean insertFront():将一个元素添加到双端队列头部。 如果操作成功返回 true ,否则返回 false 。 boolean insertLast() ࿱…...
leetcode3250. 单调数组对的数目 I,仅需1s
题目: https://leetcode.cn/problems/find-the-count-of-monotonic-pairs-i/description/ 不为别的,只是记录下这个超过100%,而且比原先最快的快了一个量级 不知道咋分析,反正得出结论就是,变大不变,变小…...
安全基线检查
一、安全基线检测基础知识 安全基线的定义 安全基线检查的内容 安全基线检查的操作 二、MySQL的安全基线检查 版本加固 弱口令 不存在匿名账户 合理设置权限 合理设置文件权限 日志审核 运行账号 可信ip地址控制 连接数限制 更严格的基线要求 1、禁止远程连接数据库 2、修改…...
C#读取本地图像的方法总结
前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在C#开发C#程序的时候,有时候需要读取本地图像,下面进行详…...
力扣81:搜索旋转排序数组II
已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转 ,使数组变为 [nums[k], nums[k1], ..., nums[n-1], n…...
信息系统项目管理-论文写作方法之背景二
为响应国家政务服务“一网、一门、一次”改革,打破“信息孤岛”现象,打造线上线下相融合、多级联动的政务服务一体化平台。XX市行政审批局欲整合市局及下属13镇区、500多个村居委会政务服务中心业务,梳理人社、民政、卫计委、公积金、交通等多…...
使用ffmpeg命令实现视频文件间隔提取帧图片
将视频按每隔五秒从视频中提取一张图片 使用 ffmpeg 工具,通过设置 -vf(视频过滤器)和 -vsync 选项 命令格式 ffmpeg -i input_video.mp4 -vf "fps1/5" output_%03d.png 解释: -i input_video.mp4:指定输…...
我们项目要升级到flutter架构的几点原因
一、探索 Flutter打造卓越移动应用的新时代框架 在移动应用开发的世界里,Flutter已经成为了一个炙手可热的话题。诞生于Google的怀抱,Flutter以其独特的优势和理念,正在引领一场全球范围内的应用开发 ** 。本文将深入探讨Flutter项目的特点、…...
【简单好抄保姆级教学】javascript调用本地exe程序(谷歌,edge,百度,主流浏览器都可以使用....)
javascript调用本地exe程序 详细操作步骤结果 详细操作步骤 在本地创建一个txt文件依次输入 1.指明所使用注册表编程器版本 Windows Registry Editor Version 5.00这是脚本的第一行,指明了所使用的注册表编辑器版本。这是必需的,以确保脚本能够被正确解…...
ElasticSearch为什么不能在query阶段直接返回_id,从而避免fetch?
整理自Github的一个issue,也正好解答了我的疑惑 https://github.com/elastic/elasticsearch/issues/17159 提问 是否可以避免搜索的fetch阶段并仅返回文档ID?查询阶段结束时是否有_id,这样当我只需要_id时,fetch就多余了?可以通过…...
网安瞭望台第5期 :7zip出现严重漏洞、识别网络钓鱼诈骗的方法分享
国内外要闻 7 - Zip存在高危漏洞,请立刻更新 2024 年 11 月 24 日,do son 报道了 7 - Zip 中存在的一个高严重性漏洞 CVE - 2024 - 11477。7 - Zip 是一款广受欢迎的文件压缩软件,而这个漏洞可能会让攻击者在存在漏洞的系统中执行恶意代码。…...
获 2023 年度浙江省科学技术进步奖一等奖 | 网易数智日报
11 月 22 日,加快建设创新浙江因地制宜发展新质生产力动员部署会暨全省科学技术奖励大会在杭州隆重召开。浙江大学、网易数智等单位联合研发的“大规模结构化数据智能计算平台及产业化”项目获得 2023 年度浙江省科学技术进步奖一等奖。 加快建设创新浙江因地制宜发…...
SQL基础入门 —— SQL概述
目录 1. 什么是SQL及其应用场景 SQL的应用场景 2. SQL数据库与NoSQL数据库的区别 2.1 数据模型 2.2 查询语言 2.3 扩展性 2.4 一致性与事务 2.5 使用场景 2.6 性能与扩展性 总结 3. 常见的SQL数据库管理系统(MySQL, PostgreSQL, SQLite等) 3.…...
【附录】Rust国内镜像设置
目录 前言 (1)设置环境变量 (2)安装Rust (3)设置crates镜像 前言 本节课来介绍下如何在国内高速下载安装Rust和Rust依赖,由于网络原因,我们在安装Rust和下载项目依赖时都很慢&am…...
开源 AI 应用平台实战部署:从零搭建到插件调试避坑指南
1. 开源AI平台部署前的环境准备 在开始部署Dify和AIFlowy之前,环境准备是至关重要的一步。我遇到过不少开发者因为基础环境没配好,导致后续步骤频繁报错的情况。这里分享下Windows和Linux双平台下的实战经验。 对于Dify平台,你需要准备Python…...
AI 大模型落地系列|Eino 组件核心篇:ChatTemplate 为什么不是字符串拼接
声明:本文数据源于官方文档与官方实现,重点参考 ChatTemplate 使用说明。 为什么很多人学 Eino 后,写 Prompt 时还是把 ChatTemplate 用成了字符串拼接?1. ChatTemplate 是什么,不是什么2. 接口虽短,但起的…...
CI/CD 流水线性能优化:从构建到部署
CI/CD 流水线性能优化:从构建到部署 前言 哥们,别整那些花里胡哨的理论。今天直接上硬菜——我在大厂一线优化 CI/CD 流水线性能的真实经验总结。作为一个白天写前端、晚上打鼓的硬核工程师,我对效率的追求就像对鼓点节奏的把控一样严格。 背…...
RBD_Timer:嵌入式轻量级多定时器时间轮调度框架
1. RBD_Timer 库深度解析:面向嵌入式实时系统的轻量级多定时器管理框架1.1 问题根源:Arduino 原生delay()与中断阻塞对实时性的破坏在 Arduino 生态中,delay()函数被广泛用于实现时间等待逻辑。然而其底层实现本质是忙等待(busy-w…...
终极方案:如何在Windows资源管理器中完美显示HEIC缩略图
终极方案:如何在Windows资源管理器中完美显示HEIC缩略图 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails 你是否经常遇到这…...
Uvicorn连接池配置:优化数据库连接性能的完整指南
Uvicorn连接池配置:优化数据库连接性能的完整指南 【免费下载链接】uvicorn An ASGI web server, for Python. 🦄 项目地址: https://gitcode.com/GitHub_Trending/uv/uvicorn Uvicorn作为一款高性能的ASGI web服务器,在Python Web应用…...
OLED屏幕清屏函数全解析:从基础到局部刷新(附代码示例)
OLED屏幕清屏函数全解析:从基础到局部刷新(附代码示例) 第一次接触OLED开发时,最让我困惑的就是屏幕刷新机制。记得当时为了调试一个简单的数字显示功能,反复调用全屏刷新导致屏幕闪烁严重,用户体验极差。后…...
IT 流程越来越完整,但管理反而变得更难了
在很多企业的 IT 管理过程中,一个非常明显的趋势是:流程在不断增加。 从最初的简单问题处理,到后来的事件管理、问题管理、变更管理,再到审批流程、发布流程,各类流程逐渐被建立起来。从管理角度看,这是一种…...
别再羡慕ECharts了!用PyQt+Matplotlib打造你的专属交互式图表工具(附完整代码)
用PyQtMatplotlib打造媲美ECharts的交互式数据可视化工具 在数据分析领域,Web端的ECharts以其丰富的交互功能广受好评,但当我们开发桌面应用或需要高性能处理大数据时,Python技术栈的开发者常常面临两难选择。Matplotlib虽然性能优异…...
Dify插件安装全攻略:从在线市场到离线部署的完整实践
1. Dify插件安装前的准备工作 在开始安装Dify插件之前,我们需要先了解几个关键概念。Dify 1.0.0版本之后,所有工具和模型供应商都改为了插件形式,这意味着我们需要掌握插件的安装方法才能充分发挥Dify的功能。插件主要分为五大类:…...
