微信小程序Webview与H5通信

news2024/11/30 17:42:07

背景

        近期有个微信小程序需要用到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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2250576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【maven-4】IDEA 配置本地 Maven 及如何使用 Maven 创建 Java 工程

IntelliJ IDEA&#xff08;以下简称 IDEA&#xff09;是一款功能强大的集成开发环境&#xff0c;广泛应用于 Java 开发。下面将详细介绍如何在 IDEA 中配置本地 Maven&#xff0c;并创建一个 Maven Java 工程&#xff0c;快速上手并高效使用 Maven 进行 Java 开发。 1. Maven …

交通流量预测:基于交通流量数据建立模型

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【故障处理系列--移动云云盘根目录在线扩容】

移动云云盘根目录扩容 **目的&#xff1a;**测试harbor仓库服务器的根目录能否在线扩容 1、移动云控制台系统盘扩容 这里以我自己的虚拟机演示 2、查看分区的文件类型 3、安装growpart工具 rootgitlab-cli:~# apt install cloud-guest-utils -y rootgitlab-cli:~# apt ins…

不可分割的整体—系统思考的微妙法则

不可分割的整体——系统思考的微妙法则 作为企业领导者&#xff0c;我们经常需要做出决策&#xff0c;但有时候&#xff0c;我们会忽略一个事实&#xff1a;每个决策都不是孤立的&#xff0c;它背后都是一个复杂系统的一部分。 无论是市场动态、团队协作&#xff0c;还是产品…

内核模块里获取当前进程和父进程的cmdline的方法及注意事项,涉及父子进程管理,和rcu的初步介绍

一、背景 在编写内核态系统监控代码时&#xff0c;有时候为了调试的便捷性&#xff0c;不仅要拿到异常事件有关的线程id&#xff0c;进程id和父进程id&#xff0c;还需要拿到当前进程和父进程的comm和cmdline。主要有几下几个原因&#xff1a; 1&#xff09;单纯的pid或者tgi…

京东OPPO定制版 12.1.0 | 安装包只有4.7M,无短视频,适合轻度使用

底部四个标签&#xff0c;没有短视频&#xff0c;可以正常登录。安装包体积很小&#xff0c;功能基本可用&#xff0c;特别适合追求简洁界面和轻度使用的用户。 大小&#xff1a;4.7M 下载地址&#xff1a; 百度网盘&#xff1a;https://pan.baidu.com/s/1lD0o1y9X3s4hRiz-8F…

AOSP的同步问题

repo sync同步时提示出错: error: .repo/manifests/: contains uncommitted changesRepo command failed due to the following UpdateManifestError errors: contains uncommitted changes解决方法&#xff1a; 1、cd 进入.repo/manifests cd .repo/manifests2、执行如下三…

Redis【1】- 如何阅读Redis 源码

1 Redis 的简介 Redis 实际上是简称&#xff0c;全称为 Remote Dictionary Server (远程字典服务器)&#xff0c;由 Salvatore Sanfilippo 写的高性能 key-value 存储系统&#xff0c;其完全开源免费&#xff0c;遵守 BSD 协议。Redis 与其他 key-value 缓存产品&#xff08;如…

鸿蒙修饰符

文章目录 一、引言1.1 什么是修饰符1.2 修饰符在鸿蒙开发中的重要性1.3 修饰符的作用机制 二、UI装饰类修饰符2.1 Styles修饰符2.1.1 基本概念和使用场景2.1.2 使用示例2.1.3 最佳实践 2.2 Extend修饰符2.2.1 基本概念2.2.2 使用示例2.2.3 Extend vs Styles 对比2.2.4 使用建议…

nginx安装和负载均衡

1. nginx安装 &#xff08;1&#xff09;安装依赖项&#xff1a; yum -y install gcc gcc-c make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel&#xff08;2&#xff09;下载Nginx源代码&#xff1a; http://nginx.org/en/download.html https://nginx.o…

部署 Prometheus

实验环境 IP地址服务192.168.88.10Prometheus服务端, Consul, Grafana, Node-Exporter192.168.88.77MySQL, Node-Exporter192.168.88.30Nginx&#xff0c;Node-Exporter 一、Prometheus Server 端安装和相关配置 【Prometheus1.sh】 &#xff08;1&#xff09;上传 prometh…

通过深度点图表示的隐式场实现肺树结构的高效解剖标注文献速递-生成式模型与transformer在医学影像中的应用

Title 题目 Efficient anatomical labeling of pulmonary tree structures via deeppoint-graph representation-based implicit fields 通过深度点图表示的隐式场实现肺树结构的高效解剖标注 01 文献速递介绍 近年来&#xff0c;肺部疾病&#xff08;Decramer等&#xff…

# 22_ Python基础到实战一飞冲天(二)-python基础(二十二)--名片管理系统案例:cards_tools.py文件

22_ Python基础到实战一飞冲天&#xff08;二&#xff09;-python基础&#xff08;二十二&#xff09;–名片管理系统案例&#xff1a;cards_tools.py文件 一、框架搭建-09-准备名片操作函数修改主文件中函数调用 1、名片管理系统 案例&#xff1a;框架搭建 — cards_tools.p…

Python 和 Pyecharts 对Taptap相关数据可视化分析

结果展示&#xff1a; 数据来源&#xff1a; Python爬取TapTap 热门游戏信息并存储到数据库&#xff08;详细版&#xff09; 目录 结果展示&#xff1a; 数据来源&#xff1a; Python爬取TapTap 热门游戏信息并存储到数据库&#xff08;详细版 一、引言 二、准备工作 三、…

泷羽sec-shell (3)脚本参数传递与数学运算

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

重塑视频新语言,让每一帧都焕发新生——Video-Retalking,开启数字人沉浸式交流新纪元!

模型简介 Video-Retalking 模型是一种基于深度学习的视频再谈话技术&#xff0c;它通过分析视频中的音频和图像信息&#xff0c;实现视频角色口型、表情乃至肢体动作的精准控制与合成。这一技术的实现依赖于强大的技术架构和核心算法&#xff0c;特别是生成对抗网络&#xff0…

Mybatis Plus 增删改查方法(一、增)

先定义一个简单的测试表&#xff0c;执行脚本如下&#xff1a; create table user(id bigint primary key auto_increment,name varchar(255) not null,age int not null default 0 check (age > 0) ); 根据Spingbootmybatisplus的结构根据表自行构建结构&#xff0c;大致…

依赖倒置原则:Java实践篇

在软件开发的世界里&#xff0c;设计原则如同指南针&#xff0c;指引着我们构建更加健壮、可维护和可扩展的系统。其中&#xff0c;依赖倒置原则&#xff08;Dependency Inversion Principle&#xff0c;DIP&#xff09;是面向对象设计&#xff08;OOD&#xff09;中的一个重要…

【MySQL】库和表的基本操作

目录 库 库的增删查改 字符集与校验集 库的备份与恢复 表 表的创建和删除 用不同的存储引擎创建表的区别 查看表 修改表 添加删除属性 修改改变属性 上篇博客我们讲了数据库的基本理解&#xff0c;对数据库有了一个大致的概念&#xff0c;下面我们来介绍一下库和表的…

大数据新视界 -- 大数据大厂之 Hive 函数库:丰富函数助力数据处理(上)(11/ 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…