Vue3使用Vuex之mapState与mapGetters详解

 更新时间:2023年03月20日 14:06:09   作者:要吃早餐lhy  
这篇文章主要为大家介绍了Vue3使用Vuex之mapState与mapGetters详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

1.如何使用?

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

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对象。

以上就是Vue3使用Vuex之mapState与mapGetters详解的详细内容,更多关于Vue3 Vuex mapState mapGetters的资料请关注脚本之家其它相关文章!

相关文章

  • VUE + UEditor 单图片跨域上传功能的实现方法

    VUE + UEditor 单图片跨域上传功能的实现方法

    这篇文章主要介绍了VUE + UEditor 单图片跨域上传功能的实现方法,需要的朋友参考下
    2018-02-02
  • vue3生命周期原理与生命周期函数简单应用实例分析

    vue3生命周期原理与生命周期函数简单应用实例分析

    这篇文章主要介绍了vue3生命周期原理与生命周期函数,结合简单实例形式分析了vue3的生命周期基本原理、以及各个阶段的生命周期钩子函数功能、使用技巧与相关注意事项,需要的朋友可以参考下
    2023-04-04
  • vue.js开发实现全局调用的MessageBox组件实例代码

    vue.js开发实现全局调用的MessageBox组件实例代码

    最近学习了Vue.js,感觉组件这个地方知识点挺多的,而且很重要,所以决定记录下,下面这篇文章主要给大家介绍了关于利用vue.js开发实现全局调用的MessageBox组件的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-11-11
  • vue中使用iconfont图标的过程

    vue中使用iconfont图标的过程

    这篇文章主要介绍了vue中使用iconfont图标的过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 关于vue-router的那些事儿

    关于vue-router的那些事儿

    要学习vue-router就要先知道这里的路由是什么?为什么我们不能像原来一样直接用标签编写链接哪?vue-router如何使用?常见路由操作有哪些?等等这些问题,就是本篇要探讨的主要问题,感兴趣的朋友跟随脚本之家小编一起学习吧
    2018-05-05
  • ant-design-vue Table pagination分页实现全过程

    ant-design-vue Table pagination分页实现全过程

    这篇文章主要介绍了ant-design-vue Table pagination分页实现全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • vue实现简单表格组件实例详解

    vue实现简单表格组件实例详解

    vue的核心思想就是组件,什么是组件呢?按照我的理解组件就是装配页面的零件,vue三大核心组件 路由 状态管理,路由控制页面的渲染,页面由组件组成,数据有vuex进行管理和改变。下面我会以一个简单的案例来说
    2017-04-04
  • Vue项目中如何使用Axios封装http请求详解

    Vue项目中如何使用Axios封装http请求详解

    这篇文章主要给大家介绍了关于Vue项目中如何使用Axios封装http请求的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Vue具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-10-10
  • 解决Vue-Router升级导致的Uncaught (in promise)问题

    解决Vue-Router升级导致的Uncaught (in promise)问题

    这篇文章主要介绍了解决Vue-Router升级导致的Uncaught (in promise)问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • 组件中多个el-upload存在导致上传图片失效的问题及解决

    组件中多个el-upload存在导致上传图片失效的问题及解决

    这篇文章主要介绍了组件中多个el-upload存在导致上传图片失效的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03

最新评论