Я считаю, что в данном случае предупреждение вводит в заблуждение. Это технически верно, но бесполезно.
Следующий код выдаст такое же предупреждение. Он не использует deepmerge
, vue-test-utils
или jest
, но я считаю, что причина root такая же, как и в исходном вопросе:
const config = {
state: {},
modules: {
customer: {}
}
}
const store1 = new Vuex.Store(config)
const store2 = new Vuex.Store(config)
<script src="https://unpkg.com/vue@2.6.11/dist/vue.js"></script>
<script src="https://unpkg.com/vuex@3.4.0/dist/vuex.js"></script>
В этом примере есть две ключевые части, которые необходимы для запуска предупреждения:
- Несколько хранилищ.
- A root
state
объект в конфигурации.
Код в вопросе определенно имеет несколько хранилищ. Один создается в конце store.js
, а другой создается createStore
.
В вопросе не отображается объект root state
, но он упоминает, что код был уменьшено. Я предполагаю, что в полном коде есть этот объект.
Так почему это вызывает это предупреждение?
Модуль state
хранится в объекте root state
. Несмотря на то, что модуль в моем примере явно не имеет state
, он все еще существует. Этот state
будет сохранен в state.customer
. Поэтому, когда создается первое хранилище, оно добавляет свойство customer
к этому root state
объекту.
Пока нет проблем.
Однако, когда создается второе хранилище он использует тот же объект root state
. Копирование или объединение конфигурации на этом этапе не поможет, потому что скопированный state
также будет иметь свойство customer
. Второй магазин также пытается добавить customer
к root state
. Однако он обнаруживает, что свойство уже существует, путается и регистрирует предупреждение.
В официальной документации есть некоторые сведения об этом:
https://vuex.vuejs.org/guide/modules.html#module -reuse
Самый простой способ исправить это - использовать вместо этого функцию для root state
:
state: () => ({ /* all the state you currently have */ }),
Каждый магазин будет вызывать эту функцию и получать свою собственную копию штат. Это то же самое, что использовать функцию data
для компонента.
Если вам на самом деле не нужно root state
, вы также можете исправить это, просто удалив его полностью. Если state
не указано, Vuex будет каждый раз создавать новый объект root state
.