VUE中使用localStorage实现跨标签页面的通信

本文介绍了如何利用localStorage在父页面和子页面之间实现数据传递。当子页面关闭时,将表单数据返回给父页面。通过监听storage事件,确保在同源不同页面间数据更新时触发回调。文章详细阐述了实现原理、代码实现以及注意事项,包括事件销毁和Vue中路由传值的使用。

前言

目前出现了一个需求,需要父页面打开新的子页面,子页面提交表单之后,关闭子页面,然后把数据返回给父页面。
本来考虑使用sharedWorker,但是由于兼容性太差了,就弃用了。看到网上的介绍可以使用localStorage来实现,我就尝试了下。下面是一些具体的细节。

开始

整体流程如图所示:
在这里插入图片描述

需求分析

  1. 子页面需要知道自己的父页面对应的是谁,所以父页面打开子页面的时候需要传输一个父页面的KEY
  2. 由于表单是使用dialog来显示,需要注意避免出现事件重复注册的,及时销毁事件,保留监听事件的唯一。
  3. 由于保存的时候只会出现单一数据变化,所以只需要维护同一个localStorage对象即可。
  4. 父页面接受数据的时候,也需要校验子页面传输的数据是否属于自己。
  5. 最终的数据是否关联成功,由父页面的保存决定,子页面的数据是无状态的。

实现原理

localStorage中支持监听storage变化时的事件,并且只有在不同标签页面,同源网页的时候才会触发,这里恰好解决的我们的需求:
window.addEventListener('storage', callback);

代码实现

由于localStorage的API比较简单, 所以这里就不在这里介绍。
为了后续的拓展和方便调用,我这里就将localStorage一些操作做了简单的封装。

function generateUUID() {
   
   
  let d = new Date().getTime();
  if (window.performance && typeof window.performance.now === 'function') {
   
   
    d += performance.now(); // use high-precision timer if available
  }
  const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
   
   
    // eslint-disable-next-line no-bitwise
    const r 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值