自定义localStorage监听事件

一、问题

在项目开发过程中,发现有很多时候进行localStorage.setItem()操作设置本地存储后,页面必须刷新才能够获取到存储数据,而有些时候本地缓存更新后,页面无法通过再次刷新以获取本地缓存,这就导致依赖本地缓存的数据无法进行更新。为了解决这个问题,就必须要用到自定义localStorage监听事件了

二、解决方法

下面以Vue3项目为例进行自定义localStorage监听事件方法阐述。

首先 ,在根目录src目录下新建utils文件夹,在utils文件夹下新增overwrite.js文件,文件内容如下:

javascript 复制代码
// overwrite.js

// 重写setItem事件,当使用setItem的时候,触发,window.dispatchEvent派发事件
export function dispatchEventStroage () {
    const signSetItem = localStorage.setItem
    localStorage.setItem = function (key, val) {
      let setEvent = new Event('setItemEvent')
      setEvent.key = key
      setEvent.newValue = val
      window.dispatchEvent(setEvent)
      signSetItem.apply(this, arguments)
    }
  }
  

接下来 ,在项目的入口文件main.js下引入自定义的重写方法

1、引入文件的方法

javascript 复制代码
import {dispatchEventStroage} from "./utils/overwrite"

2、全局使用即可。

javascript 复制代码
dispatchEventStroage()

3、完整main.js引入的示例,如有不清楚的地方请参考下面的完整main.js示例:

javascript 复制代码
import {createApp} from 'vue'
import './style.css'
import App from './App.vue'
import router from './router'
import {createPinia} from 'pinia'
import screenShort from "vue-web-screen-shot";
import {dispatchEventStroage} from "./utils/overwrite"

const app = createApp(App)

dispatchEventStroage()

app.use(router)
app.use(createPinia())
app.use(screenShort, {enableWebRtc: true})
app.mount('#app')

最后,在需要的地方使用即可,使用示例如下:

javascript 复制代码
window.addEventListener('setItemEvent', (e) => {
      console.log("监听到触发了localStorage.setItem事件",e)
  })
相关推荐
2501_9445255426 分钟前
Flutter for OpenHarmony 个人理财管理App实战 - 支出分析页面
android·开发语言·前端·javascript·flutter
jin1233221 小时前
React Native鸿蒙跨平台完成剧本杀组队详情页面,可以复用桌游、团建、赛事等各类组队详情页开发
javascript·react native·react.js·ecmascript·harmonyos
经年未远2 小时前
vue3中实现耳机和扬声器切换方案
javascript·学习·vue
刘一说2 小时前
Vue 组件不必要的重新渲染问题解析:为什么子组件总在“无故”刷新?
前端·javascript·vue.js
可触的未来,发芽的智生2 小时前
狂想:为AGI代称造字ta,《第三类智慧存在,神的赐名》
javascript·人工智能·python·神经网络·程序人生
徐同保3 小时前
React useRef 完全指南:在异步回调中访问最新的 props/state引言
前端·javascript·react.js
fanruitian3 小时前
uniapp 创建项目
javascript·vue.js·uni-app
刘一说4 小时前
Vue 导航守卫未生效问题解析:为什么路由守卫不执行或逻辑失效?
前端·javascript·vue.js
一周七喜h4 小时前
在Vue3和TypeScripts中使用pinia
前端·javascript·vue.js
摘星编程4 小时前
用React Native开发OpenHarmony应用:Calendar日期范围选择
javascript·react native·react.js