无法在模块外访问 Vuex getter

Can't access Vuex getters outside of modules

我无法从组件中的一个 Vuex 模块访问 getters,即使我可以在 Vue Dev Tools 中看到 getter。

我的 store.js 文件:

import Vue from 'vue';
import Vuex from 'vuex';
import subsub from './modules/subsub';

Vue.use(Vuex);
export default new Vuex.Store({
  state: { },
  actions: { },
  mutations: { },
  getters: { },
  modules: {
    subsub,
  },
});

我的 modules/subsub.js 文件:

const state = {
  categories: [{
    name: 'one',
    path: 'two',
    ...
  }, {
    name: 'twocat',
    path: 'two',
    ...
  }],
};

const actions = { };
const mutations = { };
const getters = {
  filterCategories(state) {
    return state.categories;
  },
  filtertwo(state) {
    const filteri = state.categories.filter((catee) => {
      return catee.name === 'twocat';
    });
    return filteri;
  },
};

export default {
  namespaced: true,
  state,
  actions,
  mutations,
  getters,
};

我的组件:

<template>
  <div> {{ filterCategories }} </div>
</template>

<script>    
import { mapGetters } from 'vuex';

export default {
  computed: {
    ...mapGetters([
      'categories',
      'filtertwo',
      'filterCategories',
    ]),
    filtertwo() {
      return this.$store.getters.filtertwo;
    },
    filterCategories() {
      return this.$store.getters.filterCategories;
    },
  },

</script>

所以,我缺少什么?是否有任何其他语法可用于从模块访问 getters?

首先,您没有 categories 的 getter,因此您需要添加一个。

其次,您的 subsub 模块的 namespaced 属性 设置为 true。这意味着您需要向 mapGetter 助手提供模块名称:

...mapGetters('subsub', [
  'categories',
  'filtertwo',
  'filterCategories',
]),

第三,mapGetters 函数为您创建 filtertwofilterCategories 计算属性。但是,您正在手动重新定义它们,返回对 $store.getters 的显式引用。但是,您没有正确引用命名空间,因此它们返回 undefined。要么去掉这些计算属性,要么正确引用命名空间:

filtertwo() {
  return this.$store.getters['subsub/filtertwo'];
},
filterCategories() {
  return this.$store.getters['subsub/filterCategories'];
},

我找到了解决方案,感谢@thanksd 的提示

通过使用上面的示例,其中 namespaced 设置为 true,我必须将以下内容添加到组件中

filterCategories() {
      return this.$store.getters['subsub/filterCategories'];
    },

否则,如果我不想添加 subsub,我可以将命名空间设置为 false。 这个问题花了我一段时间才弄清楚。 干杯