繁体   English   中英

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

[英]use `mapActions` or `mapGetters` with Vuex 4 and Vue 3

有人知道如何在setup function 中将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,
  
}

每个模块中的吸气剂都是这样的:

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"])
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM