实时监听 localStorage 变化的实现方法

很多时候,我们在A页面通过点击之类的操作获得一个数值,然后拿到B页面使用,我们希望这个值是响应式的,当然你可以使用vue或者react的实现,这篇文章适合想偷懒或者很多后端小伙不愿意去用的使用,效果是差不多的主要是适用于任何基于JavaScript的项目

在不同窗口/选项卡中监听 localStorage 变化

localStorage 的数据在一个窗口/选项卡中改变时,其他同源的窗口/选项卡会触发 storage 事件。我们可以利用这个事件来监听 localStorage 的变化。

示例代码

// 添加 storage 事件监听器
window.addEventListener('storage', function(event) {if (event.key === 'groupID') {console.log('New value:', event.newValue);}
});

解释

  • storage 事件会在同源的其他窗口/选项卡中触发。
  • event.key 是变化的 localStorage 项的键。
  • event.newValue 是变化后的新值。

注意事项

  • 只有在不同的窗口/选项卡之间修改 localStorage 时,才会触发 storage 事件。
  • 如果在同一个窗口/选项卡中修改 localStorage,则不会触发 storage 事件。

在同一个窗口/选项卡中监听 localStorage 变化

在同一个窗口/选项卡中,storage 事件不会被触发。我们可以通过自定义事件或其他手段来实现对 localStorage 变化的监听。

方法一:使用自定义事件

  1. 设置 localStorage 并触发自定义事件
function setLocalStorageItem(key, value) {localStorage.setItem(key, value);const event = new CustomEvent('localStorageChange', { detail: { key, value } });window.dispatchEvent(event);
}
  1. 监听自定义事件
window.addEventListener('localStorageChange', function(event) {if (event.detail.key === 'groupID') {console.log('New value:', event.detail.value);}
});

方法二:使用定时器轮询

另一种方法是在一定时间间隔内轮询 localStorage 的值,检查是否发生变化。

let lastValue = localStorage.getItem('groupID');setInterval(function() {const newValue = localStorage.getItem('groupID');if (newValue !== lastValue) {console.log('New value:', newValue);lastValue = newValue;}
}, 1000); // 每秒检查一次

方法三:使用 Proxy 对象

如果希望对所有的 localStorage 操作进行代理,可以使用 Proxy 对象。

const localStorageProxy = new Proxy(localStorage, {set(target, key, value) {target.setItem(key, value);const event = new CustomEvent('localStorageChange', { detail: { key, value } });window.dispatchEvent(event);return true;}
});// 设置值时使用代理对象
localStorageProxy.groupID = 'newValue';// 监听自定义事件
window.addEventListener('localStorageChange', function(event) {if (event.detail.key === 'groupID') {console.log('New value:', event.detail.value);}
});

示例:通过 localStorage 监听实现页面间通信

假设我们有两个页面,页面A设置 localStorage 中的 groupID 值,页面B监听 groupID 的变化并根据最新的值执行相应的逻辑。

页面A:设置 localStorage 并触发自定义事件

const sss = (node, data) => {let id = data.id.split('_')[1];alert(id);localStorage.setItem('groupID', id);// 手动触发自定义事件const event = new CustomEvent('localStorageChange', { detail: { key: 'groupID', value: id } });window.dispatchEvent(event);
};

页面B:监听自定义事件并获取最新的 groupID

mounted() {let _this = this;// 初次加载时获取数据_this.getData();// 使用自定义事件监听 groupID 变化window.addEventListener('localStorageChange', function(event) {if (event.detail.key === 'groupID') {alert('1');_this.getData();}});
},methods: {async getData() {const id = localStorage.getItem('groupID');// 检查 id 是否存在if (!id) {this.$message({message: 'Group ID 不存在,请先选择一个组。',type: 'warning'});return;}try {const res = await traffic.trafficvulndel({page: this.formData.page_num,size: this.pageSize,search: this.formData.search_field,groupID: id,...this.formData});if (res.code === 200) {this.tableData = res.data.assetsInfo;console.log(this.tableData, 'this.tableData');this.totalpage = res.data.count;} else {this.$message({message: res.msg,type: 'error'});}} catch (error) {console.log(error);this.$message({message: '请求失败,请稍后再试。',type: 'error'});}}
}

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

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

相关文章

uniapp原生插件开发实战——Android打开文件到自己的app

项目配置 原生Module类插件创建详情请看uniapp原生插件开发实战——集成Android端的Twitter登陆 配置build.gradle: apply plugin: com.android.library android {... }repositories {flatDir {dirs libs} }dependencies {// 添加uniapp必要的依赖,参考同上compileOnly an…

iOS 中 attribute((constructor)) 修饰的函数

开发环境声明:此文描述的 attribute((constructor)) 特指使用 Objective-C 开发 iOS、MacOS,Swift 语言不支持这种属性修饰符。 初识 attribute((constructor)) 在 Objective-C 开发中,attribute((constructor)) 是一个 GCC 和 Clang 编译器…

网络变压器内部加电容起什么作用

网络变压器内部加入电容的作用是多方面的,主要涉及信号耦合、电磁兼容(EMC)和信号完整性(SI)等方面。下面详细解释: 1. **信号耦合**: 网络变压器的主要功能是增加信号的传输距离和提升信号…

【前端】 nvm安装管理多版本node、 npm install失败解决方式

【问题】If you believe this might be a permissions issue, please double-check the npm ERR! permissio或者Error: EPERM: operation not permitted, VScode中npm install或cnpm install报错 简单总结,我们运行npm install 无法安装吧包,提示权限问题…

友思特应用 | 模型链接一应俱全:IC多类别视觉检测一站式解决方案

导读 高精度IC制造工艺需要对产品进行全方位检测以保证工艺质量过关。友思特 Neuro-T 通过调用平台的流程图功能,搭建多类深度学习模型,形成了一站式的视觉检测解决方案。本文将为您详述方案搭建过程与实际应用效果。 在当今集成电路(IC&…

谷歌浏览器切换tab栏时页面释放内存导致echarts不显示问题

在初始化echarts时添加下述监听 // 添加事件监听器document.addEventListener("visibilitychange", this.handleVisibilityChange);handleVisibilityChange() {if (document.visibilityState visible) {// 页面处于活动状态,手动触发图表的更新或重新绘…

SuiNS更新命名标准,增强用户体验

SuiNS将其面向用户的命名标准从 xxx.sui 更新为 xxx,让用户能够以一种适用于Web2和Web3世界的方式来代表自己。通过此更新,用户可以在其选择的名称前使用 ,而不是在名称后添加 .sui。 Sui命名服务于去年推出,旨在使Sui上的地址更…

TypeScript写好了,怎么运行啊!!!

环境搭建 Vs code Ctrlshiftp打开首选项—》打开工作区设置—》搜索Typescript 推荐开启的配置项主要是这几个: Function Like Return Types,显示推导得到的函数返回值类型;Parameter Names,显示函数入参的名称;Par…

Vxe UI vxe-modal 实现窗口的最大化与最小化,实现弹出多窗口

Vxe UI vue vxe-modal 实现窗口的最大化与最小化,实现弹出多窗口 通过js方式调用 js方式脱离模板,每次创建是多个实例。 mask:关闭遮罩层,如果不关闭则会显示遮罩层,就不能实现同时操作多窗口 lockView:…

win11右键小工具

开头要说的 在日常使用场景中,大家如果用的是新的笔记本电脑,应该都是安装的win11系统, 当然win11系统是最被诟病的, 因为有很多人觉得很难操作, 就比如一个小小的解压操作, 在win7和win10上&#xff…

Kubernetes CSR 颁发的 MinIO Operator 证书

在当前的 Kubernetes 环境中,创建、管理和自动化 TLS 证书的标准方法是使用 kind: CertificateSigningRequest (CSR)资源。此原生 Kubernetes 资源提供了一种强大而高效的方式来处理集群中证书的整个生命周期。 通过利用 CSR 资源&#xff0…

小山菌_代码随想录算法训练营第二十六天| 39. 组合总和 、40.组合总和II 、 131.分割回文串

39. 组合总和 文档讲解:代码随想录.组合总和 视频讲解:带你学透回溯算法-组合总和(对应「leetcode」力扣题目:39.组合总和)| 回溯法精讲! 状态:已完成 代码实现 class Solution {private:vecto…

Thinkphp校园新闻发布系统源码 毕业设计项目实例

Thinkphp校园新闻发布系统源码 毕业设计项目实例 校园新闻发布系统模块: 用户模块:注册,登陆,查看个人信息,修改个人信息,站内搜索,新闻浏览等功能, 后台管理员模块:会员…

MySQL日志——redolog

redo log(重做日志) 为什么需要redo log? 在mysql提交一个事务后,这个事务所作的数据修改并不会直接保存到磁盘文件中,而是先保存在buffer pool缓冲区中,在需要读取数据时,先从缓冲区中找&…

破局消费供应链,企业费用管理如何应对变与不变?

供应链管理在过去一直被局限在生产与产品供应领域,更多被理解为生产及流通过程中,涉及将产品或服务提供给最终用户活动的上游与下游企业所形成的网链结构,即将产品从商家送到消费者手中整个链条。因为直接对企业利润产生重大影响,…

鸿蒙 Text文本过长超出Row的范围问题

代码如下: 可以发现随着文本内容的增加, 第二个组件test2明显被挤出了屏幕外, 感觉像是Row自己对内容的约束没做好一样, 目前没看到官方的推荐解决方法, 机缘巧合下找到了个这种的办法, 给内容会增加的组件设置layoutWeight(), 借助layoutWeight的特性来解决该问题, 改动后代码…

MaxKB-无需代码,30分钟创建基于大语言模型的本地知识库问答系统

简介 MaxKB 是一个基于大语言模型 (LLM) 的智能知识库问答系统。它能够帮助企业高效地管理知识,并提供智能问答功能。想象一下,你有一个虚拟助手,可以回答各种关于公司内部知识的问题,无论是政策、流程,还是技术文档&a…

简析:分账系统

分账系统是一种基于银行或三方支付机构备付金账户,用于实现资金分配和结算的关键工具。它能够对交易过程中的资金进行准确的分配,确保每个参与者/合作伙伴按照规定的比例获得其应得的收益。本文将初步探讨分账系统的定义、功能、应用领域以及其在商业和金…

热门:最新植物大战僵尸杂交版张大仙主播同款

软件介绍: 植物大战僵尸杂交版是由B站UP主“潜艇伟伟迷”制作的一款结合了《植物大战僵尸》原有元素与创新玩法的游戏。这款游戏以其独特的“杂交”植物概念在B站上迅速走红,吸引了大量玩家的关注和讨论。在杂交版中,每个植物都有专属的特点以及玩法&am…

苍穹外卖环境搭建

一、前端环境搭建 ①整体结构 ②前端工程基于nginx运行 启动nginx:双击 nginx.exe 即可启动 nginx 服务,访问端口号为 80 进入浏览器地址输入locallhost回车 二、后端环境搭建 后端初始工程基于maven进行项目构建,并且进行分模块开发 (1) idea打开初始…