在每次操作Vuex之前调用突变

xen*_*ics 3 ajax action vue.js vuex

Vuex允许我们编写插件,无论何时提交突变,插件都会执行某些操作。有什么办法可以实现类似的功能,但是要有动作?

我注意到您可以像vuexfire库那样“增强”操作,这是最好的方法吗?

我的目标是找到某种方式来跟踪当前是否挂起多少个ajax调用,并根据该数字自动显示某种动画。

编辑:澄清一下,我想知道是否有一种方法可以仅使用Vuex来实现,而不必引入其他库中。

tha*_*ksd 5

从Vuex v2.5开始,您可以调用subscribeAction注册回调函数,该回调函数将在商店中的每个分派操作之后被调用。

回调将接收一个action描述符(具有typepayload属性的对象)作为其第一个参数,并将商店的state作为第二个参数。

有关此文档的信息,请参见Vuex API参考》页面

例如:

const store = new Vuex.Store({
  plugins: [(store) => {
    store.subscribeAction((action, state) => {
      console.log("Action Type: ", action.type)
      console.log("Action Payload: ", action.payload)
      console.log("Current State: ", state)
    })
  }],
  state: {
    foo: 1
  },
  mutations: {
    INCREASE_FOO(state) {
      state.foo++;
    },
  },
  actions: {
    increaseFoo({ commit }) {
      commit('INCREASE_FOO');
    }
  }
});

new Vue({
  el: '#app',
  store,
  methods: {
    onClick() {
      this.$store.dispatch('increaseFoo');
    }
  }
})
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.2/vue.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vuex/3.0.1/vuex.min.js"></script>

<div id="app">
  Foo state: {{ $store.state.foo }}
  <button @click="onClick">Increase Foo</button>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 如果我需要在每个操作之前和之后运行一些东西怎么办?例如将加载器状态设置为活动或非活动状态 (3认同)