前端跨浏览器标签页数据共享解决方案

简介: vue 项目中有一个工单消息通知列表页,每条消息有已读和未读状态,点击消息会用 window.open 打开一个新的浏览器标签页跳转到工单列表页,工单列表页里有项操作是查看消息,会弹窗显示出具体的详细内容,进入这个弹窗就代表用户已经看到消息了,此时会去调后端接口修改消息状态为已读

需求描述

vue 项目中有一个工单消息通知列表页,每条消息有已读和未读状态,点击消息会用 window.open 打开一个新的浏览器标签页跳转到工单列表页,工单列表页里有项操作是查看消息,会弹窗显示出具体的详细内容,进入这个弹窗就代表用户已经看到消息了,此时会去调后端接口修改消息状态为已读。

需要实现用户已读当前消息后,前面一个工单消息通知列表页的已读/未读状态同步更新。

想到的实现方式

  • 1、直接用定时器 setInterval 不断地轮询调后端接口查最新状态
  • 2、用 vuex 实现全局状态共享
  • 3、用 localStorage 实现数据共享

第1种最简单,不过有点 low 直接 pass 掉了。第2种咋一看好像可以实现,实际上你去试一下就会发现问题,vuex 是不能跨标签页共享的,每一个标签页下的 vuex 实例是独立的,你修改了当前标签页下的 vuex 里数据,其他标签页是不受影响的,网上找到一个插件 vuex-shared-mutations,不过看了下最近维护还是4年以前,所以也直接 pass 了。

最后用第3种实现了,自己在 localStorage 里存一个标识,然后在需要同步数据的页面开一个 storage 的事件监听,去监听本地缓存的变化,如果是目标值发生变化,直接重新获取数据更新就可以了,具体的 demo 代码:

消息通知列表页

<template>
    <div>
        <p v-for="(item, index) in noticeList" :key="index">消息{
  { index + 1 }}:{
  { item.title }}</p>
    </div>
</template>
<script>
export default {
    data() {
        return {
            noticeList: [
                { title: '我是第一条消息' },
                { title: '我是第二条消息' },
            ]
        }
    },
    created() {
        // 跨标签页监听
        window.addEventListener('storage', this.storageChange)
    },
    beforeDestroy() {
        window.removeEventListener('storage', this.storageChange)
    },
    methods: {
        storageChange(e) {
            if (e && e.key == 'targetKey' && e.newValue) {
                // 在这里更新数据
            }
        },
    }
}
</script>

工单列表页

<template>
    <div>
        <p @click="handleRead">读消息</p>
    </div>
</template>
<script>
export default {
    data() {
        return {}
    },
    methods: {
        handleRead() {
            localStorage.setItem('targetKey', 1)
        },
    }
}
</script>

效果是实现了,最终感觉还是不太满意,在群里询问了一圈,果然有新发现,postMessage 和 BroadcastChannel 这两个浏览器的新 api 是可以实现跨标签页通信的,postMessage 还可以实现跨源通信,一般用在和 iframe 通信比较多。

终极版

最终尝试了 BroadcastChannel 版本:

接收消息:

const BC = new BroadcastChannel('notice')
BC.onmessage = (e) => {
   
    console.log('消息来了:', e)
}

// 断开连接
// BC.close()

发送消息:

const BC = new BroadcastChannel('notice')
BC.postMessage('发出消息,赶紧去更新数据吧')

// 断开连接
// BC.close()
相关文章
|
6天前
|
前端开发
调试前端时,在浏览器上修改参数并重新调用接口
有时候我们的页面点击过了,但是接口出问题,想修改参数再调用一次,一般是用apiPost工具把接口复制,再加上token和参数,但是这样非常的效率比较低。
54 0
|
6天前
|
JSON 前端开发 安全
前端开发中的跨域问题及解决方案
在前端开发中,跨域是一个常见但又令人头疼的问题。本文将深入探讨跨域产生的原因以及一些常见的解决方案,帮助开发者更好地理解和处理跨域情况。
|
2天前
浏览器兼容性解决方案
浏览器兼容性解决方案。
9 1
|
5天前
|
Web App开发 前端开发 JavaScript
构建跨浏览器兼容的前端应用:技术实践与挑战
【5月更文挑战第16天】构建跨浏览器兼容的前端应用是应对浏览器差异和多样性的挑战。使用现代框架(如React、Vue)能自动转换代码,编写可移植的Web标准代码,结合浏览器兼容性测试工具和Polyfill解决旧浏览器支持问题。关注浏览器更新,应对性能、API差异和样式问题,采用渐进增强、条件判断和CSS Reset策略确保应用在各种浏览器上运行良好。
|
6天前
浏览器兼容性解决方案
【5月更文挑战第4天】浏览器兼容性解决方案。
14 5
|
6天前
|
监控 前端开发 JavaScript
如何使用浏览器调试前端代码?
【4月更文挑战第11天】前端开发中,浏览器调试是关键技能,能提升代码质量。本文介绍了如何使用浏览器的调试工具:1) 打开调试窗口(F12或右键检查);2) Elements标签页检查DOM结构和样式;3) Console调试JavaScript,查看日志和错误信息;4) Sources设置断点调试JS文件;5) 利用Network、Performance和Memory等标签页优化性能。熟悉调试工具、利用日志和错误信息能有效定位问题,提高开发效率。
51 7
|
6天前
|
Web App开发 移动开发 运维
跨域解决方案[前端+后端]
跨域解决方案[前端+后端]
36 0
|
6天前
|
前端开发
无法解锁/var/lib/dpkg/lock-frontend和无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend)【解决方案】
无法解锁/var/lib/dpkg/lock-frontend和无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend)【解决方案】
|
6天前
|
前端开发 JavaScript NoSQL
从前端到后端:构建全栈应用的技术挑战与解决方案
在当今互联网时代,全栈开发成为越来越受欢迎的技术趋势。本文将深入探讨从前端到后端的全栈开发过程中所面临的技术挑战,并提出相应的解决方案,涵盖前端框架选择、后端技术架构、数据库设计以及跨平台兼容性等关键问题。
|
6天前
|
前端开发
前端性能优化:掌握解决方案
我们常说性能永远是第一需求,作为一个前端工程师,不管使用什么框架,不管从事什么类型的网站或应用开发,只要是项目被用户使用,性能优化就永远是你需要关注的问题。通常情况下,工程师们在深入了解前端技术的原理后,才能总结出性能优化的方案,需要多年经验的积累。前端技术日新月异,优秀的性能优化方案在近几年也层出不穷。本课程带你使用当今行业中非常前沿&专业的方案,解决前端性能优化问题。无论是为了解决工作中的实际问题,还是为了提升能力,这门课都能帮到你。
18 2
前端性能优化:掌握解决方案