当前位置: 首页 > 知识库问答 >
问题:

javascript - vue3+pinia+piniaPluginPersistedstate持久化sessionStorage缓存,页面中open一个新窗口,执行操作后更新pinia,两个窗口的数据不同步嘛?

卫彭亮
2023-08-01

vue3+pinia+piniaPluginPersistedstate持久化sessionStorage缓存,页面中某个按钮点击单独open一个浏览器新窗口,执行某些操作后,更新pinia数据,更新后主窗口和新窗口的pinia数据不同步嘛?
image.png
image.png
源窗口id已更新,之前打开的新窗口还是显示的新窗口打开时的id
源窗口更新后的id值:
image.png
新窗口还是显示的新窗口打开时的id值:
image.png
如果不同步的话,请问有啥解决办法嘛?

共有2个答案

公西姚石
2023-08-01
1. main.js中:window.vueGlobalProperties = app.config.vueGlobalProperties;2. 子窗口中定义,将父窗口的pinia赋值给子窗口:const parentPinia = window.opener.vueGlobalProperties.$pinia;3. 可以通过监听父窗口store状态发生变化时,给子窗口发送事件的方式,实现同步更新。// 新打开的子窗口let NewWin = window.open(url); // 父窗口监听pinia数据有变化时,更新子窗口store.$subscribe(() => {    if (NewWin) {        NewWin.postMessage("updateStore")    }})// 子窗口接收更新事件window.onMessage = event => {    if (event.data === "updateStore") {         store.$patch(parentPinia.state.value[k])    }}
陈茂
2023-08-01

不会同步。因为 sessionStorage 并不是响应式的,并且新窗口的 pinia 是一个新的实例,数据更新后不同的 pinia 实例之间并不能同步。若两个窗口之间需要通信,可通过如下示例实现:

// 源窗口发送数据dispatchEvent(new CustomEvent("hello", { detail: "我是一些数据" }));// 新窗口接收数据window.opener.addEventListener("hello", (event) => {  console.log("收到数据", e.detail);});// 新窗口发送数据window.opener.dispatchEvent(new CustomEvent("hi", { detail: "我是一些数据" }));// 源窗口接收数据window.addEventListener("hi", (event) => {  console.log("收到数据", e.detail);});

或者将 dispatchEvent 改为winodw.postMessage亦可。

需要注意的是,新窗口不能刷新,否则可能会导致无法通信。

 类似资料:
  • vue3 中,window open打开了一个新窗口,新窗口执行某些操作后,可以代码控制该新窗口最小化(后续可以点击展开,winow.close的话,再次打开会丢失数据),然后显示出原来的主窗口嘛?

  • pinia的数据持久化,我用了个插件pinia-plugin-persist,用了该插件后数据是持久化了,但是取的值变成了字符串,需要序列化转换一下,例如:存入对象取出时时字符串,需要再次转换为对象才能使用,有没有什么好的方法,不用每次取值都转换一下?

  • 问题内容: 我正在尝试让此功能在我正在处理的项目的网站上工作。此功能的目的是仅(物理上)打印子div的内容,该子div被巧合地称为选择器#content。 这是我现在要了解的一点: 当用户单击“打印”超链接时,将触发该功能。新窗口将加载#content div的内容,该内容是从另一个HTML文档解析的: 它只是不会随样式一起加载样式。所有内容都将被裁剪在左上角。我试过通过JS链接CSS或按照另一页

  • 我正试图使用Flink以流媒体的方式使用消息队列中的有界数据。数据格式如下: 可以使用事件ID确定消息的开始和结束。我想接收此类批次并将最新的(通过覆盖)批次存储在磁盘或内存中。我可以编写自定义窗口触发器来使用开始和结束标志提取事件,如下所示: 但是如何保持最新窗口的输出。一种方法是使用ProcessAllWindowFunction接收所有事件并手动将其写入磁盘,但这感觉像是一种黑客行为。我还研

  • 有多个菜单页面,页面上方都有查询,封装了查询组件,切换页面的时候要重置查询条件-searchObj 我用pinia来存查询条件,searchObj,然后每个页面监听searchObj,条件变化就发起查询 问题是: 当我切换页面的时候把查询条件重置,这时候就会触发当前页面的watch,然后发起查询,就是跳转前就发起了查询 请问怎么解决这种问题,或者怎么这样的布局还有什么其他方法实现

  • 第一课: 新建一个窗口 简介 欢迎来到第一课! 在学习OpenGL之前,我们将先学习如何生成,运行,和玩转(最重要的一点)课程中的代码。 预备知识 不需要特别的预备知识。如果你有C、Java、Lisp、Javascript等编程语言的经验,那么理解课程代码会更快;但这不是必需的;如果没有,那么也仅仅是同时学两样东西(编程语言+OpenGL)会稍微复杂点而已。 课程全部用“傻瓜式C++”编写:我费了