无法从单独的模块调度命名空间操作:[vuex] 未知操作类型



我有两个模块,activitiesalerts。添加activity时,我想使用命名空间操作alerts/SHOW调度警报。

当我直接从组件调用操作时,这有效(使用 Vuex 中的createNamespacedHelpers,命名空间为 alerts (。

但是当我从另一个命名空间模块调度操作时,我收到以下错误消息:

[vuex] unknown action type: SHOW

不确定我做错了什么。

我正在使用另一个createNamespacedHelpers来调用ADD操作,用于activities命名空间。我也在使用 Vuex 模块文档中指示的 { root: true } 选项。

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
    })
  },
  computed: {
    ...mapState(["maxActivities"]),
    ...mapGetters(["activityCount"])
  },
  props: {
    activity: {
      type: Object,
      required: true
    }
  }
};
</script>

活动.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, commit, getters }, activity) {
    if (getters.activityCount >= MAX_ACTIVITIES) {
      return null;
    }
    if (getters.activityCount > 1) {
      dispatch(SHOW_ALERT, null, { root: true }); // This is the problematic line.
    }
    commit(ADD, activity);
  }
};
export default {
  namespaced: true,
  state,
  mutations,
  actions,
  getters
};

警报.js

export const SHOW = "SHOW";
const state = {
  show: false
};
const mutations = {
  [SHOW](state) {
    state.show = true;
  }
};
const actions = {
  [SHOW]({ commit }) {
    commit(SHOW);
  }
};
export default {
  namespaced: true,
  state,
  mutations,
  actions
};

商店.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
  }
});

调度时,您必须为操作设置命名空间:

dispatch('alerts/' + SHOW_ALERT, null, { root: true });

使用模板文本应为:

dispatch(`alerts/${SHOW_ALERT}`, null, { root: true });
这是

为了从组件调度模块存储的操作

this.$store.dispatch("alerts/SHOW", data);

最新更新