Vuex詳解

Vuex是什么

  • 狀態(tài)管理模式毯焕,將所有組件需要共享的變量全部存儲在一個對象里,然后將這個對象放在頂層組件中供其他組件使用磺樱。

Vuex內(nèi)容

  • state:存儲狀態(tài)纳猫。也就是變量;
  • getters:派生狀態(tài)。也就是set竹捉、get中的get芜辕,有兩個可選參數(shù):state、getters分別可以獲取state中的變量和其他的getters块差。外部調(diào)用方式:store.getters.personInfo()侵续。就和vue的computed差不多;
  • mutations:提交狀態(tài)修改倔丈。也就是set、get中的set状蜗,這是vuex中唯一修改state的方式需五,但不支持異步操作。第一個參數(shù)默認(rèn)是state轧坎。外部調(diào)用方式:store.commit('SET_TOKEN', 2187)宏邮。和vue中的methods類似;
  • actions: 和mutations類似。不過actions支持異步操作眶根。第一個參數(shù)默認(rèn)是和store具有相同參數(shù)屬性的對象蜀铲。外部調(diào)用方式:store.dispatch('nameAsyn');
  • modules:store的子模塊,內(nèi)容就相當(dāng)于是store的一個實例属百。調(diào)用方式和前面介紹的相似记劝,只是要加上當(dāng)前子模塊名,如:store.a.getters.xxx()族扰。

Vuex使用

  • 開發(fā)中一般使用腳手架vue-cli來搭建項目暴匠,vuex的使用如下:
├── index.html
├── main.js
├── components
└── store
    ├── index.js          # 我們組裝模塊并導(dǎo)出 store 的地方
    ├── state.js          # 跟級別的 state
    ├── getters.js        # 跟級別的 getter
    ├── mutation-types.js # 根級別的mutations名稱(官方推薦mutions方法名使用大寫)
    ├── mutations.js      # 根級別的 mutation
    ├── actions.js        # 根級別的 action
    └── modules
        ├── m1.js         # 模塊1
        └── m2.js         # 模塊2

state.js示例

/*
 * 全局存儲狀態(tài)
 */
const state = {
    token: '',
    expTime: '',
    availableQutoa: 0,
    creditQutoa: 0, 
}

export default state;

getters.js示例(我們一般使用getters來獲取state的狀態(tài)娱两,而不是直接使用state):

/*
 * 派生狀態(tài),即set、get中的get; 使用getters來獲取state的狀態(tài)
 */

export const token = (state) => {
    return state.token;
}

export const expTime = (state) => {
    return state.expTime;
}

export const availableQutoa = (state) => {
    return state.availableQutoa;
}

export const creditQutoa = (state) => {
    return state.creditQutoa;
}

mutation-type.js示例(我們會將所有mutations的函數(shù)名放在這個文件里)

/*
 * 將所有mutations的函數(shù)名放在這個文件里(官方推薦mutions方法名使用大寫)
 */

export const SET_TOKEN = 'SET_TOKEN';

export const SET_EXPTIME = 'SET_EXPTIME';

export const SET_AVAILABLEQUTOA = 'SET_AVAILABLEQUTOA';

export const SET_CREDITQUTOA = 'SET_CREDITQUTOA'

mutations.js示例:

/*
 * 提交狀態(tài)修改啦辐,即set涡拘、get中的set; 是Vuex中唯一修改state的方式 不支持異步操作
 */

import * as types from './mutation-types';

export default {

    [types.SET_TOKEN](state,token) {
        state.token = token;
    },

    [types.SET_EXPTIME](state,expTime) {
        state.expTime = expTime;
    },

    [types.SET_AVAILABLEQUTOA](state,availableQutoa) {
        state.availableQutoa = availableQutoa;
    },

    [types.SET_CREDITQUTOA](state,creditQutoa) {
        state.creditQutoa = creditQutoa;
    }
}

actions.js示例(異步操作)

import * as types from './mutation-types.js'

export default {
    tokenAsyn({commit}, {token}) {
        commit(types.SET_TOKEN, token); //修改token
    },
    expTimeAsyn({commit}, {expTime}) {
        commit(types.SET_EXPTIME, expTime); //修改token過期時間
    },
    availableQutoaAsyn({commit},{availableQutoa}) {
        commit(types.SET_AVAILABLEQUTOA,availableQutoa) //修改可借額度
    },
    creditQutoaAsyn({commit},{creditQutoa}) {
        commit(types.SET_CREDITQUTOA,creditQutoa) //修改授信額度
    },
};

模塊的使用modules--m1.js示例

 const m1 = {
                state: {},
                getters: {},
                mutations: {},
                actions: {}
            };
export default m1;

index.js示例(組裝vuex):

import Vue from 'vue';
import Vuex from 'vuex';
import state from './state.js';
import * as getters from './getters.js';
import mutations from './mutations.js';
import actions from './actions.js';
import m1 from './modules/m1.js';
import m2 from './modules/m2.js';
import createLogger from 'vuex/dist/logger' //修改日志

Vue.use(Vuex);

const debug = process.env.NODE_ENV === 'development'  // 開發(fā)環(huán)境中為true换衬,否則為false

export default new Vuex.Store({
    state,
    getters,
    mutations,
    actions,
    module: {
        m1: m1,
        m2: m2,
    }
    plugins: debug ? [createLogger()] : [] //開發(fā)環(huán)境下顯示vuex的狀態(tài)修改
})

store實例掛載到main.js里面的vue上

import store from './store/index.js'
new Vue({
    el: '#app',
    router,
    store,
    render: h => h(App)
})

在vue組件中使用時炸卑,我們通常會使用mapGettersmapActions录豺、mapMutations朦肘,然后就可以按照vue調(diào)用methods和computed的方式去調(diào)用這些變量或函數(shù),示例如下:

import { mapGetters, mapActions } from 'vuex'

export default {
    computed: {
            ...mapGetters([
                'token', //包銀項目token
                'expTime', //token過期時間
            ])
    },
    methods: {
        ...mapActions([
                'tokenAsyn',
                'expTimeAsyn',
        ]),
        //獲取包銀項目token
        _requestBsbToken() {
            let config = {
                contentType : 'application/x-www-form-urlencoded',
                showWait: false,
            }
            requestBsbToken({},config).then(res => {
                let {code,msg,result} = res;
                if(200 !== code) {
                    Toast(msg);
                    return;
                }
                let token = result['access_token'],
                    saveToen = token.split('.').slice(1,2).join(''),
                    userInfo = JSON.parse(Base64.decode(saveToen)),
                    expTime = userInfo['exp'];
                this.tokenAsyn({token}); //修改token
                this.expTimeAsyn({expTime})  //修改token過期時間
                this._queryCredit();
            }).catch(error => {
                console.log(error)
            })
        },
    }
}

在外部JS文件中使用

import store from '../store/index.js'

let token = store.state.token || ''; //獲取
store.dispatch('expTimeAsyn',{expTime}) //改變
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末双饥,一起剝皮案震驚了整個濱河市媒抠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌咏花,老刑警劉巖趴生,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異昏翰,居然都是意外死亡苍匆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門棚菊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锉桑,“玉大人,你說我怎么就攤上這事窍株∶裰幔” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵球订,是天一觀的道長后裸。 經(jīng)常有香客問我,道長冒滩,這世上最難降的妖魔是什么微驶? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮开睡,結(jié)果婚禮上因苹,老公的妹妹穿的比我還像新娘。我一直安慰自己篇恒,他們只是感情好扶檐,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胁艰,像睡著了一般款筑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腾么,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天奈梳,我揣著相機(jī)與錄音,去河邊找鬼解虱。 笑死攘须,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的殴泰。 我是一名探鬼主播于宙,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼艰匙!你這毒婦竟也來了限煞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤员凝,失蹤者是張志新(化名)和其女友劉穎署驻,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體健霹,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡旺上,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了糖埋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宣吱。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瞳别,靈堂內(nèi)的尸體忽然破棺而出征候,到底是詐尸還是另有隱情杭攻,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布疤坝,位于F島的核電站兆解,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏跑揉。R本人自食惡果不足惜锅睛,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望历谍。 院中可真熱鬧现拒,春花似錦、人聲如沸望侈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甜无。三九已至扛点,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間岂丘,已是汗流浹背陵究。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留奥帘,地道東北人铜邮。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像寨蹋,于是被迫代替她去往敵國和親松蒜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

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

  • 安裝 npm npm install vuex --save 在一個模塊化的打包系統(tǒng)中已旧,您必須顯式地通過Vue.u...
    蕭玄辭閱讀 2,945評論 0 7
  • Vuex是什么秸苗? Vuex 是一個專為 Vue.js應(yīng)用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲管理應(yīng)用的所有組件...
    蕭玄辭閱讀 3,122評論 0 6
  • vuex 場景重現(xiàn):一個用戶在注冊頁面注冊了手機(jī)號碼运褪,跳轉(zhuǎn)到登錄頁面也想拿到這個手機(jī)號碼惊楼,你可以通過vue的組件化...
    sunny519111閱讀 8,022評論 4 111
  • 上一章總結(jié)了 Vuex 的框架原理,這一章我們將從 Vuex 的入口文件開始秸讹,分步驟閱讀和解析源碼檀咙。由于 Vuex...
    你的肖同學(xué)閱讀 1,790評論 3 16
  • 姓名:岳沁 學(xué)號:17101223458 轉(zhuǎn)載自:http://blog.csdn.net/h5_queensty...
    丘之心閱讀 2,148評論 0 1