Vuex 基礎(chǔ)(module)

由于使用單一狀態(tài)樹你画,應(yīng)用的所有狀態(tài)會(huì)集中到一個(gè)比較大的對(duì)象。當(dāng)應(yīng)用變得非常復(fù)雜時(shí)戈二,store 對(duì)象就有可能變得相當(dāng)臃腫预柒。

為了解決以上問題队塘,Vuex 允許我們將 store 分割成模塊(module)。每個(gè)模塊擁有自己的 state卫旱、mutation人灼、action、getter顾翼、甚至是嵌套子模塊——從上至下進(jìn)行同樣方式的分割:

const moduleA = {
  state: () => ({ ... }),
  mutations: { ... },
  actions: { ... },
  getters: { ... }
}

const moduleB = {
  state: () => ({ ... }),
  mutations: { ... },
  actions: { ... }
}

const store = new Vuex.Store({
  modules: {
    a: moduleA,
    b: moduleB
  }
})

store.state.a // -> moduleA 的狀態(tài)
store.state.b // -> moduleB 的狀態(tài)

這是官方的介紹投放,我們這里把moduleA和moduleB分開文件來說明:

首先在app.vue同級(jí)創(chuàng)建 store文件夾,里面的結(jié)果如圖:

image.png

a.jsb.js里面的代碼為:

//a.js
const state = {
    money:10
}
const mutations = {
    add(state,num){
        
        state.money+=parseInt(num)
    },
    reduce(state,num){
        state.money-=parseInt(num)
    }
}
const actions={
    add:({commit},num)=>{
        commit('add',num)
    },
    reduce:({commit},num)=>{
        commit('reduce',num)
    }
}

export default {
    namespaced:true,
    state,
    mutations,
    actions
}
//b.js
const state = {
    count:2
}
const mutations = {
    add(state,num){
        state.count+=num
    },
    reduce(state){
        state.count--
    }
}
const actions={
    add:({commit},num)=>{
        commit('add',num)
    },
    reduce:({commit})=>{
        commit('reduce')
    }
}

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

這里分別定義一個(gè)價(jià)格和數(shù)量的state屬性适贸,用來改變數(shù)據(jù)灸芳。
index.js里面代碼為:

import Vue from 'vue'
import Vuex from 'vuex'
import money from './modules/a'
import count from './modules/b'

Vue.use(Vuex)

export default new Vuex.Store({
    modules: {
        money,
        count
    }
})

這里主要的就是導(dǎo)出的時(shí)候,是將moneycountmodule模塊的形式導(dǎo)出拜姿,然后在main.js里面注冊store

import Vue from 'vue'
import App from './App.vue'
import store from './store/index'

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
  store
}).$mount('#app')

這樣就可以使用a.jsb.js里面的state了烙样。表示方式為:

$store.state.money.money //a.js里面state
$store.state.count.count//b.js里面的state

這樣的話,就把a.jsb.jsstate都綁定到store.state上面蕊肥。不管哪個(gè)界面都可以去使用任意的state谒获。

這里還需要說明的是a.jsb.js里面的mutation的使用。先在components里面創(chuàng)建a.vue壁却、b.vue界面批狱。界面中分發(fā)a.jsb.js的action寫法如下:

<script>
import { mapActions } from "vuex";
export default {
  methods: mapActions("count", ["add", "reduce"])
//沒有聲明module的時(shí)候用法
 // methods: mapActions( ["add", "reduce"])
};
</script>

值得注意的是,這里mapActions后面不是直接跟a.jsb.jsaction展东,而是第一個(gè)參數(shù)聲明module模塊count,后面跟著count里面的actions赔硫。
如何使用分發(fā)的actions?其實(shí)是和之前是一樣的

<button @click="add(num)">單價(jià)增加</button>
<button @click="reduce(num)">單價(jià)減少</button>

這里就實(shí)現(xiàn)了不管是a.vue還是b.vue都可以使用a.jsb.jsactionsstate
如果a.vue里面想要使用a.jsb.jsactions,則寫法需要改變下盐肃,如:

<script>
import { mapActions } from "vuex";
export default {
  methods: {
    ...mapActions("money", ["add1", "reduce1"])
    ...mapActions("count", ["add", "reduce"])
}
};
</script>

這樣使用的話爪膊,多個(gè)module的方法命名是不能重復(fù)的权悟,不然會(huì)實(shí)現(xiàn)最后一個(gè)module里面的方法。
用法:

<button @click="add1(num)">單價(jià)增加</button>
<button @click="reduce1(num)">單價(jià)減少</button>
<br>
<button @click="add(num)">數(shù)量增加</button>
<button @click="reduce(num)">數(shù)量減少</button>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末推盛,一起剝皮案震驚了整個(gè)濱河市峦阁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌小槐,老刑警劉巖拇派,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荷辕,死亡現(xiàn)場離奇詭異凿跳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)疮方,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門控嗜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人骡显,你說我怎么就攤上這事疆栏。” “怎么了惫谤?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵壁顶,是天一觀的道長。 經(jīng)常有香客問我溜歪,道長若专,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任蝴猪,我火速辦了婚禮调衰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘自阱。我一直安慰自己嚎莉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布沛豌。 她就那樣靜靜地躺著趋箩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪加派。 梳的紋絲不亂的頭發(fā)上叫确,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音哼丈,去河邊找鬼启妹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛醉旦,可吹牛的內(nèi)容都是我干的饶米。 我是一名探鬼主播桨啃,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼檬输!你這毒婦竟也來了照瘾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤丧慈,失蹤者是張志新(化名)和其女友劉穎析命,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逃默,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鹃愤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了完域。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片软吐。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吟税,靈堂內(nèi)的尸體忽然破棺而出凹耙,到底是詐尸還是另有隱情,我是刑警寧澤肠仪,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布肖抱,位于F島的核電站,受9級(jí)特大地震影響异旧,放射性物質(zhì)發(fā)生泄漏意述。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一泽艘、第九天 我趴在偏房一處隱蔽的房頂上張望欲险。 院中可真熱鬧,春花似錦匹涮、人聲如沸天试。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喜每。三九已至,卻和暖如春雳攘,著一層夾襖步出監(jiān)牢的瞬間带兜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工吨灭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刚照,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓喧兄,卻偏偏與公主長得像无畔,于是被迫代替她去往敵國和親啊楚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345