Vuex

關(guān)于VueX

Vuex 是一個專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理工具
大型項目使用為解決組件之間傳遞數(shù)據(jù)

之前處理方法:

  • 父子組件傳值、平行組件在跳轉(zhuǎn)時牺汤,利用url浑度,路由里的傳
  • 模式非常脆弱火架,通常會導(dǎo)致無法維護的代碼

vueX的作用

  1. vuex能夠保存全局數(shù)據(jù),供整個應(yīng)用使用
  2. vuex保存的數(shù)據(jù)是響應(yīng)式的
  3. vuex保存的數(shù)據(jù)可以跟蹤狀態(tài)的變化

使用步驟

  1. 安裝
npm install vuex –save
  1. 創(chuàng)建對象 ./src/store/index.js下
//引入vueX
import Vuex from 'vuex'

//把vueX安裝到Vue里
Vue.use(Vuex)

export default new Vuex.Store({
    state:{},
    getters:{},
    mutations:{},
    actions:{}
})
  1. 將vueX.store對象植入到vue的根屬性 ./src/main.js
import store from './store'

new Vue({
    el: '#app',
    store
})
  1. 組件獲取數(shù)據(jù)
//模板里:
$store.state.id
//腳本里
this.$store.state.id

vueX的核心概念:

04185834_TAxe.png
state : 數(shù)據(jù)倉庫 抑胎,存儲所有的 共享數(shù)據(jù),相當于vue組件里的data 存放狀態(tài)
export default new VueX.Store({
    state:{
        age:12,
        isAdult:"未成年",
        isAllowMarry:false
    }
    ......
});


<!--獲取-->
{{$store.state.age}}
{{$store.state.isAdult}}
{{$store.state.isAllowMarry?"可以結(jié)婚了":"不要著急渐北,再等等"}}




//對state對象中添加一個age成員
Vue.set(state,"age",15)

//將剛剛添加的age成員刪除
Vue.delete(state,'age')
Getter : 在state的基礎(chǔ)上派生的數(shù)據(jù)阿逃, 相當于vue組件里 computed 加工state成員給外界

Getters中的方法有兩個默認參數(shù)

  • state 當前VueX對象中的狀態(tài)對象
  • getters 當前getters對象,用于將getters下的其他getter拿來用
export default new VueX.Store({
    state:{
        age:12,
    },
    getters:{
        ageChina:state=>{
            let shi = parseInt(state.age/10); //1
            let ge = state.age%10;//2
            let str = "";
            switch(shi){
                case 1:str='一';break;
                case 2:str='二';break;
            }
            return str;
        }
    }
});
//獲取
{{$store.getters.ageChina}}
Mutation:修改state的數(shù)據(jù)時腔稀,用mutation盆昙,這與跟蹤狀態(tài) 有關(guān)系 模塊化狀態(tài)管理

mutations方法都有默認的形參:

  • ([state] [,payload])
  • state是當前VueX對象中的state
  • payload是該方法在被調(diào)用時傳遞參數(shù)使用的
export default new VueX.Store({
    state:{
        age:12,
        isAdult:"未成年",
        isAllowMarry:false
    },
    // mutations:是跟蹤狀態(tài)。這里面只能有同步代碼
    mutations:{
        incAge(state,num){
        state.age+=num;
    }
});
Action:解決mutation里只能有同步代碼的問題action里可以有異步代碼

Actions中的方法有兩個默認參數(shù)

  • context 上下文(相當于箭頭函數(shù)中的this)對象
  • payload 掛載參數(shù)
actions:{
    aEdit(context,payload){
        setTimeout(()=>{
            context.commit('incAge',payload)
        },2000)
    }
}
提交mutation(如果有異步就在action提交焊虏,如果沒有異步就在組件里提交)
//組件里提交
$store.commit('incAge',num);
$store.commit('incAge',{ num:111 });
$store.commit({
    type:'incAge',
    payload:{
    age:15,
    sex:'男'
}
});


//action提交
$store.dispatch("incAge",num)
Action和mutation的區(qū)別
  • 在代碼的角度上淡喜,action是來提交mutation的
  • 在用途上:區(qū)分 actions 和 mutations
  • 并不是為了解決靜態(tài)問題,而是為了能用 devtools 追蹤狀態(tài)變化诵闭。 vuex 真正限制你的只有 mutation 必須是同步的這一點炼团。

關(guān)于Module

如果項目大的話全局數(shù)據(jù)太多會混亂,可以分類處理疏尿,分模塊

./src/store/moduleA.js

export default {
    state: {count:1}, 
    mutations: { ... }, 
    actions: { 
         incCount(context){
            console.log("moduleA的action");
            setTimeout(()=>{
                context.commit("incCount");
            },2000);
        }
    }, 
    getters: { ... } 
}
                                                   
./src/store/moduleB.js

export default {
    state: {count:2}, 
    mutations: { ... }, 
    actions: { 
         incCount(context){
            console.log("moduleB的action");
            setTimeout(()=>{
                context.commit("incCount");
            },2000);
        }
    }, 
    getters: { ... } 
}

在總的store里包含所有的模塊:

import Vue from "vue";
import vueX from "vuex";
import moduleA from "./moduleA";
import moduleB from "./moduleB";

Vue.use(vueX);

export default new vueX.Store({
    modules:{
        moduleA:moduleA,
        moduleB:moduleB
    }
    //簡寫:
    modules:{
        moduleA,moduleB
    }
});

使用

store.state.moduleA.count // -> moduleA 的狀態(tài)
store.state.moduleB.count // -> moduleB 的狀態(tài)
模塊(Module)里的命名空間(namespaced:true)

模塊具有更高的封裝度和復(fù)用性瘟芝,你可以通過添加 namespaced: true 的方式使其成為帶命名空間的模塊。當模塊被注冊后褥琐,它的所有 getter锌俱、action 及 mutation 都會自動根據(jù)模塊注冊的路徑調(diào)整命名。

export default {
    namespaced:true,
    state:{
        count:1
    },
    mutations:{
    },
    actions:{        
    }
}

派發(fā)action時敌呈,加上模塊名

this.$store.dispatch('moduleA/incCount');

vuex中mapState贸宏、mapMutations造寝、mapAction的理解
https://blog.csdn.net/wangguoyu1996/article/details/80573113

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吭练,隨后出現(xiàn)的幾起案子诫龙,更是在濱河造成了極大的恐慌,老刑警劉巖鲫咽,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件签赃,死亡現(xiàn)場離奇詭異,居然都是意外死亡分尸,警方通過查閱死者的電腦和手機锦聊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寓落,“玉大人括丁,你說我怎么就攤上這事×嫜。” “怎么了史飞?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長仰税。 經(jīng)常有香客問我构资,道長,這世上最難降的妖魔是什么陨簇? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任吐绵,我火速辦了婚禮,結(jié)果婚禮上河绽,老公的妹妹穿的比我還像新娘己单。我一直安慰自己,他們只是感情好耙饰,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布纹笼。 她就那樣靜靜地躺著,像睡著了一般苟跪。 火紅的嫁衣襯著肌膚如雪廷痘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天件已,我揣著相機與錄音笋额,去河邊找鬼。 笑死篷扩,一個胖子當著我的面吹牛兄猩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼厦滤,長吁一口氣:“原來是場噩夢啊……” “哼援岩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起掏导,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎羽峰,沒想到半個月后趟咆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡梅屉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年值纱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坯汤。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡虐唠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惰聂,到底是詐尸還是另有隱情疆偿,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布搓幌,位于F島的核電站杆故,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏溉愁。R本人自食惡果不足惜处铛,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拐揭。 院中可真熱鬧撤蟆,春花似錦、人聲如沸堂污。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敷鸦。三九已至息楔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扒披,已是汗流浹背值依。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留碟案,地道東北人愿险。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辆亏。 傳聞我的和親對象是個殘疾皇子风秤,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344