I have two modules, activities
and alerts
. When an activity
is added, I want to dispatch an alert with the namespaced action alerts/SHOW
.
This works when I call the action directly from a ponent (using the createNamespacedHelpers
from Vuex, with a namespace of alerts
).
But when I dispatch the action from another namespaced module, I get the following error message:
[vuex] unknown action type: SHOW
I'm not sure what I've done incorrectly.
I am calling the ADD
action with another createNamespacedHelpers
for the activities
namespace. I'm also using the { root: true }
option, indicated in the Vuex module documentation.
AddActivityButton.vue
<template>
<button @click="addActivity(activity)"
type="button"
:disabled="activityCount >= maxActivities"
class="btn btn-secondary">{{ activity.name }}
</button>
</template>
<script>
import { createNamespacedHelpers } from "vuex";
import { ADD } from "@/store/modules/activities";
const { mapActions, mapGetters, mapState } = createNamespacedHelpers(
"activities"
);
export default {
methods: {
...mapActions({
addActivity: ADD
})
},
puted: {
...mapState(["maxActivities"]),
...mapGetters(["activityCount"])
},
props: {
activity: {
type: Object,
required: true
}
}
};
</script>
activities.js
import uuid from "uuid/v4";
import { SHOW as SHOW_ALERT } from "@/store/modules/alerts";
export const ADD = "ADD";
export const RESET = "RESET";
export const MAX_ACTIVITIES = 15;
const state = {
items: [
{ id: 1, name: "A" },
{ id: 2, name: "B" },
{ id: 3, name: "C" },
{ id: 4, name: "D" },
{ id: 5, name: "E" },
{ id: 6, name: "F" }
],
activities: [],
maxActivities: MAX_ACTIVITIES
};
const getters = {
activityCount(state) {
return state.activities.length;
}
};
const mutations = {
[ADD](state, activity) {
state.activities = [...state.activities, { ...activity, id: uuid() }];
},
[RESET](state) {
state.activities = [];
}
};
const actions = {
[ADD]({ dispatch, mit, getters }, activity) {
if (getters.activityCount >= MAX_ACTIVITIES) {
return null;
}
if (getters.activityCount > 1) {
dispatch(SHOW_ALERT, null, { root: true }); // This is the problematic line.
}
mit(ADD, activity);
}
};
export default {
namespaced: true,
state,
mutations,
actions,
getters
};
alerts.js
export const SHOW = "SHOW";
const state = {
show: false
};
const mutations = {
[SHOW](state) {
state.show = true;
}
};
const actions = {
[SHOW]({ mit }) {
mit(SHOW);
}
};
export default {
namespaced: true,
state,
mutations,
actions
};
store.js
import Vue from "vue";
import Vuex from "vuex";
import activities from "./modules/activities";
import alerts from "./modules/alerts";
Vue.use(Vuex);
export default new Vuex.Store({
modules: {
activities,
alerts
}
});
I have two modules, activities
and alerts
. When an activity
is added, I want to dispatch an alert with the namespaced action alerts/SHOW
.
This works when I call the action directly from a ponent (using the createNamespacedHelpers
from Vuex, with a namespace of alerts
).
But when I dispatch the action from another namespaced module, I get the following error message:
[vuex] unknown action type: SHOW
I'm not sure what I've done incorrectly.
I am calling the ADD
action with another createNamespacedHelpers
for the activities
namespace. I'm also using the { root: true }
option, indicated in the Vuex module documentation.
AddActivityButton.vue
<template>
<button @click="addActivity(activity)"
type="button"
:disabled="activityCount >= maxActivities"
class="btn btn-secondary">{{ activity.name }}
</button>
</template>
<script>
import { createNamespacedHelpers } from "vuex";
import { ADD } from "@/store/modules/activities";
const { mapActions, mapGetters, mapState } = createNamespacedHelpers(
"activities"
);
export default {
methods: {
...mapActions({
addActivity: ADD
})
},
puted: {
...mapState(["maxActivities"]),
...mapGetters(["activityCount"])
},
props: {
activity: {
type: Object,
required: true
}
}
};
</script>
activities.js
import uuid from "uuid/v4";
import { SHOW as SHOW_ALERT } from "@/store/modules/alerts";
export const ADD = "ADD";
export const RESET = "RESET";
export const MAX_ACTIVITIES = 15;
const state = {
items: [
{ id: 1, name: "A" },
{ id: 2, name: "B" },
{ id: 3, name: "C" },
{ id: 4, name: "D" },
{ id: 5, name: "E" },
{ id: 6, name: "F" }
],
activities: [],
maxActivities: MAX_ACTIVITIES
};
const getters = {
activityCount(state) {
return state.activities.length;
}
};
const mutations = {
[ADD](state, activity) {
state.activities = [...state.activities, { ...activity, id: uuid() }];
},
[RESET](state) {
state.activities = [];
}
};
const actions = {
[ADD]({ dispatch, mit, getters }, activity) {
if (getters.activityCount >= MAX_ACTIVITIES) {
return null;
}
if (getters.activityCount > 1) {
dispatch(SHOW_ALERT, null, { root: true }); // This is the problematic line.
}
mit(ADD, activity);
}
};
export default {
namespaced: true,
state,
mutations,
actions,
getters
};
alerts.js
export const SHOW = "SHOW";
const state = {
show: false
};
const mutations = {
[SHOW](state) {
state.show = true;
}
};
const actions = {
[SHOW]({ mit }) {
mit(SHOW);
}
};
export default {
namespaced: true,
state,
mutations,
actions
};
store.js
import Vue from "vue";
import Vuex from "vuex";
import activities from "./modules/activities";
import alerts from "./modules/alerts";
Vue.use(Vuex);
export default new Vuex.Store({
modules: {
activities,
alerts
}
});
Share
Improve this question
edited Apr 23, 2018 at 13:55
acdcjunior
136k37 gold badges338 silver badges310 bronze badges
asked Apr 23, 2018 at 0:40
andrewhlandrewhl
1,0121 gold badge12 silver badges31 bronze badges
2 Answers
Reset to default 14You have to namespace the action when dispatching:
dispatch('alerts/' + SHOW_ALERT, null, { root: true });
Using template literals should be:
dispatch(`alerts/${SHOW_ALERT}`, null, { root: true });
This is in case you want to dispatch an action of a module store from a ponent
this.$store.dispatch("alerts/SHOW", data);