如何实现多 Tab 同步登陆和退出

news2024/10/7 19:24:09

一. 场景再现

  1. 前两天接到一个需求,要求实现类似于 B站 的那种,当我同时打开多个 Tab 标签的时候,如果我在某一个窗口退出了,那么其它窗口的登陆状态也需要同步退出。如下图,我同时打开了两个 tab
    image.png

  2. 当我点击其中一个窗口的退出时,你会发现另外一个窗口也神奇的同步退出了。
    11.gif

  3. 经过查阅相关资料,比较简单的方法有两种,一个是 window.postMessage,另外一个就是监听 localStorage 的变化,接下来我会分别演示这两种方案。

二. 搭建一下基础样式

  1. 注意:样式方面,在这里我使用的是 UnoCSS ,将样式內联在了标签里,如果你还不了解这种写法,你可以点击下方的文章学习。不过即使你之前从未了解过 UnoCSS ,也不会影响你下面的阅读,因为样式不是本文的重点,并不影响整体阅读。
    🫱手把手教你如何创建一个代码仓库

  2. 如果恰好你使用了 Unocss 那么你可以直接复制我下面的代码快速开始今天的知识。

    <script setup lang="ts">
    import { ref } from "vue";
    
    const isLogin = ref<boolean>(true);
    </script>
    
    <template>
      <div class="w-100vw h-100vh text-14px text-black">
    <div
          class="w-full h-full flex items-center justify-center flex flex-col gap-10px"
    >
          <span>{{ isLogin ? "已登陆" : "已注销" }}</span>
          <button class="mr-10px" @click="">打开新窗口</button>
      <button @click="">退出</button>
    </div>
      </div>
    </template>
    
    
  3. 如果你没有用到 Unocss,你也不用担心,因为我们的样式非常简单,页面只有三个元素。一个表示是否已经登陆的文案,然后剩下两个按钮,一个是打开新窗口的功能,一个是退出登陆的功能。
    image.png

三. window.postMessage

  1. 我们快速书写一个打开新窗口的函数。
    image.png

  2. 此时我们还需在当前页面挂载以后给 window 绑定一个事件来搭配 window.open 之后我们要做的事情。这里我们给 window 绑定了一个监听事件,事件的名称叫做 “message”,回调函数中的参数 e 我们暂时不需要关系,我们继续往下进行代码书写。
    image.png
    可以看到我们的 window.open 正确的打开了一个新的 tab
    12.gif

  3. 接下来我们编写我们的退出按钮的函数。
    image.png
    首先很简单,它把我们的 isLogin 变量标记为 false,我们就可以通过观察 span 标签中的文案变化观察我们的状态。
    image.png
    另外一个重点,这里我们用到了 window.opener 这个属性,这个属性代表着它上一级的窗口。我们要向谁发生消息?上一级窗口对吧?调用 target?.postMessage 函数,这个函数第一个参数就是我们要发送的消息。我们就用 “退出” 字符串当作我们退出的信号吧。第二个参数是我们用 / 表示默认为当前的 origin 。届时上一级窗口的回调函数的事件对象就会收到我们的消息。

  4. 试验一下,可以很清楚的看到,我们第一个父窗口已经收到了来自子窗口的消息 “退出”,它是事件对象的 data属性的值。
    13.gif
    那么此时我们就可以判断,如果收到了退出的信号,那么我也跟着把 isLogin 变量的值改为 false,也实现退出的动作。
    image.png

  5. 测试一下效果:
    14.gif

四. 监听 localStorage

  1. 关于 storage 事件,这里面有一个误区,希望读者不要被误导,这个事件无法监听 sessionStorage 的变化。在 MDN 的中文文档中,并没有特别明显指出这一点。
    image.png
    而在英文文档中明确指出了这个十分关键的信息。
    image.png
    知道了这个关键点,就知道为什么我要写明要使用 localStorage 了。

    原文地址: MDN Storage Event

  2. 其实这个事件的用法和上面的 “message事件” 非常类似。第一步,你只需把我们给 window 绑定的事件替换为 “storage” 即可。
    image.png

  3. 然后修改我们的 logOut 函数。在执行的时候在 localStorage 里写入一个 isLoginfalse 的状态。(storage 只能写入字符串类型的值,所以需要 JSON 序列化一下,基础知识不过多赘述。)
    image.png

  4. 可以看到,我们第二个 tab 退出的时候,第一个 tab 已经监听到了 storage 的变化了。
    15.gif
    我们看一下这个事件对象身上的信息,这里面有两个属性是我们需要的。一个是 key,也就是发生变化的值,另外一个是 newValue 代表我们刚刚设置的值。
    image.png

  5. 知道了这些信息,我们就可以在事件的回调函数中做一些处理。
    image.png

  6. 测试一下:
    16.gif

五. 总结

实现方法其实还挺简单的,在实际工作中,我们项目的实现就是将 token 存放到 localStorage 里,通过监听 token 的存在来实现多 tab 的同时退出和同时登陆。

其实还有别的方法,比如同时开启一个 webSocket,让后端搭配同步向 tab 发消息等。

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

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

相关文章

【Java】SpringBoot项目中resource目录下有多个配置文件,如何指定某个特定的配置文件生效?

在我们开发项目的时候&#xff0c;会有多个开发环境&#xff0c;比如测试环境&#xff0c;生产环境&#xff0c;开发环境&#xff0c;产品环境等环境&#xff0c;如下 怎么多的配置文件&#xff0c;那么哪一个配置文件会生效&#xff1f;我们如何指定我们需要的配置文件&…

调用office的Excel制作统计图,并保存成图片

public class CMSChart{private Chart chart;public CMSChart(Chart chart){this.chart chart;}/// <summary>/// 保存图片/// </summary>/// <param name"fullPicName"></param>public void SaveAs(string fullPicName){ChartImageFormat …

VMware 虚拟机安装 CentOS 8

一、准备 演示过程使用的软件版本如下&#xff1a; VMware 16.2.5 build-20904516 CentOS 8.5.2111-x86_64-dvd1.iso VMware 下载安装请参考&#xff1a;VMware16.x 下载与安装 CentOS 镜像下载请参考&#xff1a;CentOS 各版本镜像下载 VMware 15 及以下版本&#xff0c;不支…

nginx部署本地项目如何让异地公网访问?服务器端口映射配置!

接触过IIS或apache的小伙伴们&#xff0c;对nginx是比较容易理解的&#xff0c;nginx有点类似&#xff0c;又有所差异&#xff0c;在选择使用时根据自己本地应用场景来部署使用即可。通过一些对比可能会更加清楚了解&#xff1a; 1.nginx是轻量级&#xff0c;比apache占用更少…

C# 多数元素

169 多数元素 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&#xff1a;nums [3,2,3] 输出&…

FPGA USB FX2 数据回环试验 驱动CY7C68013A实现 提供工程源码和技术支持

目录 1、前言2、我这儿已有的 FPGA USB 通信方案3、CY7C68013A芯片解读和硬件设计FX2 简介SlaveFIFO模式及其配置 4、工程详细设计方案5、vivado工程6、上板调试验证7、福利&#xff1a;工程代码的获取 1、前言 目前USB2.0的实现方案很多&#xff0c;但就简单好用的角度而言&a…

kkfileview部署使用

1.gitee下载源码 kkFileView: 使用spring boot打造文件文档在线预览项目解决方案&#xff0c;支持doc、docx、ppt、pptx、wps、xls、xlsx、zip、rar、ofd、xmind、bpmn 、eml 、epub、3ds、dwg、psd 、mp4、mp3以及众多类文本类型文件在线预览 2.去掉cad 3.替换水印字体为免费…

php宝塔搭建好用的二次元图系统php源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。本期给大家带来一套好用的二次元图系统php源码。抽时间看了一下&#xff0c;功能还是不错的&#xff0c;有参考价值。感兴趣的朋友可以自行下载学习。 技术架构 PHP7.0 nginx mysql5.7 JS CSS HTMLcnetos7以…

德国汽车行业杂志HANSERautomotive就浪潮信息算法团队在自动驾驶领域所取得的核心突破,进行专题署名报道

近日&#xff0c;德国专业汽车行业杂志HANSERautomotive就浪潮信息算法团队在自动驾驶领域所取得的核心突破&#xff0c;进行专题署名文章报道“Wahrnehmungssysteme und 3D-Objekterkennung Alles im Blick ”(《感知系统和三维物体识别&#xff0c;一切尽收眼底》)。针对AI感…

python ---- 根据文件名称中的数字排序

1. 需求分析 获取文件夹中的所有文件名称&#xff1b;筛选所有文件名称中的图片文件&#xff1b;获取图片文件名称中的数字&#xff1b;对数字排序&#xff1b;返回排序后的图片文件名称列表。 2. 获取所有图片文件名称 2.1 代码实现分析 使用 os.listdir 获取文件夹下的所…

keil_arm满减栈应用场景

.text .global _start _start:满减压栈使用场景ldr sp,0x40000800mov r0,#0x1mov r1,#0x2bl add1_funcadd r0,r0,r1 r0 r0 r1 0x3b stopadd1_func: 压栈保存现场 r0 0x1 r1 0x2stmfd sp!,{r0,r1&#xff0c;lr}mov r0,#0x3mov r1,#0x4bl add2_funcadd r0,r0,r1 r0 r…

如何在Windows中批量创建多个文件夹

你需要更好地组织你的文件和文档吗&#xff1f;如果你在笔记本电脑或台式机上将相关文件分组到不同的文件夹中&#xff0c;那么总是很容易找到你需要的东西。你还可以更改图标的大小&#xff0c;使其在视觉上更美观。 在 Windows 中创建一个文件夹的传统做法是&#xff1a;右键…

【GlobalMapper精品教程】060:用dem提取一条线的高程值

本实验使用的数据有线路数据(line.shp)和数字地形数据(dem.tif),提取线数据的高程值。 文章目录 一、加载实验数据二、生成路径剖面三、导出线路高程四、注意事项【参考阅读】:【ArcGIS微课1000例】0004:值提取至点(Extract value to point) 一、加载实验数据 本实验…

NLP学习笔记(三)

一&#xff1a;分类方法 &#xff08;一&#xff09;逻辑回归 最简单的方法就是将分类问题视为回归问题&#xff0c;采用逻辑回归计算分类的边界。 &#xff08;二&#xff09;softmax回归 softmax的前向传播过程可以分为以下三步&#xff1a; h W T x y ^ s o f t m a …

springboot基于keytool实现https的双向认证

一、环境准备 服务器信息如下&#xff1a; 操作系统说明server-one服务器1server-two服务器2 二、keytool命令解释 -genkey 表示要创建一个新的密钥。 -alias 表示 keystore 的别名。 -keyalg 表示使用的加密算法是 RSA &#xff0c;一种非对称加密算法。 -keysize 表示密…

ubuntu 基础软件

文章目录 一.通过.deb 安装的软件1.谷歌浏览器2.utools3.wps4.VScode5.typora6.搜狗输入法的安装 二.通过命令行安装的软件1.截图工具2.超级终端3.安装 git4.安装net-tools5.安装tree 三.ubuntu的基础设置1.更改软件安装源头2.修改计算机名称 一.通过.deb 安装的软件 下面 .deb…

SpringBoot-集成FTP(上传、下载、删除)

目录 一、引入依赖 二、配置文件 三、Controller层 四、Service层 五、相关工具类 由于服务在内网部署&#xff0c;需要使用ftp服务器管理文件&#xff0c;总结如下 一、引入依赖 <!-- https://mvnrepository.com/artifact/commons-net/commons-net --> <depen…

基于XDMA 中断模式的 PCIE 上位机与FPGA数据交互架构 提供工程源码和QT上位机源码

目录 1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案图像产生、发送、缓存数据处理XDMA简介XDMA中断模式图像读取、输出、显示QT上位机及其源码 5、vivado工程详解6、上板调试验证7、福利&#xff1a;工程代码的获取 1、前言 PCIE&#xff08;PCI Express&#…

SAP从入门到放弃系列之可用性检查-订单物料可用性检查-Part2

文章目录 一、概述二、物料可用性检查如何锁定库存2.1实现思路2.2系统设置关键点 三、系统测试数据3.1、勾选含预留选项的测试效果3.2、含相关预留3.2.1含相关预留-排除3.2.2含相关预留-仅可领料3.2.3含相关预留-全部 四、最后总结&#xff1a; 一、概述 物料可用性检查最终的…

【Linux】shell中快速遍历所有文件下匹配的内容

目录 1.举例 2.find命令 2.1. find命令作用 2.2. find命令选项基本格式 2.3. 常用选项 2.4. 常用动作 2.5. 根据文件名进行匹配 2.5.2 在/home目录下查找以.txt结尾的文件名 2.5.3 同上&#xff0c;但忽略大小写 2.5.4 查找 /home/ 下所有以.txt或.pdf结尾的文件…