Vue.js [vuex]如何从突变中调度?

Ste*_*n-v 19 javascript vue.js vuex vuejs2

我有一个我想要应用于json对象的过滤器列表.

我的突变看起来像这样:

const mutations = {
    setStars(state, payload) {
        state.stars = payload;
        this.dispatch('filter');
    },

    setReviews(state, payload) {
        state.reviews = payload;
        this.dispatch('filter');
    }
};
Run Code Online (Sandbox Code Playgroud)

由于过滤器如何工作,我需要再次重新应用它们,因为我不能简单地保持向下过滤列表,因为当用户取消选择过滤器选项时,这会让我遇到麻烦.

因此,当对星星过滤器或评论过滤器(用户正在过滤)进行变异时,我需要调用运行所有过滤器的函数.

这里最简单的选择是什么?我可以添加某种帮助函数,还是可以设置一个调用实际过滤结果的突变的动作?

Mat*_*att 30

突变不能发送进一步的动作,但动作可以发送其他动作.因此,一种选择是让一个动作提交变异,然后触发过滤器动作.

如果可能的话,另一个选择是让所有过滤器getters自然地对数据变化做出反应,就像计算属性一样.

调用其他操作的操作示例:

// store.js
export default {
  mutations: {
    setReviews(state, payload) {
      state.reviews = payload
    }
  }

  actions: {
    filter() {
      // ...
    }

    setReviews({ dispatch, commit }, payload) {
      commit('setReviews', payload)
      dispatch('filter');
    }
  }
}


// Component.vue
import { mapActions } from 'vuex';

export default {
  methods: {
    ...mapActions(['setReviews']),
    foo() {
      this.setReviews(...)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • @Stephan-v 我实际上会让组件调度一个 `setReviews` 操作_而不是一个突变。_action_ 既可以提交 `setReviews` 突变,也可以触发 `filter` 操作。 (2认同)

gum*_*lym 5

实际上,您可以使用this. 例如:

const actions = {
  myAction({ dispatch, commit }, { param }) {
  // Do stuff in my action
  }
}

const mutations = {
  myMutation(state, value) {

    state.myvalue = value;
    this.dispatch('myModule/myAction', { param: 'doSomething' });
  },
}
Run Code Online (Sandbox Code Playgroud)

  • 我强烈劝阻任何人不要这样做。这在很大程度上是一种反模式。突变非常明显地旨在成为同步/阻塞代码,而操作则不是。这本质上破坏了突变的严格作用,允许它们做超出其应做的事情(即,采用状态的某些属性并使用其以某种方式收到的输入对其进行修改)。 (8认同)