«

Vue3怎么使用Vuex的mapState与mapGetters

时间:2024-7-30 09:27     作者:韩俊     分类: Javascript


今天小编给大家分享一下Vue3怎么使用Vuex的mapState与mapGetters的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

1.如何使用?

Vue
中我们可以通过点语法很容易的获取到
Vuex
state
的值,但当
state
数据比较多时,这样很不方便,可以借助mapState映射来简化;由于目前
vuex
的官网中提供的是
Vue2
的demo,下面说一下在Vue3中如何使用
mapState

假设:在
Vuex
中的
state
具有
token
username
属性,现在要通过
mapState
取得
token
username

Vue3+JS

<script setup>
import { useStore, mapState } from "vuex";
import { computed } from "vue";
const store = useStore();
const mappers = mapState(["token", "username"]);
const mapData = {}
Object.keys(mappers).forEach((item) => {
    mapData[item] = computed(mappers[item].bind({ $store:store }));
});
console.log(mapData)
// ref类型的mapData对象:{token: ComputedRefImpl, username:ComputedRefImpl}
</script>

Vue3+TS(ps:建议直接使用

pinia
替代
Vuex

<script setup lang="ts">
import { useStore, mapState } from "vuex";
import { computed } from "vue";
import type { Ref } from 'vue'
type mappersType = {
    token:() => any,
    username:() => any,
    [propName:string]:any
}
type mapDataType = {
    token:Ref,
    username:Ref,
    [propName:string]:Ref
}
const store = useStore();
const mappers:mappersType = mapState(["token", "username"]) as mappersType
const mapData:mapDataType = {} as mapDataType;
Object.keys(mappers).forEach((item) => {
    mapData[item] = computed(mappers[item].bind({ $store:store }));
});
console.log(mapData)
// ref类型的mapData对象:{token: ComputedRefImpl, username:ComputedRefImpl}
</script>

2.代码封装

storeMap.js

import { computed } from 'vue';
/**
* 映射store对应的属性(mapState|mapGetters)
* @param $store useStore()
* @param mappers mapState([])|mapGetters([])
* @returns {[propName:string]: ComputedRefImpl,...}
*/
function getStoreMap($store, mappers) {
    const mapData = {}
    Object.keys(mappers).forEach((item) => {
    mapData[item] = computed(mappers[item].bind({ $store })).value;
    });
    return mapData;
}
export { getStoreMap }

使用

<script setup>
import { useStore, mapState, mapGetters } from "vuex";
import { getStoreMap } from './storeMap'
const store = useStore();
const mappers = mapState(["token", "username"]);
// const mappers = mapGetters(["getToken", "getUsername"]); //也可以获取mapGetters
const mapData = getStoreMap(store, mappers)
console.log(mapData) // 包含state或getters属性的ref类型的对象
</script>

3.解题思路

以下是我的一种比较取巧的解题思路,可酌情参考

延用上面的例子
首先,我们先导入

mapState
,并创建一个空的
mapState
对象,将鼠标移动至
mapState()
上查看

可以看到

mapState
接收的是一个字符串类型的数组,返回的是一个属性为
string
类型,值为
Computed
类型的对象,可推导这里
mapState
接收的应是
["token", "username"]

const mappers = mapState(["token", "username"])
;

再次将鼠标移动至mappers上,查看mappers类型

可以看到mappers是一个对象;

console.log(mappers.token)
查看属性token属性的值是什么

可以看到

mappers.token
是一个方法;
通过
console.log(mappers.token())
调用输出这个方法,发现浏览器的控制台报错了

错误提示

Cannot read properties of undefined (reading 'state')
,点击上图蓝色箭头处查看报错的源代码

可以看出整个截图部分是mapState对象,我们执行

mappers.token()
是图中标红的区域,再结合报错信息可知报错是因为这里的
this
对象没有
$store
属性。
由于this中只有
$store
被使用,并没有用到
this
的其他属性,则可以通过
bind
方式,手动传一个具有
store
属性的
this
对象进去,并输出调用


这时我们可以看到

token
的值已经在浏览器被输出了,然后将
bind()
后的方法放到
computed
里执行即可得到
Ref
类型的
token
对象。

标签: javascript vue

热门推荐