两个 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
  • localStorageapp-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