在同一个VUE STORE+LOCAL下,开启两个TAB,如何独立工作且不影响
“两个 tab 中互不干扰,各自独立工作,各自有自己的 app-graph 状态,即使一个 tab 改了,另一个 tab 不受影响。”
✅ 可以做到,而且很合理!
这实际上是不共享状态的需求,我们可以专门针对这个来设计。下面教你做法:
【目标】
即使开启了 persist: true
,每个 tab 自己维护自己的版本,不互相影响。
【做法思路】
因为 localStorage
是所有 tab 共享的,
所以必须想办法让每个 tab 存自己的"副本"。
常见做法:
✨ 方法一:在 localStorage 里为每个 tab 生成一个唯一的 key(推荐)
- 每个 tab 打开时,生成一个独立的 id,比如一个随机 uuid。
- 把
app-graph
存成app-graph-{uuid}
这样的格式。 - 每个 tab 只管自己的那个
uuid
存取。
这样就做到真正隔离了!
【具体怎么做】
比如你在 store/app-graph.ts
里面,加上这样的逻辑:
import { defineStore } from 'pinia';
// 随机生成一个 uuid,用于当前 tab
function generateUUID() {
return 'xxxxxx'.replace(/x/g, () =>
Math.floor(Math.random() * 16).toString(16)
);
}
// 尝试从 sessionStorage 读取 tabId,没有就生成一个
let tabId = sessionStorage.getItem('app-graph-tab-id');
if (!tabId) {
tabId = generateUUID();
sessionStorage.setItem('app-graph-tab-id', tabId);
}
// 存储用的 localStorage key
const storageKey = `app-graph-${tabId}`;
export const useAppGraphStore = defineStore('app-graph', {
state: () => ({
// 你的各种图形参数
shapes: [],
// 其他状态...
}),
persist: {
key: storageKey, // 🔥 每个 tab 用自己的 key
storage: localStorage,
},
});
🔥解释一下
sessionStorage
是每个 tab 独立的(浏览器 tab 隔离),所以我们在每个 tab 里存一个自己的tabId
。localStorage
用app-graph-xxxxxx
格式存数据,各自用各自的 key。- 这样,无论你开多少个 tab,互不干扰!
- 关闭 tab 后,如果重新开新的 tab,会生成新的
tabId
,有新的副本。
【额外注意】
- 这样做,每个 tab 的数据是分开的,但是 localStorage 里会存很多
app-graph-xxx
。 - 如果需要,可以在关闭 tab 时,清理掉对应的 localStorage key(高级一点可以做这个)。
想做的话可以用:
window.addEventListener('beforeunload', () => {
localStorage.removeItem(`app-graph-${tabId}`);
});
这样关掉 tab 会自动清掉自己的副本数据,避免 localStorage 越积越多!
【总结】
场景 | 推荐做法 |
---|---|
两个 tab 想同步 | 用 storage 事件 |
两个 tab 想互相独立 | 每个 tab 生成自己的 storage key |
你的需求是后者,所以要用 每个 tab 自己的 localStorage key!
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。