第四十三节:Vuex状态管理:辅助函数mapState与mapGetters

前言:

Vuex中获取数据的辅助函数有两个:mapStatemapGetters

  1. mapState用于将state中的数据映射到组件的计算属性中
  2. mapGetters用于将getter中的计算属性映射到组件的计算属性空中


1. 辅助函数说明:

  1. 之前的使用vue的方法并不是特别好.获取数据需要通过$store找到state对象,在获取数据,
  2. 操作getter,mutation,action也是如此,就会给使用带来不便
  3. vuex提供了一些辅助函数,帮助我们快速获取数据, 操作mutation,action函数


2. mapState

mapState是获取数据的辅助函数

2.1 获取数据说明
  1. 之前在使用vuex数据的时候我们都是在模板Mustache语法中直接获取数据,

  2. 这样的操作并不是特别友好,每一次都需要重新获取数据

  3. 因此比较常用的做法是将vuex中的数据获取后保存在组件的计算属性中

  4. 这样如果在组件中多次使用数据,就可以使用计算属性的缓存


之前获取数据示例代码

<div class="count">数字: {{ $store.state.count }}</div>


将数据保存在计算属性中,

示例代码如下

<template>
    <div class="home">
        <!-- 此时只需要使用计算看属性中的数据就可以了 -->
        <div class="count">数字: {{ count }}</div>
    </div>
</template>

<script>
    export default {
        name: 'Home',
        data(){

        },
        computed:{
            count(){
                return this.$store.state.count 
            }
        },
        methods:{

        }
    }
</script>


2.2 计算属性中的问题

说明:

  1. 如果在一个组件中需要使用很多vuex中的状态
  2. 那么我们就需要在组件中定义所有的需要使用数据对应的计算属性
  3. 这样反而变的繁琐

示例代码

export default {
    name: 'Home',
    data(){
        return {
            // count: 0
        }
    },
    computed:{
        count(){
            return this.$store.state.count 
        },
        user(){
            return this.$store.state.user
        },
        // ...
    },
    methods:{
        
    }
}


2.3 使用mapState

为了解决组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余的问题.

vuex提供了mapState辅助函数帮助我们自动生成计算属性

注意:

使用mapState有不同使用方式

2.3.1 vuex中的状态
let store = new Vuex.Store({
    state:{
        count:0,
        user:{
            name:"张三",
            age:20
        },
        fruits:[{
            name:"苹果",
            price: 22
        },{
            name:"梨子",
            price: 25
        },{
            name:"西瓜",
            price: 16
        },{
            name:"香蕉",
            price: 18
        }]
    },
    // ....

})


2.3.2 组件中计算属性名和vuex中的状态名不一致

说明:

  1. 例如组件中需要获取vuexcount数据的内容,

  2. 但是在组件中有可能也有一个名为count的数据

  3. 因此在获取vuex中的count时,组件的计算属性就不能在为count了,

  4. 故而计算属性的名和vuex状态名不一致

示例代码:

<template>
<div class="home">
    <div class="count">vuex中数据: {{ number }}</div>
    <div >组件自己的数据: {{ count }}</div>

    </div>
</template>

<script>

    // 从vuex中获取mapState
    import {mapState} from 'vuex'

    export default {
        name: 'Home',
        data(){
            return {
                count: 10
            }
        },
        computed:mapState({
            //  将vuex中状态count映射到组件计算属性number上
            // 1. 普通使用
            
            number: function(state){
                return state.count
                
                // this为当前组件实例
                // return state.count + this.count
            },
            
            // 2. 简写方式
            
            // number: state => state.count   
            
            // 3. 极简写法
            
            // 字符串"count" 等价于 state => state.count
            // number: 'count'
        }),

    }
</script>

示例说明:

  1. 计算属性的函数第一个参数为vuex中的状态state,因此可以通过state直接获取数据
  2. 计算属性值为函数, 如果只是获取vuex中数据并映射到组件就算属性上, 可以使用简写方式
  3. 如果在计算属性函数中需要使用组件自己的数据,或是有其他的逻辑操作,建议写完整函数


2.3.3 vuex状态名和计算名一样

说明:

  1. 如果vuex状态名和映射的组件计算名完全一样,

  2. mapState可以直接传字符串数组,来映射数据

实例代码:

<template>
    <div class="home">
        <div>vuex中count数据: {{ count }}</div>
        <div>vuex中user数据: {{ user }}</div>
    </div>
</template>

<script>


    import {mapState} from 'vuex'

    export default {
        name: 'Home',
        data(){
            return {
                // count: 10
            }
        },
        // 字符串数组的写法,
        // 就是将vuex中的数据count,user
        // 映射为组件计算属性count,user上
        computed:mapState([
            "count",
            "user"
        ]),
    }
</script>
2.3.4 组件有自己的计算属性

说明:

  1. 上面几个示例中,计算属性computed选项的值就是mapState
  2. 也就是组件的所有计算属性都是从stroe映射过来的
  3. 那么如果还有一个自己额外的计算属性怎么办
  4. 如果需要给组件添加自定义的计算属性,就回归到以前的写法,mapState采用解构的方式使用

示例代码

<template>
<div class="home">

    <div>vuex中数据: {{ count }}</div>
    <div>vuex中数据: {{ user }}</div>
    <div>组件计算属性值: {{ computePrice }}</div>


    </div>
</template>

<script>


    import {mapState} from 'vuex'

    export default {
        name: 'Home',
        data(){
            return {
                price: 10
            }
        },
        computed:{
            // 组件自己的计算属性
            computePrice(){
                return this.price * 2
            },
            // 通过mapState映射过来的计算属性
            ... mapState([
                "count",
                "user"
            ])
        },

    }
</script>


2.4 mapGetters的使用

说明:

  1. mapGettersvuex提供的将store中的getter映射到组件计算属性中的辅助函数
  2. mapGetters使用方式和mapState一样
  3. 最常用的方式就是解构方式

示例代码如下:

<template>
    <div class="home">
        <div>{{fruits}}</div>
        <div>{{filterFruits}}</div>
    </div>
</template>

<script>

    // 获取mapState, mapGetters 辅助函数
    import {mapState,mapGetters} from 'vuex'

    export default {
        name: 'Home',
        data(){
            return {
                price: 10
            }
        },
        computed:{
            computePrice(){
                return this.price * 2
            },
            ... mapState([
                "count",
                "user",
                "fruits"
            ]),
            
            // 解构mapGetters
            // 将store中getters里filterFruits
            // 映射到组件的filterFruits计算属性上
            ...mapGetters([
                "filterFruits"
            ])
        },

    }
</script>

如果store中getters里的计算属性名和组件计算属性名不同时

可以采用对象的写法

...mapGetters([
    // 组件中的计算属性名:  getters中的计算属性名
    fruits: "filterFruits"
])
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342