Vuex應用狀態(tài)管理

vuex是什么弥锄?

Vuex 是一個專為 Vue.js 應用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲管理應用的所有組件的狀態(tài)秀姐,并以相應的規(guī)則保證狀態(tài)以一種可預測的方式發(fā)生變化

狀態(tài)管理模式撼港、集中式存儲管理 一聽就很高大上,蠻嚇人的营曼。在我看來 vuex 就是把需要共享的變量全部存儲在一個對象里面,然后將這個對象放在頂層組件中供其他組件使用愚隧。這么說吧蒂阱,將vue想作是一個js文件、組件是函數(shù)狂塘,那么vuex就是一個全局變量录煤,只是這個“全局變量”包含了一些特定的規(guī)則而已。

在vue的組件化開發(fā)中荞胡,經(jīng)常會遇到需要將當前組件的狀態(tài)傳遞給其他組件妈踊。父子組件通信時,我們通常會采用 props + emit 這種方式泪漂。但當通信雙方不是父子組件甚至壓根不存在相關(guān)聯(lián)系廊营,或者一個狀態(tài)需要共享給多個組件時,就會非常麻煩萝勤,數(shù)據(jù)也會相當難維護露筒,這對我們開發(fā)來講就很不友好。vuex 這個時候就很實用敌卓,不過在使用vuex之后也帶來了更多的概念和框架慎式,需慎重!

const store = new Vuex.Store({

? ? state: {

? ? ? ? name: 'weish',

? ? ? ? age: 22

? ? },

? ? getters: {

? ? ? ? personInfo(state) {

? ? ? ? ? ? return `My name is ${state.name}, I am ${state.age}`;

? ? ? ? }

? ? }

? ? mutations: {

? ? ? ? SET_AGE(state, age) {

? ? ? ? ? ? commit(age, age);

? ? ? ? }

? ? },

? ? actions: {

? ? ? ? nameAsyn({commit}) {

? ? ? ? ? ? setTimeout(() => {

? ? ? ? ? ? ? ? commit('SET_AGE', 18);

? ? ? ? ? ? }, 1000);

? ? ? ? }

? ? },

? ? modules: {

? ? ? ? a: modulesA

? ? }

}

這個就是最基本也是完整的vuex代碼趟径;vuex 包含有五個基本的對象:

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ù)默認是state像云。外部調(diào)用方式:store.commit('SET_AGE', 18)锌雀。和vue中的methods類似。

actions:和mutations類似迅诬。不過actions支持異步操作腋逆。第一個參數(shù)默認是和store具有相同參數(shù)屬性的對象。外部調(diào)用方式:store.dispatch('nameAsyn')侈贷。

modules:store的子模塊惩歉,內(nèi)容就相當于是store的一個實例。調(diào)用方式和前面介紹的相似俏蛮,只是要加上當前子模塊名撑蚌,如:store.a.getters.xxx()。

vue-cli中使用vuex的方式


state.js示例:

const state = {

? ? name: 'weish',

? ? age: 22

};

export default state;

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

export const name = (state) => {

? ? return state.name;

}

export const age = (state) => {

? ? return state.age

}

export const other = (state) => {

? ? return `My name is ${state.name}, I am ${state.age}.`;

}

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

export const SET_NAME = 'SET_NAME';

export const SET_AGE = 'SET_AGE';

mutations.js示例:

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

export default {

? ? [types.SET_NAME](state, name) {

? ? ? ? state.name = name;

? ? },

? ? [types.SET_AGE](state, age) {

? ? ? ? state.age = age;

? ? }

};

actions.js示例(異步操作争涌、多個commit時):

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

export default {

? ? nameAsyn({commit}, {age, name}) {

? ? ? ? commit(types.SET_NAME, name);

? ? ? ? commit(types.SET_AGE, age);

? ? }

};

modules--m1.js示例(如果不是很復雜的應用,一般來講是不會分模塊的):

export default {

? ? state: {},

? ? getters: {},

? ? mutations: {},

? ? actions: {}

};

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 !== 'production'; // 開發(fā)環(huán)境中為true辣恋,否則為false

export default new vuex.Store({

? ? state,

? ? getters,

? ? mutations,

? ? actions,

? ? modules: {

? ? ? ? m1,

? ? ? ? m2

? ? },

? ? plugins: debug ? [createLogger()] : [] // 開發(fā)環(huán)境下顯示vuex的狀態(tài)修改

});

最后將store實例掛載到main.js里面的vue上去就行了

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

new Vue({

? el: '#app',

? store,

? render: h => h(App)

});

在vue組件中使用時亮垫,我們通常會使用mapGetters、mapActions伟骨、mapMutations饮潦,然后就可以按照vue調(diào)用methods和computed的方式去調(diào)用這些變量或函數(shù),示例如下:

import {mapGetters, mapMutations, mapActions} from 'vuex';

/* 只寫組件中的script部分 */

export default {

? ? computed: {

? ? ? ? ...mapGetters([

? ? ? ? ? ? 'name',

? ? ? ? ? ? 'age'

? ? ? ? ])

? ? },

? ? methods: {

? ? ? ? ...mapMutations({

? ? ? ? ? ? setName: 'SET_NAME',

? ? ? ? ? ? setAge: 'SET_AGE'

? ? ? ? }),

? ? ? ? ...mapActions([

? ? ? ? ? ? nameAsyn

? ? ? ? ])

? ? }

};

總結(jié)

以上就是vuex 的相關(guān)知識底靠,其實vuex很簡單.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末害晦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子暑中,更是在濱河造成了極大的恐慌壹瘟,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鳄逾,死亡現(xiàn)場離奇詭異稻轨,居然都是意外死亡,警方通過查閱死者的電腦和手機雕凹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門殴俱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來政冻,“玉大人,你說我怎么就攤上這事线欲÷崭眩” “怎么了衷咽?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我氓润,道長如筛,這世上最難降的妖魔是什么倒戏? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任煤伟,我火速辦了婚禮,結(jié)果婚禮上嗜憔,老公的妹妹穿的比我還像新娘秃励。我一直安慰自己,他們只是感情好吉捶,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布夺鲜。 她就那樣靜靜地躺著,像睡著了一般帚稠。 火紅的嫁衣襯著肌膚如雪谣旁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天滋早,我揣著相機與錄音榄审,去河邊找鬼。 笑死杆麸,一個胖子當著我的面吹牛搁进,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昔头,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼饼问,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了揭斧?” 一聲冷哼從身側(cè)響起莱革,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎讹开,沒想到半個月后盅视,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡旦万,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年闹击,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片成艘。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡赏半,死狀恐怖贺归,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情断箫,我是刑警寧澤拂酣,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站瑰枫,受9級特大地震影響踱葛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜光坝,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望甥材。 院中可真熱鬧盯另,春花似錦、人聲如沸洲赵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叠萍。三九已至芝发,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間苛谷,已是汗流浹背辅鲸。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留腹殿,地道東北人独悴。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像锣尉,于是被迫代替她去往敵國和親刻炒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

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