vue 中跨标签通信

前言

最近看到别人的 后台管理系统 做了这样一个功能:

  1. 当在列表页时,点击列表对应的修改按钮,浏览器打开一个新的 tab 页
  2. 在新的 tab 页上是一个详情页,当修改里面的详情数据后,点击提交
  3. 列表页当发现详情页面提交后,会重新请求数据

感觉这个功能很有趣,找了几个比较好的方案,做一个记录

storage

storage 可以跨页面触发事件,下面是 MDN 关于 storageEvent 的介绍

所以我们可以根据 storage 的这个特性来做

我们使用一个按钮模拟 列表页面的修改按钮

点击这个按钮,跳转到 详情页面

使用 window.open 可以打开一个新的 tab,使用 vue-router 只能在页面内跳转

js 复制代码
 doClick() {
    window.open("http://localhost:8080/detail", "_blank")
 }

mounted 中编写监听函数

js 复制代码
 window.addEventListener('storage', function (event) {
     if (event.key === 'shareData') {
       const newData = event.newValue;
       console.log('收到的更新数据:', newData);
     }
 });

在详情页面,我们使用 input 表示详情 form, 一个按钮表示 提交

在修改中只需使用 storage 保存输入框里面的值即可(输入框已经使用v-model绑定在变量num上)

js 复制代码
change() {
  localStorage.setItem('shareData', this.num);
 }  

当点击修改时,可以看到 列表中的监听函数生效

这个 this.num 只是模拟,实际上只要 stoage 不重复即可触发监听,等触发监听后就可以重新发起请求

BroadcastChannel

BroadcastChannel是一个专门跨标签通信的解决办法

核心在于两个 tab 使用同一个 BroadcastChannel 实例

新建 BroadcastChannel.js,目的是为了多个 tab 使用同一个实例

js 复制代码
const channelObj = new BroadcastChannel('BroadcastChannel');

export {
  channelObj
}

在列表页中的 mounted 函数中监听

js 复制代码
import {channelObj} from "./BroadcastChannel"

 channelObj.addEventListener("message", function (event) {
      const newData = event.data;
      console.log('收到的更新数据:', newData);
  })

我们在详情页面使用 postMessage 发送消息

js 复制代码
import {channelObj} from "./BroadcastChannel"

 change() {
    // 发送消息
    channelObj.postMessage(this.num);
 }

同样的也可以收到更新后的数据,和 storage 不同的是,this.num 可以为相同的值

结尾

今天介绍两种 vue 的跨标签通信,如果有什么其他的好的跨标签通信,会再次更新

相关推荐
三棵杨树1 分钟前
TypeScript从零开始(六):类
前端·typescript
Jenlybein2 分钟前
进阶学习 Javascript ? 来看看这篇系统复习笔记 [ 基础知识篇 ]
前端·javascript
行者dyc3 分钟前
webpack常用配置(待更新)
前端
樊小肆3 分钟前
Vue3 在线 PDF 编辑 1.0 文字、圆、矩形批注
前端·vue.js
小桥风满袖4 分钟前
我猜这些css属性,你用过的不超过10个
前端·css
砂糖橘加盐4 分钟前
一文讲清楚前端需要了解的垃圾回收
前端·javascript·面试
LucianaiB6 分钟前
不会还有人在传统网页定位修改,看我用一行JS代码让你的网页变为可编辑
javascript
Cache技术分享9 分钟前
51. Java 类和对象 - 任意数量的参数
前端·后端
烛阴13 分钟前
秒懂JavaScript:打造高效、封装完美的立即调用函数表达式(IIFE)全攻略!
前端·javascript
uhakadotcom18 分钟前
React Router和Remix中的CVE-2025-31137漏洞详解与修复指南
前端·面试·github