我有一个 vuex 商店,如下所示:
import spreeApi from '../../gateways/spree-api'
// initial state
const state = {
products: [],
categories: []
}
// mutations
const mutations = {
SET_PRODUCTS: (state, response) => {
state.products = response.data.products
commit('SET_CATEGORIES')
},
SET_CATEGORIES: (state) => {
state.categories = state.products.map(function(product) { return product.category})
}
}
const actions = {
FETCH_PRODUCTS: (state, filters) => {
return spreeApi.get('products').then(response => state.commit('SET_PRODUCTS', response))
}
}
export default {
state,
mutations,
actions
}
我想调用 mutation: SET_CATEGORIES
from mutation: SET_PRODUCTS
,但这给了我错误:
projectFilter.js:22 Uncaught (in promise) ReferenceError: commit is not defined(…)
什么应该是正确的方法来做到这一点。我试过 store.commit
和 this.commit
,但这些也给出了类似的错误。
原文由 Saurabh 发布,翻译遵循 CC BY-SA 4.0 许可协议
当你已经在做一个突变时,没有办法
commit
另一个突变。突变是改变状态的同步调用。在一个突变中,您将无法提交另一个突变。这是 Vuex 的 API 参考: https ://vuex.vuejs.org/en/api.html
如您所见,突变处理程序仅接收
state
和payload
,仅此而已。因此,您得到commit
为undefined
。在上述情况下,您可以将 PRODUCT 和 CATEGORIES 设置为与单个提交相同的突变处理程序的一部分。如果以下代码有效,您可以尝试:
编辑: 请参阅 Daniel S. Deboer 提供的以下答案。正确的方法是从一个动作中提交两个突变,如他的 回答 中所述。