V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MinonHeart
V2EX  ›  前端开发

求助 vue/pinia 高手,多 vue 实例如何共享一个全局 pinia 实例,且 vue 有自己的 pinia 实例?

  •  
  •   MinonHeart ·
    Aqours · 170 天前 · 680 次点击
    这是一个创建于 170 天前的主题,其中的信息可能已经有所发展或是发生改变。
    const fakeGlobalPinia = createPinia()
    
    function createVueInstance(container) {
        const app = createApp(...)
        
        // App 的 pinia 实例
        app.use(createPinia())
        
        // 想象中是这样的。
        app.use(fakeGlobalPinia)
        
        // ....
    }
    
    const vueApp1 = createVueInstance(...)
    const vueApp2 = createVueInstance(...)
    

    想象中是想上面的代码一样。

    场景举例

    假设有两个 vue app (在一个页面上),每个 app 都会控制主题的样式( theme ,这个是全局单例),我想把 theme 搞成一个全局的 store ,同时给两个 vue app 使用。但是每个 vue app ,也有自己的 store ,互不影响。

    问题

    1. 单 pinia 能够实现这种效果吗?
    2. 有什么其他方式可以实现?还是我的思路不对
    第 1 条附言  ·  131 天前
    const fakeGlobalPinia = createPinia()
    
    /**
     * 这样就可以多实例共享了
     */
    export const useGlobalStore = () => defineStore('id', {})(fakeGlobalPinia);
    
    function createVueInstance(container) {
        const app = createApp(...)
    
        // App 的 pinia 实例
        app.use(createPinia())
    
        // 想象中是这样的。
        app.use(fakeGlobalPinia)
    
        // ....
    }
    
    const vueApp1 = createVueInstance(...)
    const vueApp2 = createVueInstance(...)
    
    第 2 条附言  ·  131 天前

    上面写错了,修正一下

    const fakeGlobalPinia = createPinia()
    
    /**
     * 这样就可以多实例共享了
     */
    export const useGlobalStore = () => defineStore('id', {})(fakeGlobalPinia);
    
    function createVueInstance(container) {
        const app = createApp(...)
    
        // App 的 pinia 实例
        app.use(createPinia())
    
        // 这个不需要了
        // app.use(fakeGlobalPinia)
    
        // ....
    }
    
    const vueApp1 = createVueInstance(...)
    const vueApp2 = createVueInstance(...)
    
    5 条回复    2023-12-11 09:20:54 +08:00
    paopjian
        1
    paopjian  
       170 天前
    window 设个全局变量直接取 window 的配置?.
    MinonHeart
        2
    MinonHeart  
    OP
       170 天前
    @paopjian 放哪不重要,主要是实现方式。能想到可以用 vue.reactive 实现,这样有点割裂。想知道单 pinia 能不能实现这个效果
    qiaobeier
        3
    qiaobeier  
       170 天前
    不太清楚你的需求,之前我有个项目有点类似吧,就是一套代码但是输出不同的 theme 。我的方案是使用环境变量物理切换文件的。比如 npm run dev/build --theme=one ,然后 nodejs 运行时使用不同的文件这样子。
    ddch1997
        4
    ddch1997  
       157 天前
    单 pinia ,new 两个实例,然后 new vue 的时候一个为 store ,一个 commonStore ,是不是就可以了
    sjhhjx0122
        5
    sjhhjx0122  
       139 天前
    放在 window 上然后在每个 vue 实例的时候注入下去用?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1881 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 16:25 · PVG 00:25 · LAX 09:25 · JFK 12:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.