Vue Vuex狀態(tài)管理

1.1 理解 Vuex

1.1.1 Vuex 是什么

  1. 概念:專門在 Vue 中實(shí)現(xiàn)集中式狀態(tài)(數(shù)據(jù))管理的一個(gè) Vue 插件务唐,對 Vue 應(yīng)用中多個(gè)組件的共享狀態(tài)進(jìn)行集中式的管理(讀/寫),也是一種組件間通信的方式龙屉,且適用于任意組件間通信。
  2. Github地址

1.1.2 什么時(shí)候使用 Vuex

  1. 多個(gè)組件依賴于同一狀態(tài)
  2. 來自不同組件的行為需要變更同一狀態(tài)

1.1.3 Vuex 工作原理圖

flow.png
vuex.png

1.2 搭建 Vuex 環(huán)境與基本使用

1.2.1 環(huán)境 Vuex 搭建

  1. 創(chuàng)建文件:src/store/index.js

    //引入Vue核心庫
    import Vue from 'vue'
    //引入Vuex
    import Vuex from 'vuex'
    //應(yīng)用Vuex插件
    Vue.use(Vuex)
    
    //準(zhǔn)備actions對象——響應(yīng)組件中用戶的動(dòng)作
    const actions = {}
    //準(zhǔn)備mutations對象——修改state中的數(shù)據(jù)
    const mutations = {}
    //準(zhǔn)備state對象——保存具體的數(shù)據(jù)
    const state = {}
    
    //創(chuàng)建并暴露store
    export default new Vuex.Store({
        actions,
        mutations,
        state
    })
    
  2. main.js 中創(chuàng)建 vm 時(shí)傳入 store 配置項(xiàng)

    ......
    //引入store
    import store from './store'
        ......
        //創(chuàng)建vm
        new Vue({
            el:'#app',
            render: h => h(App),
            store
        })
    

1.2.2 基本使用

  1. 初始化數(shù)據(jù)疗认、配置 actions炼列、配置 mutations,操作文件 store.js

    //引入Vue核心庫
    import Vue from 'vue'
    //引入Vuex
    import Vuex from 'vuex'
    //引用Vuex
    Vue.use(Vuex)
    
    const actions = {
        //響應(yīng)組件中加的動(dòng)作
        jia(context,value){
            // console.log('actions中的jia被調(diào)用了',miniStore,value)
            context.commit('JIA',value)
        },
    }
    
    const mutations = {
        //執(zhí)行加
        JIA(state,value){
            // console.log('mutations中的JIA被調(diào)用了',state,value)
            state.sum += value
        }
    }
    
    //初始化數(shù)據(jù)
    const state = {
        sum:0
    }
    
    //創(chuàng)建并暴露store
    export default new Vuex.Store({
        actions,
        mutations,
        state,
    })
    
  2. 組件中讀取 Vuex 中的數(shù)據(jù):$store.state.sum

  3. 組件中修改 Vuex 中的數(shù)據(jù):$store.dispatch('action中的方法名',數(shù)據(jù))$store.commit('mutations中的方法名',數(shù)據(jù))

備注:若沒有網(wǎng)絡(luò)請求或其他業(yè)務(wù)邏輯突倍,組件中也可以越過 actions,即不寫 dispatch盆昙,直接編寫 commit

1.3 Vuex 核心概念和API

1.3.1 state

  1. Vuex 管理的狀態(tài)對象

  2. 它應(yīng)該是唯一的

  3. 示例代碼:

    const state = {
        sum:0
    }
    

1.3.2 actions

  1. 值為一個(gè)對象羽历,包含多個(gè)響應(yīng)用戶動(dòng)作的回調(diào)函數(shù)

  2. 通過 commit() 來觸發(fā) mutation 中函數(shù)的調(diào)用,間接更新 state

  3. 如何觸發(fā) actions 中的回調(diào)淡喜?

    在組件中使用:$store.dispatch('對應(yīng)的action回調(diào)名') 觸發(fā)

  4. 可以包含異步代碼(定時(shí)器,ajax等等)

  5. 示例代碼:

    const actions = {
        //響應(yīng)組件中加的動(dòng)作
        jia(context,value){
            // console.log('actions中的jia被調(diào)用了',miniStore,value)
            context.commit('JIA',value)
        },
    }
    

1.3.3 mutations

  1. 值是一個(gè)對象秕磷,包含多個(gè)直接更新 state 的方法

  2. 誰能調(diào)用 mutations 中的方法?如何調(diào)用炼团?

    action 中使用: commit('對應(yīng)的mutations方法名') 觸發(fā)

  3. mutations 中方法的特點(diǎn):不能寫異步代碼澎嚣、只能單純的操作 state

  4. 示例代碼:

    const mutations = {
        //執(zhí)行加
        JIA(state,value){
            // console.log('mutations中的JIA被調(diào)用了',state,value)
            state.sum += value
        }
    }
    

1.3.4 getters

  1. 概念:當(dāng) state 中的數(shù)據(jù)需要經(jīng)過加工后再使用時(shí),可以使用 getters 加工瘟芝。

  2. store.js 中追加 getters 配置

    // 準(zhǔn)備 getters —— 用于對 state 中的數(shù)據(jù)進(jìn)行加工
    const getters = {
     bigSum(state){
         return state.sum * 10
     }
    }
    
    // 創(chuàng)建并暴露store
    export default new Vuex.Store({
     ......
     getters
    })
    
  3. 組件中讀取數(shù)據(jù):$store.getters.bigSum

1.4 四個(gè) map 方法的使用

1.4.1 mapState 方法

<strong>mapState 方法:</strong>用于幫助我們映射 state 中的數(shù)據(jù)為計(jì)算屬性

computed: {
    //借助mapState生成計(jì)算屬性:sum易桃、school、subject(對象寫法)
    ...mapState({sum:'sum',school:'school',subject:'subject'}),

    //借助mapState生成計(jì)算屬性:sum锌俱、school晤郑、subject(數(shù)組寫法)
    ...mapState(['sum','school','subject']),
},

1.4.2 mapGetters 方法

<strong>mapGetters 方法:</strong>用于幫助我們映射 getters 中的數(shù)據(jù)為計(jì)算屬性

computed: {
    //借助mapGetters生成計(jì)算屬性:bigSum(對象寫法)
    ...mapGetters({bigSum:'bigSum'}),

    //借助mapGetters生成計(jì)算屬性:bigSum(數(shù)組寫法)
    ...mapGetters(['bigSum'])
},

1.4.3 mapActions 方法

<strong>mapActions 方法:</strong>用于幫助我們生成與 actions 對話的方法,即:包含 $store.dispatch(xxx) 的函數(shù)

methods:{
    //靠mapActions生成:incrementOdd、incrementWait(對象形式)
    ...mapActions({incrementOdd:'jiaOdd',incrementWait:'jiaWait'})

    //靠mapActions生成:incrementOdd造寝、incrementWait(數(shù)組形式)
    ...mapActions(['jiaOdd','jiaWait'])
}

1.4.4 mapMutations 方法

<strong>mapMutations 方法:</strong>用于幫助我們生成與 mutations 對話的方法磕洪,即:包含 $store.commit(xxx) 的函數(shù)

methods:{
    //靠mapActions生成:increment、decrement(對象形式)
    ...mapMutations({increment:'JIA',decrement:'JIAN'}),

    //靠mapMutations生成:JIA匹舞、JIAN(對象形式)
    ...mapMutations(['JIA','JIAN']),
}

備注:mapActionsmapMutations 使用時(shí),若需要傳遞參數(shù)需要:在模板中綁定事件時(shí)傳遞好參數(shù)线脚,否則參數(shù)是事件對象赐稽。

1.5 模塊化+命名空間

  1. 業(yè)務(wù)場景中需要包含多個(gè) module,一個(gè) module 是一個(gè) store 的配置對象浑侥,與一個(gè)組件(包含有共享數(shù)據(jù))對應(yīng)
  2. 目的:讓代碼更好維護(hù)姊舵,讓多種數(shù)據(jù)分類更加明確

進(jìn)行模塊化:

  1. 修改 store.js

    const countAbout = {
        namespaced:true,//開啟命名空間
        state: {x: 1},
        mutations: { ... },
        actions: { ... },
        getters: {
            bigSum(state){
                return state.sum * 10
            }
        }
    }
       
    const personAbout = {
        namespaced:true,//開啟命名空間
        state:{ ... },
        mutations: { ... },
        actions: { ... }
    }
       
    const store = new Vuex.Store({
        modules: {
            countAbout,
            personAbout
        }
    })
    
  2. 開啟命名空間后,組件中讀取 state 數(shù)據(jù)

    //方式一:自己直接讀取
    this.$store.state.personAbout.list
    //方式二:借助mapState讀仍⒙洹:
    ...mapState('countAbout',['sum','school','subject']),
    
  3. 開啟命名空間后括丁,組件中讀取 getters 數(shù)據(jù)

    //方式一:自己直接讀取
    this.$store.getters['personAbout/firstPersonName']
    //方式二:借助mapGetters讀取:
    ...mapGetters('countAbout',['bigSum'])
    
  4. 開啟命名空間后伶选,組件中調(diào)用 dispatch

    //方式一:自己直接dispatch
    this.$store.dispatch('personAbout/addPersonWang',person)
    //方式二:借助mapActions:
    ...mapActions('countAbout',{incrementOdd:'jiaOdd',incrementWait:'jiaWait'})
    
  5. 開啟命名空間后史飞,組件中調(diào)用 commit

    //方式一:自己直接commit
    this.$store.commit('personAbout/ADD_PERSON',person)
    //方式二:借助mapMutations:
    ...mapMutations('countAbout',{increment:'JIA',decrement:'JIAN'}),
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市仰税,隨后出現(xiàn)的幾起案子构资,更是在濱河造成了極大的恐慌,老刑警劉巖陨簇,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吐绵,死亡現(xiàn)場離奇詭異,居然都是意外死亡河绽,警方通過查閱死者的電腦和手機(jī)己单,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耙饰,“玉大人纹笼,你說我怎么就攤上這事」豆颍” “怎么了允乐?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長削咆。 經(jīng)常有香客問我牍疏,道長,這世上最難降的妖魔是什么拨齐? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任鳞陨,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘厦滤。我一直安慰自己援岩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布掏导。 她就那樣靜靜地躺著享怀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪趟咆。 梳的紋絲不亂的頭發(fā)上添瓷,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機(jī)與錄音值纱,去河邊找鬼鳞贷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛虐唠,可吹牛的內(nèi)容都是我干的搀愧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼疆偿,長吁一口氣:“原來是場噩夢啊……” “哼咱筛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起杆故,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤眷蚓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后反番,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沙热,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年罢缸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了篙贸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡枫疆,死狀恐怖爵川,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情息楔,我是刑警寧澤寝贡,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站值依,受9級特大地震影響圃泡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜愿险,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一颇蜡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦风秤、人聲如沸鳖目。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽领迈。三九已至,卻和暖如春碍沐,著一層夾襖步出監(jiān)牢的瞬間狸捅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工抢韭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留薪贫,地道東北人恍箭。 一個(gè)月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓刻恭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扯夭。 傳聞我的和親對象是個(gè)殘疾皇子鳍贾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評論 2 355