当前位置: 首页 > news >正文

Vue跨标签页数据通信

跨标签页数据通信

在同一浏览器项目地址处于不同的标签页中,建立两个页面间的数据通信,即:B页面新增/修改数据;A页面表格自动更新数据

跨标签页通信常见方案:

BroadCast Channel (广播频道)
Service Worker
LocalStorage Window.onstorage监听
Shared Worker 定时器轮询
IndexedDB 定时器轮询
cookie 定时器轮询
Websocket
Window.open、Window.postmesAge

方案样例

BroadCast Channel(广播频道): 需要保证每个标签页使用同一个频道,比如下方的’sync-update’

创建文件:crossTagMsg.js(表示跨标签页的消息)

const channel = new BroadcastChannel('sync-update');
export function sendMsg(type, content) {
channel.postMessage({
type,
content,
});
}
export function listenMsg(callback) {
const handler = (e) => {
callback && callback(e.data);
} 
channel.addEventListener('message', handler);
return () => {
channel.removeEventListener('message', handler);
};
}

新增/编辑页面add/edit.vue

// emp.value 这是个代理对象,无法被克隆,需要把它变成普通对象
// sendMsg( 'add-emp', { ...emp.value } );// 我这里用的对象替代了数组
sendMsg("update-emp", { ...this.emp })

列表页面

import { listenMsg } from "./utils/crossTagMsg"
var vm = null  //媒介
const unListen = listenMsg((info) => {if (info.type === "add-emp") {vm.emp.value.unshift(info.conten)} else if (info.type === "update-emp") {// 我这里用的对象替代了数组vm.emp = info.content// -------------使用list对象-------------//const i = emps.value.findIndex((emp) => emp.id === info.content.id)//if (i >= 0) {// vue3的写法//emps.value[i] = info.content// vue2写法, 或者用$set// emps.value[i] = emps.value.splice(i, 1, info.content)//}}
})data(){emp: { id: "sync-update", value1: "原值", value2: "内容" },
}created() {let _this = thisvm = _this  //this指向赋值
},
onUnmounted(unListen);

相关文章:

  • 广告变现小游戏对接广告流量变现平台开发 源码搭建
  • Vue在表单校验中trigger属性指定何时触发校验规则
  • 路由框架 ARouter 原理及源码解析
  • Linux-目录和文件
  • Blazor的SSR服务端渲染是不是交互式的
  • 数据结构:3.3.4遍历应用例子
  • 达索系统基于模型的系统工程:开启创新与高效的新时代
  • Golang | Leetcode Golang题解之第145题二叉树的后序遍历
  • vmware workstation下centos7屏幕切换及大小调整
  • 计算机专业毕设-在线商城系统
  • 【源码】2024最新陪诊小程序uniapp+thinkphp
  • 在WordPress中使用AI的实用方法:入门级
  • 【名词解释】Unity中的3D物理系统:刚体
  • 企业级-封装Java对内卷PDF利用关键字分页导出标题
  • shell脚本监控docker容器和supervisor 运行情况
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • fetch 从初识到应用
  • Mocha测试初探
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Terraform入门 - 3. 变更基础设施
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 关于List、List?、ListObject的区别
  • 机器学习 vs. 深度学习
  • 蓝海存储开关机注意事项总结
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 使用parted解决大于2T的磁盘分区
  • 终端用户监控:真实用户监控还是模拟监控?
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (九十四)函数和二维数组
  • (三分钟)速览传统边缘检测算子
  • (十五)使用Nexus创建Maven私服
  • (算法)Travel Information Center
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (原创)可支持最大高度的NestedScrollView
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)shell中括号的特殊用法 linux if多条件判断
  • **PHP分步表单提交思路(分页表单提交)
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET 反射 Reflect
  • .NET建议使用的大小写命名原则
  • :如何用SQL脚本保存存储过程返回的结果集
  • [《百万宝贝》观后]To be or not to be?
  • [ACP云计算]组件介绍
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [BT]BUUCTF刷题第9天(3.27)
  • [BZOJ 2142]礼物(扩展Lucas定理)
  • [c]统计数字
  • [C++]priority_queue的介绍及模拟实现
  • [CSS]中子元素在父元素中居中
  • [Flutter]设置应用包名、名称、版本号、最低支持版本、Icon、启动页以及环境判断、平台判断和打包
  • [HUBUCTF 2022 新生赛]
  • [Latex] \bibitem{} | .bbl 格式参考文献转换与获得