Как объединить 2 магазина vuex в один магазин

#vue.js #vuex #vuejs3

Вопрос:

Привет у меня есть требование объединить 2 vuex магазина в один магазин (оба магазина разных проектов)

 import storeA from '/path';

import storeB from '/path';
 

теперь объединил оба магазина

 const combinedStore = //combine logic as i don't know this logic
 

Я много искал в stackoverflow, чтобы объединить 2 магазина vuex, но не нашел никакого решения, поэтому опубликовал его.

вот как vuex будет выглядеть мой магазин в обоих stores

Магазин 1:

    // storeA.js
    
    const store = {
        state(){return {}},
        actions: {async getData(){...}},
        mutations: {},
        getters: {}, 
        modules:{ 
           Login
        }
    }
 

Магазин 2:

    // storeB.js
    
    const store = {
        state(){return {}},
        actions: {async getUsers(){...}},
        mutations: {},
        getters: {}, 
        modules:{ 
           workflow
        }
    }
 

Вот как я пытался:

 import StoreA from 'storeA.js';
import StoreB from 'storeB.js';

const newStoreData = Object.assign({},StoreA,StoreB)

const newStore = new Vuex.Store({
    ...newStoreData
});
 

Теперь будет работать только 1 магазин, другой выдаст ошибку, такую как

чтение имени пользователя имя неопределенного (i,e state.[module].first_name )

Проблему можно воспроизвести заново here:https://codesandbox.io/s/vuex-playground-forked-1h344?file=/src/main.js


Оригинальная работа fork:https://codesandbox.io/s/k012qvkmnv?file=/src/main.js

Комментарии:

1. Вы не можете объединить два хранилища, которые имеют неправильный контекст, но вы можете объединить два модуля, в которых каждый модуль может иметь свои собственные состояния, геттеры, мутации и действия.

2. в этом примере создано 2 отдельных магазина, которые воспроизводят мою проблему codesandbox.io/s/vuex-playground-forked-1h344?file=/src/App.vue Оригинальный рабочий код здесь codesandbox.io/s/k012qvkmnv

Ответ №1:

Vue 3

у версий для любовников, вероятно, тоже есть этот метод, но я не уверен.

 import StoreA from 'storeA.js';
import StoreB from 'storeB.js';

const newStore = new Vuex.Store(storeA);

newStore.registerModule('', storeB)
 

Я просто изменил store2.js и main.js файлы

ссылка на решенную проблему: https://codesandbox.io/s/vuex-playground-forked-6pg4w?file=/src/main.js

Вот документация об этом: https://vuex.vuejs.org/guide/modules.html#dynamic-module-registration

Комментарии:

1.получение ошибки Uncaught TypeError: Object(...) is not a function , несмотря на выполнение ваших шагов

2. @EaB Вы используете vuex 4 ?

3. …@Мизес, я использую "vuex": "^3.6.0"

4. @EaB Отредактировано для версии 3.x

5. …@Mises этот подход к объединению 2 модулей я уже знаю. это решение не является гибким, если у меня уже есть выделенные модули для каждого плагина. в основной части снова нам нужно определить модуль. затем измените весь код в плагине (чтобы получить такой доступ store.state.a ). не гибкое решение, если иметь в виду, что мой плагин можно использовать с любым местом.