第四十三節(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對(duì)象,在獲取數(shù)據(jù),
  2. 操作getter,mutation,action也是如此,就會(huì)給使用帶來不便
  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ù)對(duì)應(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ì)算屬性會(huì)有些重復(fù)和冗余的問題.

vuex提供了mapState輔助函數(shù)幫助我們自動(dòng)生成計(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. 簡(jiǎn)寫方式
            
            // number: state => state.count   
            
            // 3. 極簡(jiǎn)寫法
            
            // 字符串"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ù)并映射到組件就算屬性上, 可以使用簡(jiǎn)寫方式
  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í)

可以采用對(duì)象的寫法

...mapGetters([
    // 組件中的計(jì)算屬性名:  getters中的計(jì)算屬性名
    fruits: "filterFruits"
])
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末喘鸟,一起剝皮案震驚了整個(gè)濱河市鸡捐,隨后出現(xiàn)的幾起案子膀哲,更是在濱河造成了極大的恐慌,老刑警劉巖漱牵,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡缩麸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門赡矢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杭朱,“玉大人,你說我怎么就攤上這事吹散』⌒担” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵空民,是天一觀的道長(zhǎng)刃唐。 經(jīng)常有香客問我,道長(zhǎng)袭景,這世上最難降的妖魔是什么唁桩? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮耸棒,結(jié)果婚禮上荒澡,老公的妹妹穿的比我還像新娘。我一直安慰自己与殃,他們只是感情好单山,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著幅疼,像睡著了一般米奸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爽篷,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天悴晰,我揣著相機(jī)與錄音,去河邊找鬼。 笑死铡溪,一個(gè)胖子當(dāng)著我的面吹牛漂辐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播棕硫,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼髓涯,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了哈扮?” 一聲冷哼從身側(cè)響起纬纪,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎滑肉,沒想到半個(gè)月后包各,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赦邻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年髓棋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惶洲。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡按声,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恬吕,到底是詐尸還是另有隱情签则,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布铐料,位于F島的核電站渐裂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏钠惩。R本人自食惡果不足惜柒凉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望篓跛。 院中可真熱鬧膝捞,春花似錦、人聲如沸愧沟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沐寺。三九已至林艘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間混坞,已是汗流浹背狐援。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咕村。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓场钉,卻偏偏與公主長(zhǎng)得像蚊俺,于是被迫代替她去往敵國(guó)和親懈涛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355