在 Vuex 4 和 Vue 3 中使用 `mapActions` 或 `mapGetters`
use `mapActions` or `mapGetters` with Vuex 4 and Vue 3
有人知道如何在 setup
函数中将 mapState
或 mapGetters
与 Vue 3
一起使用吗?
我知道可以将商店与 useStore
挂钩一起使用,但使用此挂钩我们导入所有商店,同时使用 mapState
或 mapGetters
我们可以指定 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"])
}
}
有人知道如何在 setup
函数中将 mapState
或 mapGetters
与 Vue 3
一起使用吗?
我知道可以将商店与 useStore
挂钩一起使用,但使用此挂钩我们导入所有商店,同时使用 mapState
或 mapGetters
我们可以指定 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"])
}
}