簡(jiǎn)單理解 vuex

Vuex

狀態(tài)管理模式

集中式存儲(chǔ)管理應(yīng)用的所有組件的狀態(tài)灌灾,以相應(yīng)的規(guī)則保證狀態(tài)以一種可以預(yù)測(cè)的方式發(fā)生變化室囊。

容器 store

倉(cāng)庫(kù)包含應(yīng)用中大部分狀態(tài)万搔。

  1. 響應(yīng)式存儲(chǔ)蘸嘶,組件從 store 中讀取狀態(tài)時(shí),若store 中的狀態(tài)發(fā)生變化计雌,相應(yīng)組件也會(huì)相應(yīng)得到高效刷新悄晃;
  2. 不能直接改變 store 中的狀態(tài)。唯一途徑就是顯示提交 mutation -> 可以方便跟蹤每一個(gè)狀態(tài)的變化凿滤。

創(chuàng)建 store传泊,僅需提供初始 state 對(duì)象和一些 mutation:

// 如果在模塊化構(gòu)建系統(tǒng)中,請(qǐng)確保在開頭調(diào)用了 Vue.use(Vuex)

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  }
})

通過(guò) store.state 來(lái)獲取狀態(tài)對(duì)象鸭巴,通過(guò) store.commit 方法觸發(fā)狀態(tài)變更:

store.commit('increment')

console.log(store.state.count) // -> 1

核心概念

  • State
    單一狀態(tài)樹眷细。Store 倉(cāng)庫(kù)中的 數(shù)據(jù) 狀態(tài) state。
// module1.js
const state = {
    count: 0,
    firstName: 'Kofe',
    lastName: 'Chen'
}
  • Getter
    Store 的 計(jì)算屬性鹃祖,其返回值會(huì)根據(jù)它的依賴被緩存起來(lái)溪椎,只有依賴值發(fā)生改變才會(huì)重新計(jì)算。
// module1.js
const getters = {
    // 直接拋出其值
    count: state => state.count,  
    // 根據(jù)依賴
    fullName: state => state.firstName + ' ' + state.lastName  
}
  • Mutation
    更改 Vuex 的 store 中狀態(tài)的唯一 方法 是提交 mutation (類似事件),每個(gè) mutation 都有一個(gè)字符串的事件類型(type)和一個(gè)回調(diào)函數(shù)(handler)校读。
    回調(diào)函數(shù)就是實(shí)際進(jìn)行狀態(tài)更改的地方沼侣,且會(huì)接受 state 作為第一個(gè)參數(shù)。
// module1.js
const mutations = {
    increment(state) {
        state.count ++
    },
    modifyFirstName(state, newName) {
        state.firstName = newName
    },
    modifyLastName(state, newName) {
        state.lastName = newName
    }
}
  • Action
    類似 mutation歉秫,Action 提交的是 mutation蛾洛,但不是直接變更狀態(tài)。Action 可以包含任意 異步操作雁芙。
// module1.js
const actions = {
    // 第一個(gè)參數(shù)是默認(rèn)的 { commit }
    changeFullName({ commit }, { firstName, lastName }) {
        // 假定 getName 方法返回 promise 對(duì)象
        // 并且提交 firstName 和 lastName 轧膘,如果修改成功則提交 mutation
        return getName({ firstName, lastName }).then(res => {
            commit('modifyFirstName', res.firstName)
            commit('modifyLastName', res.lastName)
        })
    },

    // 與上面的寫法相同,返回的仍然是 promise 對(duì)象
    async changeFullName({ commit }, { firstName, lastName }) {
        let res = await getName({ firstName, lastName })
        commit('modifyFirstName', res.firstName)
        commit('modifyLastName', res.lastName)
        // 這里返回調(diào)用的時(shí)候想得到 then 里面的數(shù)據(jù)
        return res
    }
}
  • Module
    Vuex 允許將 store 分割成 module兔甘,每個(gè)模塊擁有自己的 state谎碍、mutation、action洞焙、getter或甚至是嵌套子模塊蟆淀。數(shù)據(jù)量大復(fù)雜可以拆分成不同模塊。
// index.js
import module1 from './modules/module1'
import module2 from './modules/module2'
// 如果在模塊化構(gòu)建系統(tǒng)中澡匪,請(qǐng)確保在開頭調(diào)用了 Vue.use(Vuex)
Vue.use(Vuex)
export default new Vuex.Store({
    modules: {
        module1,
        module2
    }
})

示例代碼文件格式

| -- store
    index.js
    | -- modules
        | -- module1.js
        | -- module2.js

module1.js 補(bǔ)充代碼

export default {
    state,
    getters,
    mutations,
    actions
}

使用

main.js 中引入 store:

// ...省略
import store from './store'

Vue.config.productionTip = false

new Vue({
  el: '#app',
  router,
  store,
  components: { App },
  template: '<App/>'
})

組件中使用:

<template>
    <div>{{fullName}}</div>
    <input v-model="firstName" placeholder="firstName">
    <input v-model="lastName" placeholder="lastName" >
    <a href="#" @click="onChange">改變?nèi)?lt;/a>
</template>

<script>
import { mapGetters, mapActions } from 'vuex'

export default {
    data() {
        return {
            firstName: '',
            lastName: ''
        }
    },

    computed: {
        ...mapGetters([
            'count',
            'fullName'
        ])
    },

    methods: {
        ...mapActions([
            'changeFullName'
        ]),

        onChange() {
            this.changeFullName({ firstName: this.firstName, lastName: this.lastName })
                .then(() => { 
                    // ...
                })
        }
    }
}
</script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末熔任,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子唁情,更是在濱河造成了極大的恐慌疑苔,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荠瘪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡赛惩,警方通過(guò)查閱死者的電腦和手機(jī)哀墓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)喷兼,“玉大人篮绰,你說(shuō)我怎么就攤上這事〖竟撸” “怎么了吠各?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)勉抓。 經(jīng)常有香客問(wèn)我贾漏,道長(zhǎng),這世上最難降的妖魔是什么藕筋? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任纵散,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘伍掀。我一直安慰自己掰茶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布蜜笤。 她就那樣靜靜地躺著濒蒋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪把兔。 梳的紋絲不亂的頭發(fā)上沪伙,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音垛贤,去河邊找鬼焰坪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛聘惦,可吹牛的內(nèi)容都是我干的某饰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼善绎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼黔漂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起禀酱,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤炬守,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后剂跟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體减途,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年曹洽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鳍置。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡送淆,死狀恐怖税产,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情偷崩,我是刑警寧澤辟拷,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站阐斜,受9級(jí)特大地震影響衫冻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谒出,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一羽杰、第九天 我趴在偏房一處隱蔽的房頂上張望渡紫。 院中可真熱鬧,春花似錦考赛、人聲如沸惕澎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)唧喉。三九已至,卻和暖如春忍抽,著一層夾襖步出監(jiān)牢的瞬間八孝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工鸠项, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留干跛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓祟绊,卻偏偏與公主長(zhǎng)得像楼入,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子牧抽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354