Vuex使用介紹(二)

Mutation

Vuex 通過commit一個(gè)mutation來對(duì)state進(jìn)行更改陡鹃。每個(gè) mutation 都有一個(gè)字符串的 事件類型 (type) 和 一個(gè) 回調(diào)函數(shù) (handler)。這個(gè)回調(diào)函數(shù)就是我們實(shí)際進(jìn)行狀態(tài)更改的地方抖坪,并且它會(huì)接受 state 作為第一個(gè)參數(shù):

const mutations = {
  increment (state) {
    state.count++
  },
  decrement (state) {
    state.count--
  }
}

通過store.commit方法調(diào)用響應(yīng)的mutation

store.commit('increment')

向mutation中傳入額外參數(shù)(最好是一個(gè)對(duì)象)

  incrementNum (state, num) {
    state.count = state.count + num
  }
incrementNum: ({ commit }, num) => commit('incrementNum', num),

對(duì)象風(fēng)格的提交方式
提交 mutation 的另一種方式是直接使用包含 type 屬性的對(duì)象:

store.commit({
  type: 'increment',
  num: 10
})

Mutation 必須是同步函數(shù)
mutation的作用是要該表state狀態(tài)擦俐,mutation函數(shù)中的state的狀態(tài)必須是可追蹤的,當(dāng)使用異步方法的時(shí)候蚯瞧,會(huì)導(dǎo)致devtools無法定位何時(shí)異步回調(diào)函數(shù)被調(diào)用嘿期,從而導(dǎo)致state改變不可追蹤。
在組件中提交 Mutation
不常用埋合,一般通過actions 的dispatch 分發(fā)一個(gè)action备徐,在action中進(jìn)行commit mutation。
你可以在組件中使用 this.$store.commit('xxx') 提交 mutation甚颂,或者使用 mapMutations 輔助函數(shù)將組件中的 methods 映射為 store.commit 調(diào)用(需要在根節(jié)點(diǎn)注入 store)蜜猾。

import { mapMutations } from 'vuex'

export default {
  // ...
  methods: {
    ...mapMutations([
      'increment', // 將 `this.increment()` 映射為 `this.$store.commit('increment')`
      // `mapMutations` 也支持額外參數(shù):
      'incrementNum' // 將 `this.incrementBy(num)` 映射為 `this.$store.commit('incrementBy', num)`,組件中調(diào)用此方法的時(shí)候傳參,此處不需要顯示聲明參數(shù)
    ])
  }
}

Action

Action 類似于 mutation振诬,不同在于:
1.Action 提交的是 mutation蹭睡,而不是直接變更狀態(tài)。
2.Action 可以包含任意異步操作赶么。
actions注冊(cè):

const actions = {
  incrementNum: ({ commit }, num) => commit('incrementNum', num),
  increment: ({ commit }) => commit('increment'),
  decrement: ({ commit }) => commit('decrement'),
  incrementIfOdd ({ commit, state }) {
    if ((state.count + 1) % 2 === 0) {
      commit('increment')
    }
  },
  incrementAsync ({ commit }) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        commit('increment')
        resolve()
      }, 1000)
    })
  }
}

Action接收context對(duì)象作為參數(shù)肩豁,具有和store相同的方法和屬性,如state,getters清钥,commit琼锋,dispatch,所以也可以調(diào)用這些屬性和方法祟昭,通常通過結(jié)構(gòu)賦值使用缕坎。
分發(fā)action
Action 通過 store.dispatch 方法觸發(fā):

store.dispatch('increment')

Action內(nèi)部可以執(zhí)行異步操作

actions: {
  incrementAsync ({ commit }) {
    setTimeout(() => {
      commit('increment')
    }, 1000)
  }
}

支持提供額外參數(shù):

// 以載荷(額外參數(shù))形式分發(fā)
store.dispatch('incrementAsync', {
  amount: 10
})

// 以對(duì)象形式分發(fā)
store.dispatch({
  type: 'incrementAsync',
  amount: 10
})

store.dispatch 可以處理被觸發(fā)的 action 的處理函數(shù)返回的 Promise,并且 store.dispatch 仍舊返回 Promise

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末从橘,一起剝皮案震驚了整個(gè)濱河市念赶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恰力,老刑警劉巖叉谜,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異踩萎,居然都是意外死亡停局,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門香府,熙熙樓的掌柜王于貴愁眉苦臉地迎上來董栽,“玉大人,你說我怎么就攤上這事企孩《迹” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵勿璃,是天一觀的道長擒抛。 經(jīng)常有香客問我,道長补疑,這世上最難降的妖魔是什么歧沪? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮莲组,結(jié)果婚禮上诊胞,老公的妹妹穿的比我還像新娘。我一直安慰自己锹杈,他們只是感情好撵孤,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嬉橙,像睡著了一般早直。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上市框,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音糕韧,去河邊找鬼枫振。 笑死喻圃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粪滤。 我是一名探鬼主播斧拍,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼杖小!你這毒婦竟也來了肆汹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤予权,失蹤者是張志新(化名)和其女友劉穎昂勉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扫腺,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岗照,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了笆环。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片攒至。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖躁劣,靈堂內(nèi)的尸體忽然破棺而出迫吐,到底是詐尸還是另有隱情,我是刑警寧澤账忘,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布志膀,位于F島的核電站,受9級(jí)特大地震影響闪萄,放射性物質(zhì)發(fā)生泄漏梧却。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一败去、第九天 我趴在偏房一處隱蔽的房頂上張望放航。 院中可真熱鬧,春花似錦圆裕、人聲如沸广鳍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赊时。三九已至,卻和暖如春行拢,著一層夾襖步出監(jiān)牢的瞬間祖秒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留竭缝,地道東北人房维。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像抬纸,于是被迫代替她去往敵國和親咙俩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

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

  • 安裝 npm npm install vuex --save 在一個(gè)模塊化的打包系統(tǒng)中湿故,您必須顯式地通過Vue.u...
    蕭玄辭閱讀 2,945評(píng)論 0 7
  • ### store 1. Vue 組件中獲得 Vuex 狀態(tài) ```js //方式一 全局引入單例類 // 創(chuàng)建一...
    蕓豆_6a86閱讀 732評(píng)論 0 3
  • State 單一狀態(tài)樹 Vuex使用單一狀態(tài)樹——用一個(gè)對(duì)象就包含了全部的應(yīng)用層級(jí)狀態(tài)阿趁。至此它便作為一個(gè)“唯一數(shù)據(jù)...
    oWSQo閱讀 1,093評(píng)論 0 0
  • ### store 1. Vue 組件中獲得 Vuex 狀態(tài) ```js //方式一 全局引入單例類 // 創(chuàng)建一...
    蕓豆_6a86閱讀 346評(píng)論 0 0
  • 午飯時(shí)托輔老師給我打電話說立丹在學(xué)校吐了,我一聽就急了坛猪,趕緊請(qǐng)了假回家脖阵。老師說接她的時(shí)候看到她的眼睛紅紅的...
    月中丹桂自扶疏閱讀 173評(píng)論 0 0