Возвращаемое значение из мутации 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}