Змініть інший стан модуля з одного модуля у Vuex


80

У моєму магазині vuex є два модулі.

var store = new Vuex.Store({
    modules: {
        loading: loading 
        posts: posts
    }
});

У модулі у loadingмене є властивість, savingяку можна встановити trueабо, falseа також мати функцію мутації, названу TOGGLE_SAVINGдля встановлення цієї властивості.

У модулі posts, до і після отримання повідомлень, я хочу змінити властивість saving. Я роблю це за допомогою дзвінка commit('TOGGLE_SAVING')з однієї з дій у postsмодулі.

var getPosts = function (context) {
    contex.commit(TOGGLE_LOADING);
};

Коли він намагався зафіксувати, я отримав наступну помилку в консолі

[vuex] unknown local mutation type: TOGGLE_LOADING, global type: posts/TOGGLE_LOADING 

Як я можу змінити стан в іншому модулі за допомогою commit?

Відповіді:


140

Спробуйте з наступними параметрами, як запропоновано тут ;

commit('TOGGLE_LOADING', null, { root: true })

Якщо ви namespacedвстановили значення true (у Nuxt це за замовчуванням у режимі модулів), це стає:

commit('loading/TOGGLE_LOADING', null, { root: true })

11
Якщо ви використовуєте модулі та простори імен, не забудьте додати простір імен до commit, наприклад, commit('namespace/TOGGLE_SAVING', null, { root: true })інакше це не буде працювати.
мозковий мішок

3
Для мене це не працює. Я просто отримую "невідомий тип мутації".
geoidesic

У мене була подібна потреба, і ваша відповідь вирішила мою проблему. Дякую.
джедай

Дуже дякую! мені це допомогло
заробітна плата -

Чому для цього потрібен root: true, був упевнений, що Nuxt повинен вміти знаходити мутації іншого модуля?
trainoasis

2

Ви можете використовувати дію для здійснення мутації, яка визначена в іншому модулі, тоді ви зміните стан в іншому модулі.

подобається це:

posts: {
  actions: {
    toggleSavingActions(context) {
      // some actions 
      context.commit("TOGGLE_SAVING"); // defined in loading module
    }
  }
}

1
Ось як саме я це зробив. Я також встановив "простір імен: істина" в обох модулях. Але я отримую[vuex] unknown local mutation type: TOGGLE_LOADING, global type: posts/TOGGLE_LOADING
Fizer Khan

1
о так. за замовчуванням дії, мутації та геттери всередині модулів все ще реєструються в глобальному просторі імен. так що ви можете або видалити властивість простору імен, або скористатися комітом ('someMutation', null, {root: true})
Julien

1
У моєму випадку, якщо я використовую namespace: true, мені потрібно зробити наступне:commit('my_module_name/someMutation', null, { root: true })
TitanFighter

Фіксація є синхронною, тоді як дія є асинхронною, тому, якщо ви не використовуєте дію для здійснення мутації.
omarjebari

1

Ви також можете імпортувати магазин, як зазвичай це робить у будь-якому js-файлі, і використовувати його. Наприклад:

// src/state/modules/posts.js

import store from '@/state/store'
...
store.commit('posts/TOGGLE_LOADING')
...

Це працює досить добре, єдиним недоліком є ​​те, що може важко ізолювати тести чи макет.


Видання : Нещодавно я усунув увесь код, використовуючи техніку, яку я згадую через проблеми з тестуванням. Дійсно, ви завжди можете змінити стан інших модулів, дотримуючись рекомендованого способу, як у цьому прикладі. Дуже корисно, якщо ви керуєте авторизацією та профілем у різних модулях.

logout: context => {
  return new Promise((resolve) => {
    // Clear token in all axios requests
    axios.defaults.headers.common['Authorization'] = ''
    // Logout from firebase
    firebase
      .auth()
      .signOut()
      .then(() => {
        // Update state in profile module
        context.commit('profile/SET_USER', null, {
          root: true
        })
        resolve()
      })
      .catch(error => reject(error))
  })
}

додавання null + установка root правда справді працює. Замислювався, навіщо це взагалі потрібно? nuxt повинен мати можливість з'ясувати, де знаходиться зовнішній коміт?
trainoasis
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.