Возвращаемое значение из мутации vuex? (id для вновь созданного объекта)

Я пытаюсь создать объект в одной части хранилища vuex, а затем передать ему id другому объекту, и я не уверен, как правильно это сделать, поскольку мутации не могут возвращать что-либо (в этом case, id).

Два объекта хранилища выглядят следующим образом:

// store/report.js
const state = {
    name: 'Untitled Report',
    subReportIds: []
};

// store/subReport.js
const state = { ... }

И я хотел бы, чтобы это действие создало пустой отчет, затем пустой подчиненный отчет, а затем присваивало идентификатор subreport вновь созданному отчету. (вложенные записи являются независимыми объектами и могут использоваться несколькими отчетами, следовательно, в разных местах)

const actions = {
    createNewReport({ state, commit }) {
        commit(mutationTypes.CREATE_NEW_REPORT)
        // below doesn't work - i can't get return from mutation
        let newSubreportId = commit(mutationTypes.ADD_NEW_SUBREPORT)
        // if this worked, i'd then do something like
        commit(mutationTypes.ADD_SUBREPORT_TO_REPORT, newSubreportId)
    }
};

Как я могу достичь вышеуказанного?

Ответ 1

Таким образом, наилучшим способом для меня было бы отправлять действия вместо совершения мутаций. Если вы посмотрите на методы в источнике Vuex, выполняется только commit (так же как и void), а dispatch возвращает значение, возвращаемое из действия (которое является функцией)

В моих действиях я всегда возвращаю обещание, чтобы составить их, как вы упомянули выше. Вот пример.

fetchSomething ({ commit }) {
  return mockApiGetIds()
    .then(response => {
      commit({
        type: SOME_MUTATION,
        ids: response
      });

      return response;
    });
  },

Ответ 2

Отказ от ответственности: я не знаю, действительно ли это хорошая идея, но, по крайней мере, она, кажется, работает, и мне кажется, что это приятнее, чем необходимость использовать действия и обещания или генерировать идентификатор в действии...

С вашей мутацией вы можете передать аргумент. Чтобы вернуть значение из мутации (например, недавно созданный идентификатор), я записываю его в заполнитель в этом аргументе:

someMutation(state, arg){
   //...
   arg.out = {
      status : "succeed"
   }
}

//...

this.$store.commit('someMutation', arg);
if(arg.out !== "succeed") console.log("ERROR");

Ответ 3

Было бы здорово, если бы он работал, вернувшись из мутации...

Пожалуйста, сообщите об этой проблеме: https://github.com/vuejs/vuex/issues/1437

Это может позволить иметь что-то подобное в будущем:

let myReturn = this.$store.commit('ADD_THING",{"name":"new_thing"});
// 'ADD_THING' adds a thing to an numerically indexed object and then returns the number.
console.log(myReturn); // {"id":42,"datestamp":1541145883085}