第四十三節(jié):Vuex狀態(tài)管理:輔助函數(shù)mapState與mapGetters

前言:

Vuex中獲取數(shù)據(jù)的輔助函數(shù)有兩個(gè):mapStatemapGetters

  1. mapState用于將state中的數(shù)據(jù)映射到組件的計(jì)算屬性中
  2. mapGetters用于將getter中的計(jì)算屬性映射到組件的計(jì)算屬性空中

1. 輔助函數(shù)說明:

  1. 之前的使用vue的方法并不是特別好.獲取數(shù)據(jù)需要通過$store找到state對象,在獲取數(shù)據(jù),
  2. 操作getter,mutation,action也是如此,就會給使用帶來不便
  3. vuex提供了一些輔助函數(shù),幫助我們快速獲取數(shù)據(jù), 操作mutation,action函數(shù)

2. mapState

mapState是獲取數(shù)據(jù)的輔助函數(shù)

2.1 獲取數(shù)據(jù)說明
  1. 之前在使用vuex數(shù)據(jù)的時(shí)候我們都是在模板Mustache語法中直接獲取數(shù)據(jù),

  2. 這樣的操作并不是特別友好,每一次都需要重新獲取數(shù)據(jù)

  3. 因此比較常用的做法是將vuex中的數(shù)據(jù)獲取后保存在組件的計(jì)算屬性中

  4. 這樣如果在組件中多次使用數(shù)據(jù),就可以使用計(jì)算屬性的緩存

之前獲取數(shù)據(jù)示例代碼

<div class="count">數(shù)字: {{ $store.state.count }}</div>

將數(shù)據(jù)保存在計(jì)算屬性中,

示例代碼如下

<template>
    <div class="home">
        <!-- 此時(shí)只需要使用計(jì)算看屬性中的數(shù)據(jù)就可以了 -->
        <div class="count">數(shù)字: {{ count }}</div>
    </div>
</template>

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

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

        }
    }
</script>

2.2 計(jì)算屬性中的問題

說明:

  1. 如果在一個(gè)組件中需要使用很多vuex中的狀態(tài)
  2. 那么我們就需要在組件中定義所有的需要使用數(shù)據(jù)對應(yīng)的計(jì)算屬性
  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

為了解決組件需要獲取多個(gè)狀態(tài)的時(shí)候,將這些狀態(tài)都聲明為計(jì)算屬性會有些重復(fù)和冗余的問題.

vuex提供了mapState輔助函數(shù)幫助我們自動生成計(jì)算屬性

注意:

使用mapState有不同使用方式

2.3.1 vuex中的狀態(tài)
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 組件中計(jì)算屬性名和vuex中的狀態(tài)名不一致

說明:

  1. 例如組件中需要獲取vuexcount數(shù)據(jù)的內(nèi)容,

  2. 但是在組件中有可能也有一個(gè)名為count的數(shù)據(jù)

  3. 因此在獲取vuex中的count時(shí),組件的計(jì)算屬性就不能在為count了,

  4. 故而計(jì)算屬性的名和vuex狀態(tài)名不一致

示例代碼:

<template>
<div class="home">
    <div class="count">vuex中數(shù)據(jù): {{ number }}</div>
    <div >組件自己的數(shù)據(jù): {{ count }}</div>

    </div>
</template>

<script>

    // 從vuex中獲取mapState
    import {mapState} from 'vuex'

    export default {
        name: 'Home',
        data(){
            return {
                count: 10
            }
        },
        computed:mapState({
            //  將vuex中狀態(tài)count映射到組件計(jì)算屬性number上
            // 1\. 普通使用

            number: function(state){
                return state.count

                // this為當(dāng)前組件實(shí)例
                // return state.count + this.count
            },

            // 2\. 簡寫方式

            // number: state => state.count   

            // 3\. 極簡寫法

            // 字符串"count" 等價(jià)于 state => state.count
            // number: 'count'
        }),

    }
</script>

示例說明:

  1. 計(jì)算屬性的函數(shù)第一個(gè)參數(shù)為vuex中的狀態(tài)state,因此可以通過state直接獲取數(shù)據(jù)
  2. 計(jì)算屬性值為函數(shù), 如果只是獲取vuex中數(shù)據(jù)并映射到組件就算屬性上, 可以使用簡寫方式
  3. 如果在計(jì)算屬性函數(shù)中需要使用組件自己的數(shù)據(jù),或是有其他的邏輯操作,建議寫完整函數(shù)
2.3.3 vuex狀態(tài)名和計(jì)算名一樣

說明:

  1. 如果vuex狀態(tài)名和映射的組件計(jì)算名完全一樣,

  2. mapState可以直接傳字符串?dāng)?shù)組,來映射數(shù)據(jù)

實(shí)例代碼:

<template>
    <div class="home">
        <div>vuex中count數(shù)據(jù): {{ count }}</div>
        <div>vuex中user數(shù)據(jù): {{ user }}</div>
    </div>
</template>

<script>

    import {mapState} from 'vuex'

    export default {
        name: 'Home',
        data(){
            return {
                // count: 10
            }
        },
        // 字符串?dāng)?shù)組的寫法,
        // 就是將vuex中的數(shù)據(jù)count,user
        // 映射為組件計(jì)算屬性count,user上
        computed:mapState([
            "count",
            "user"
        ]),
    }
</script>

2.3.4 組件有自己的計(jì)算屬性

說明:

  1. 上面幾個(gè)示例中,計(jì)算屬性computed選項(xiàng)的值就是mapState
  2. 也就是組件的所有計(jì)算屬性都是從stroe映射過來的
  3. 那么如果還有一個(gè)自己額外的計(jì)算屬性怎么辦
  4. 如果需要給組件添加自定義的計(jì)算屬性,就回歸到以前的寫法,mapState采用解構(gòu)的方式使用

示例代碼

<template>
<div class="home">

    <div>vuex中數(shù)據(jù): {{ count }}</div>
    <div>vuex中數(shù)據(jù): {{ user }}</div>
    <div>組件計(jì)算屬性值: {{ computePrice }}</div>

    </div>
</template>

<script>

    import {mapState} from 'vuex'

    export default {
        name: 'Home',
        data(){
            return {
                price: 10
            }
        },
        computed:{
            // 組件自己的計(jì)算屬性
            computePrice(){
                return this.price * 2
            },
            // 通過mapState映射過來的計(jì)算屬性
            ... mapState([
                "count",
                "user"
            ])
        },

    }
</script>

2.4 mapGetters的使用

說明:

  1. mapGettersvuex提供的將store中的getter映射到組件計(jì)算屬性中的輔助函數(shù)
  2. mapGetters使用方式和mapState一樣
  3. 最常用的方式就是解構(gòu)方式

示例代碼如下:

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

<script>

    // 獲取mapState, mapGetters 輔助函數(shù)
    import {mapState,mapGetters} from 'vuex'

    export default {
        name: 'Home',
        data(){
            return {
                price: 10
            }
        },
        computed:{
            computePrice(){
                return this.price * 2
            },
            ... mapState([
                "count",
                "user",
                "fruits"
            ]),

            // 解構(gòu)mapGetters
            // 將store中g(shù)etters里filterFruits
            // 映射到組件的filterFruits計(jì)算屬性上
            ...mapGetters([
                "filterFruits"
            ])
        },

    }
</script>

如果store中g(shù)etters里的計(jì)算屬性名和組件計(jì)算屬性名不同時(shí)

可以采用對象的寫法

...mapGetters([
    // 組件中的計(jì)算屬性名:  getters中的計(jì)算屬性名
    fruits: "filterFruits"
])

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盐碱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子懂缕,更是在濱河造成了極大的恐慌,老刑警劉巖柳琢,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件休弃,死亡現(xiàn)場離奇詭異,居然都是意外死亡壮虫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門环础,熙熙樓的掌柜王于貴愁眉苦臉地迎上來囚似,“玉大人剩拢,你說我怎么就攤上這事∪幕剑” “怎么了徐伐?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長募狂。 經(jīng)常有香客問我呵晨,道長,這世上最難降的妖魔是什么熬尺? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮谓罗,結(jié)果婚禮上粱哼,老公的妹妹穿的比我還像新娘。我一直安慰自己檩咱,他們只是感情好揭措,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刻蚯,像睡著了一般绊含。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上炊汹,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天躬充,我揣著相機(jī)與錄音,去河邊找鬼讨便。 笑死充甚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的霸褒。 我是一名探鬼主播伴找,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼废菱!你這毒婦竟也來了技矮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤殊轴,失蹤者是張志新(化名)和其女友劉穎衰倦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旁理,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耿币,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了韧拒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淹接。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡十性,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出塑悼,到底是詐尸還是另有隱情劲适,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布厢蒜,位于F島的核電站霞势,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏斑鸦。R本人自食惡果不足惜愕贡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巷屿。 院中可真熱鬧固以,春花似錦、人聲如沸嘱巾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旬昭。三九已至篙螟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間问拘,已是汗流浹背遍略。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留骤坐,地道東北人墅冷。 一個(gè)月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像或油,于是被迫代替她去往敵國和親寞忿。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容