vue使用window.open(), vuex数据不共享的问题
时间: 2023-11-27 08:49:43 浏览: 92
在使用`window.open()`打开新窗口时,由于新窗口是一个新的浏览器上下文,因此它无法直接访问父窗口的数据。在Vue中使用Vuex进行状态管理时,当在父窗口中修改Vuex中的状态后,新窗口无法立即获取到更新后的状态。
解决这个问题的方法有两种:
1. 使用localStorage或sessionStorage
可以在父窗口中将Vuex的状态存储在localStorage或sessionStorage中,在新窗口中再获取这些状态。这样虽然可以解决问题,但是需要手动同步数据,不太方便。
2. 使用postMessage通信
可以使用postMessage方法向新窗口发送消息,通过监听新窗口的message事件来获取数据。具体实现可以参考以下代码:
在父窗口中:
```javascript
// 在打开新窗口前,先将Vuex状态存储在一个变量中
const state = store.state;
const win = window.open('new-window.html');
// 监听新窗口的message事件
window.addEventListener('message', function (event) {
if (event.source === win) {
// 接收新窗口发送的消息,更新状态
store.replaceState(event.data);
}
});
// 向新窗口发送消息,包含Vuex状态
win.postMessage(state, '*');
```
在新窗口中:
```javascript
// 监听message事件
window.addEventListener('message', function (event) {
// 接收父窗口发送的消息,更新状态
store.replaceState(event.data);
});
// 向父窗口发送消息,请求获取Vuex状态
window.opener.postMessage('get-state', '*');
```
这样就可以在新窗口中获取到更新后的状态了。需要注意的是,为了安全起见,应该在接收到消息时校验消息来源。
阅读全文