vue.js - 在 Vuex 突变中访问 getter

标签 vue.js vuejs2 vuex

在 Vuex store mutation 中,是否可以访问 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 属性,但我希望你明白我想做什么。即有条件地操纵状态。

在突变中,thisundefined 并且 state 参数提供对 state 对象的访问,并且不是商店的其他部分。

The documentation on mutations没有提到任何关于这样做的事情。

我猜这是不可能的,除非我错过了什么?我想另一种方法是在商店外执行此逻辑(导致代码重复)或实现执行此操作的操作,因为操作可以访问整个商店上下文。我很确定这是一种更好的方法,即让突变专注于它实际应该做的事情;改变状态。这可能是我最终会做的,但我只是好奇是否有可能在突变中访问 setter/getter ?

最佳答案

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 和状态的读取访问权限。然后该逻辑的输出可以传递给突变。因此,您可以将对 getters 对象的引用传递给突变,但没有必要这样做,这会把事情搞得一团糟。

关于vue.js - 在 Vuex 突变中访问 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43258793/

相关文章:

routes - vuejs-framework7 工具栏路由

vue.js - 注销不会从本地存储或状态中清除 token

vue.js - Vuex 嵌套对象

vue.js - 如何在 vuex 中查看动态变量的属性?

vue.js - 在初始路由之前执行 Vuex 操作

javascript - 样式化 bootstrap-vue 下拉按钮

vue.js - 在 VueJS 中按属性排序对象列表

javascript - vuejs : how to unit test main. ts

vue.js - 观察 Vue.js 在组件内存储 bool 值变化

class - 单击时如何更改特定(此)按钮类。使用 Vue.js 2.0