访问 Vuex 突变中的 getter

在 Vuex 存储突变中,是否可以访问 getter。

new Vuex.Store({
state: {
question: 'Is it possible to access getters within a Vuex mutation?'
},
mutations: {
askQuestion(state) {
// TODO: Get question from getter here
let question = '';


if (question) {
// ...
}
}
},
getters: {
getQuestion: (state) => {
return state.question;
}
}
});

当然,这个示例没有多大意义,因为我可以直接访问突变中的 state对象上的 question属性,但是我希望您明白我正在尝试做什么。也就是说,有条件地操纵状态。

在变异中,thisundefinedstate参数提供对 state对象的访问,而不是存储的其余部分。

关于突变的文档没有提到这方面的任何内容。

我猜这是不可能的,除非我漏掉了什么?我猜想另一种方法是要么在存储之外执行这种逻辑(导致代码复制) ,要么实现执行这种逻辑的操作,因为操作可以访问整个存储上下文。我很确定这是一个更好的方法,那就是让突变集中在它实际上应该做的事情上,使状态发生突变。这可能是我最终要做的,但我只是好奇,如果访问一个突变中的 getter 是可能的吗?

61684 次浏览

Vuex 存储变异方法不提供对 getter 的直接访问。

这可能是不好的做法 * ,但是你可以传递一个对 getters的引用,如下所示:

actions: {
fooAction({commit, getters}, data) {
commit('FOO_MUTATION', {data, getters})
}
},
mutations: {
FOO_MUTATION(state, {data, getters}) {
console.log(getters);
}
}

* 最佳做法是尽可能简单地保持突变,只直接影响 Vuex 状态。这使得推断状态变化更加容易,而不必考虑任何副作用。现在,如果您遵循最佳实践来处理 vuex getter,那么它们首先应该不会产生任何副作用。但是,任何需要引用 getter 的逻辑都可以在操作中运行,该操作具有对 getter 和 state 的读访问权限。然后逻辑的输出可以传递给突变。所以,你把 可以getters对象的引用传递给突变体,但是没有必要这样做,这会把水搅浑。

如果你把你的 getter 和变异放在不同的模块中,你可以导入变异中的 getter,然后这样做:

import getters from './getters'


askQuestion(state) {
const question = getters.getQuestion(state)
// etc
}

如果将 Store 声明为表达式,还可以在变异中引用 Store 对象,如下所示:

const Store = new Vuex.Store({
state: {...},
getters: {...},
mutations: {
myMutation(state, payload) {
//use the getter
Store.getters.getter
}
}
});


另一种解决方案是导入现有存储。假设您正在使用模块,并且您的模块名为 foo,您的 mutator 文件将类似于下面的 store/foo/mutations.js:

import index from '../index'
export const askQuestion = (state, obj) => {
let store = index()
let getQuestion = store.getters['foo/getQuestion']
}

我不是说这是最好的练习,但它似乎是工作。

如果有人正在寻找一个简单的解决方案,@bbugh 写出了一种绕过这个 给你的方法,只需让突变和 getter 使用相同的函数:

function is_product_in_cart (state, product) {
return state.cart.products.indexOf(product) > -1
}


export default {
mutations: {
add_product_to_cart: function (state, product) {
if (is_product_in_cart(state, product)) {
return
}
state.cart.products.push(product)
}
},


getters: {
is_product_in_cart: (state) => (product) => is_product_in_cart(state, product)
}
}

烦人四

const state = () => ({
some_state: 1
})


const getters = {
some_getter: state => state.some_state + 1
}


const mutations = {
GET_GETTER(state){
return getters.some_getter(state)
}
}

在你身体的某个部分

store.commit('GET_GETTER') // output: 2