无法在模块之外访问 Vuex getter

Posted

技术标签:

【中文标题】无法在模块之外访问 Vuex getter【英文标题】:Can't access Vuex getters outside of modules 【发布时间】:2017-10-01 16:36:52 【问题描述】:

我无法从组件中的一个 Vuex 模块访问 getter,即使我可以在 Vue 开发工具中看到 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>

那么,我错过了什么?有没有其他语法可以从模块中访问 getter?

【问题讨论】:

您没有在控制台中收到任何错误?实例化Vue的时候是不是在store里路过? 我在控制台中没有收到任何错误。当我实例化 Vue 时,你的意思是在商店中传递什么? ..顺便说一句,我尝试使用 @click 事件作为 getter 并且甚至没有工作 无论你在哪里实例化主应用程序 Vue 组件(可能是 main.js)。您应该导入 vuex 存储并将其包含在通过 new Vue(...) 传递的配置对象中 /* eslint-disable no-new */ new Vue( el: '#app', router, store, template: '', components: App, Icon , ); 【参考方案1】:

首先,您没有 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'];
,

【讨论】:

在我的 vuex 开发工具中,我看到了这个: subsub/filterCategories:Array[2] ' subsub/filterCategories:Array[2] 0:Object 1:Object subsub/filtertwo:Array[1] 0:对象' 我刚刚添加了 subsub,因为我的命名空间属性设置为 true(为此我不知道),但我仍然没有将任何数据输入到我的组件中,并且在使用 Vue Dev 工具时进入 Vuex 选项卡我看到了吸气剂,但是一旦我在组件选项卡中进入我的路由器视图,我得到: filterCategories:undefined filtertwo:undefined @Marketingexpert,我没有注意到您正在重新定义 filterCategoriesfilterTwo 计算属性。这就是为什么你仍然收到undefined。您应该使用mapGetters 或手动创建计算属性,但不能同时使用两者。请参阅我的更新答案。 您更新的问题现在对我来说很有意义;)我非常感谢您的时间和帮助。学到了很多 @Marketingexpert 很高兴为您提供帮助【参考方案2】:

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

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

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

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

【讨论】:

以上是关于无法在模块之外访问 Vuex getter的主要内容,如果未能解决你的问题,请参考以下文章

无法通过getter vuex vuejs访问状态

在 Vuex getter 中访问 rootState

在模板中时无法访问 Vue 商店中的 getter,因为它“不是函数”

访问 js 文件中的 vuex 存储

Vuex 从 getter 访问 this.$store

从模板访问 vue vuex 命名空间的 getter