Join my Vue.js course while it's free 👀

Call Vuex action from another action

April 9, 2022  ‐ 2 min read

Calling a vuex action from another action requires the use of a special function: dispatch.

The dispatch function is available from the context that is passed as a first argument to your Vuex actions. You can call another Vuex action by passing the name of that action as a string as the first argument of dispatch:

const store = new Vuex.Store({
  actions: {
    walk(context) {
      context.dispatch("goForward");
    },
    goForward(context) {
      //
    },
  },
});

Or you can use JavaScript Object Destructuring to access dispatch directly.

const store = new Vuex.Store({
  actions: {
    walk({ dispatch }) {
      dispatch("goForward");
    },
    goForward(context) {
      //
    },
  },
});

Dispatch with arguments

Arguments to the Vuex action you wish to call can be passed as second argument to dispatch:

const store = new Vuex.Store({
  actions: {
    walk({ dispatch }) {
      const speed = "4km/h";
      dispatch("goForward", speed);
    },
    goForward(context, payload) {
      // The value of the payload is: '4km/h'
    },
  },
});

All that the arguments that you wish to pass to another action should be in the payload. Vuex doesn't allow you to add more arguments, instead you can wrap the other data in a JavaScript object.

Dispatch in other module

If you are working with Vuex modules, you may at some point want to call an action in another module. In that case you need to pass { root: true } as a 3rd argument to dispatch. Order matters here, so even if the Vuex action you wish to call doesn't require a payload you still need to pass something (an empty object or null will do).

const store = new Vuex.Store({
  actions: {
    walk({ dispatch }) {
      const speed = "4km/h";
      dispatch("movement/goForward", speed, { root: true });
    },
  },
});