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

use `mapActions` or `mapGetters` with Vuex 4 and Vue 3

有人知道如何在 setup 函数中将 mapStatemapGettersVue 3 一起使用吗? 我知道可以将商店与 useStore 挂钩一起使用,但使用此挂钩我们导入所有商店,同时使用 mapStatemapGetters 我们可以指定 module :

// ...

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

//...

据我所知,它们变平了,所以你不能使用 myModule/myStateVariable,但 myStateVariable 应该可以。

随着 Vuex 进入 RC 版本,这可能会发生变化,但现在如果您尝试两次使用相同的 getter,您会收到此错误

也许是这样的:

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,
        };
    },
};

在 vue 3 和 vuex 4 中,我设法做到了这一点: 假设我们有一家如下所示的商店:

我们的杂货店 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>

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

在 vue3 风格的 SFC 中使用 mapActions 的最佳方式是在 setup() 函数的 return

中使用 mapActions
import { mapActions } from "vuex"
setup() {
  return {
    ...mapActions("myModule", ["doSomething"])
  }
}