在Vuex 4和Vue 3中使用`mapActions`或`mapGetters`

时间:2020-08-02 13:46:11

标签: javascript vue.js vuex vuejs3

任何人都知道如何在mapState函数中将mapGettersVue 3setup一起使用吗? 我知道可以通过useStore钩子使用商店,但是通过此钩子,我们可以导入所有商店,而通过mapStatemapGetters可以指定module: / p>

// ...

computed: {
   ...mapGetters('myModule', [
      'myStateVariable'
   ]
) 

//...

3 个答案:

答案 0 :(得分:3)

据我所知,它们已经变平,因此您不能使用myModule/myStateVariable,但是myStateVariable应该可以使用。

随着Vuex进入RC版本,这可能会有所变化,但是现在如果您尝试两次使用相同的吸气剂,则会出现此错误

enter image description here

答案 1 :(得分:1)

也许是这样的:

import { computed }  from 'vue';
import { useStore } from 'vuex';

const module = 'myModule';

export default {
    setup() {
        const store = useStore();

        return {
            // getter
            one: computed(() => store.getters[`${module}/myStateVariable`],

            // state
            two: computed(() => store.state[module].myStateVariable,
        };
    },
};

答案 2 :(得分:0)

使用 vue 3 和 vuex 4 我设法这样做: 假设我们有如下所示的商店:

enter image description here

我们的一般商店 index.js(底部的那个)应该是这样的:

 import { createStore,     createLogger   } from 'vuex';
 import module1 from '@/store/module1';
 import module2 from '@/store/module2';


 export default createStore({

 modules: {
    module1: module1,
    module2: module2,
 },
  plugins: process.env.NODE_ENV !== 'production'
  ? [createLogger()]
  : []
})

而每个模块都有这样的 index.js:

import * as getters from './getters'
import * as actions from './actions'
import mutations from './mutations'


const state = {
  postId: 10111,
}

export default {
  namespaced: true,

  state,
  getters,
  actions,
  mutations,
  
}

每个模块中的 getter 都是这样的:

export const getPostId = state => {
   return state.postId 
}

最后在一个组件中,您可以像这样访问 getter:

<template>
 <div>
   <div class="major_container">
     <p>{{ postIdFromModule1 }}</p>
     <p>{{ postIdFromModule2 }}</p>
  </div>
</div>
</template>
<script> 
import { computed } from "vue";
import { useStore } from "vuex";

export default {
 setup() {
   const store = useStore();

   const postIdFromModule1 = computed(() => store.getters["module1/getPostId"]);
   const postIdFromModule2 = computed(() => store.getters["module2/getPostId"]);

   return {
     postIdFromModule1,
     postIdFromModule2,
   };
  },
};
</script>

太好了,现在您可以使用命名空间的模块了!