vue 全局监听sessionStorage变化

4 篇文章 0 订阅

一、首先新建一个global.js 文件  (我的js 文件为这个名字,名字自己定义)


export default {
    
    install(Vue)
    {
        Vue.prototype.addTabs = function (values) {
            // values 为传过来的值,往sessionStorage里存的时候要转成字符串
            this.resetSetItem('tabsName', JSON.stringify(values));
        },
        
        Vue.prototype.resetSetItem = function (key, newVal) {
           // 这里面只监听  sessionStorage 中key 为tabsName 的变化
             if (key === 'tabsName') {   

         
                // 创建一个StorageEvent事件
                var newStorageEvent = document.createEvent('StorageEvent');
                const storage = {
                    setItem: function (k, val) {
                        sessionStorage.setItem(k, val);
         
                        // 初始化创建的事件
                        newStorageEvent.initStorageEvent('setItem', false, false, k, null, val, null, null);
         
                        // 派发对象
                        window.dispatchEvent(newStorageEvent)
                    }
                }
                return storage.setItem(key, newVal);
            }
         }
        
        
    }


    
}

第二步;将你的js 文件导入到min.js 中,并挂载到vue 实例上

import './lib/axios.js'  // 导入路径,根据自己项目的位置而定
Vue.use(global);

第三步;在你需要用到的地方;的 created() {}  中写下如下代码

// 监听sessionStorage 中的变化
    window.addEventListener("setItem", () => {
          // 变化以后你要做的操作
            let  values = sessionStorage.getItem("tabsName");
            console.log(values)
    });

第四步;调用

this.addTabs({id:123,name:"张三"});   

// 我这里存了一个对象,你可以存数组;方法一样

这个方法是全局调用的,不用声明,因为已经挂载在vue 原型上了

 

扩展 如果想监听多个值变化 第一步改写如下:


export default {
    
    install(Vue)
    {
        Vue.prototype.addTabs = function (values) {
            this.resetSetItem('tabsName', JSON.stringify(values));
        },

        // 删除sessionStorage 中一个数组中的一个对象。
        Vue.prototype.deleteTabs = function(vales){
            let tabsList = JSON.parse(sessionStorage.getItem("tabsList"))
            for(let i = 0,max = tabsList.length;i<max;i+=1){
                if(vales.name == tabsList[i].name){
                    tabsList.splice(i,1)
                    break;
                }
            }
           
            this.resetSetItem('tabsList', JSON.stringify(tabsList));
        },

        Vue.prototype.resetSetItem = function (key, newVal) {
            if (key === 'tabsName' || key === 'tabsList') {
         
                // 创建一个StorageEvent事件
                var newStorageEvent = document.createEvent('StorageEvent');
                const storage = {
                    setItem: function (k, val) {
                        sessionStorage.setItem(k, val);
         
                        // 初始化创建的事件
                        newStorageEvent.initStorageEvent('setItem', false, false, k, null, val, null, null);
         
                        // 派发对象
                        window.dispatchEvent(newStorageEvent)
                    }
                }
                return storage.setItem(key, newVal);
            }
         }
        
    }


    
}

第三步改写如下

 window.addEventListener("setItem", res => {

        // res 中能后返回 sessionStorage 中的 key  你可以打印出来看看 
      if (res.key == "tabsList") {
            // 业务逻辑 
            // tabsList 变化时候 的操作
       
      } else {
        //  tabsName 变化时的操作   因为 我这里只监听了两个
        
      }
    });

比方说:现在sessionStorage 中 key  为tabsList 的数组为

[{id:123,name:"张三"},{id:456,name:"李四"}]

调用删除方法

this.deleteTabs({name:'李四',id:456})

只能通过  this.addTabs({})  或者  this.deleteTabs({}); 执行才能被监听到。

具体实现原理,有兴趣的话,请自行查找资料。麻烦知道的同学,请留言

 

声明:本文参考以下博客(可能有其他的;比较多,只找到这一个。如果,有你的请留言,一定加上)

https://www.cnblogs.com/wy120/p/11775475.html

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
监听 SessionStorage 变化,您可以使用 Vue 的 `$watch` 函数来监视 SessionStorage。具体方法如下: 1. 在 Vue 组件中,使用 `$watch` 函数来监听 SessionStorage变化。例如: ```javascript export default { created() { window.addEventListener('storage', this.onStorageChange) }, methods: { onStorageChange(event) { if (event.key === 'myKey') { // 处理 SessionStorage 变化的逻辑 } } } } ``` 在上面的代码中,我们使用 `window.addEventListener('storage', this.onStorageChange)` 来监听 SessionStorage变化,并在 `onStorageChange` 方法中处理变化的逻辑。 2. 如果您想在多个组件中共享相同的 SessionStorage,可以将 SessionStorage 封装在一个单独的模块中,然后在多个组件中使用该模块。例如: ```javascript const storage = { fetch(key) { return JSON.parse(window.sessionStorage.getItem(key)) }, save(key, data) { window.sessionStorage.setItem(key, JSON.stringify(data)) } } export default storage ``` 在上面的代码中,我们定义了一个 `storage` 对象,它包含了 `fetch` 和 `save` 两个方法来读取和保存 SessionStorage。然后我们将 `storage` 对象导出,以便在其他组件中使用。 3. 在其他组件中使用 `storage` 模块。例如: ```javascript import storage from './storage' export default { created() { this.$watch(() => storage.fetch('myKey'), (newValue, oldValue) => { // 处理 SessionStorage 变化的逻辑 }) } } ``` 在上面的代码中,我们使用 `this.$watch` 函数来监听 `storage.fetch('myKey')` 的变化,然后在回调函数中处理变化的逻辑。这样,在任何一个组件中修改了 SessionStorage,都会触发所有组件中 `$watch` 函数的回调。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值