使用 Vue.js 跨浏览器选项卡的反应式 localStorage 对象

Posted

技术标签:

【中文标题】使用 Vue.js 跨浏览器选项卡的反应式 localStorage 对象【英文标题】:Reactive localStorage object across browser tabs using Vue.js 【发布时间】:2019-03-17 18:05:47 【问题描述】:

我正在尝试使 localStorage 对象具有反应性,这样如果它更新,它也会在使用同一对象的其他选项卡中更新。我正在使用 Vue.js 并尝试创建一个返回 localStorage 对象的计算属性,但这不起作用。如何使对象具有反应性并使其也在其他浏览器选项卡中更新?

computed: 
  localStorageObject() 
    return JSON.parse(localStorage.getItem('object'));
  

【问题讨论】:

【参考方案1】:

@Matthias 有一个答案的开头,但它不会对其他选项卡中的更改做出反应。为此,您可以处理StorageEvent。这是一个粗略的草图,您可以根据需要进行增强。

const app = new Vue(
  el: '#app',
  data: 
    name: ''
  ,
  methods: 
    onStorageUpdate(event) 
      if (event.key === "name") 
        this.name = event.newValue;
      
    
  ,
  mounted() 
    if (localStorage.name) 
      this.name = localStorage.name;
    
    window.addEventListener("storage", this.onStorageUpdate);
  ,
  beforeDestroy() 
    window.removeEventListener("storage", this.onStorageUpdate);
  ,
  watch: 
    name(newName) 
      localStorage.name = newName;
    
  
);

【讨论】:

【参考方案2】:

在 Vue.js 食谱页面上有一个如何实现这一点的示例:https://vuejs.org/v2/cookbook/client-side-storage.html

在示例中,name 存储在本地存储中。

const app = new Vue(
  el: '#app',
  data: 
    name: ''
  ,
  mounted() 
        if (localStorage.name) 
      this.name = localStorage.name;
    
  ,
  watch: 
    name(newName) 
      localStorage.name = newName;
    
  
);

【讨论】:

也许在文档/窗口上添加一个focus 事件侦听器,它与上面示例中的mounted 部分相同?编辑:没关系,刚刚意识到已经有答案了

以上是关于使用 Vue.js 跨浏览器选项卡的反应式 localStorage 对象的主要内容,如果未能解决你的问题,请参考以下文章

React Native - 尝试在反应导航中创建一个带有选项卡导航器的抽屉,而不呈现选项卡的抽屉项目

在哪里放置代码以在 Vue.js 中设置 Firebase 身份验证状态持久性?

如何通过选定的道具动态地更改 vue js 2 中的选项卡?

如何在 Vue.js 中声明反应属性

Vue跨门槛系列之实例的阐述

vue.js使用http-proxy-middleware解决跨域请求问题