vuex action回調(diào)函數(shù)

我們知道卿堂, Vuex 是一個專為 Vue.js 應用程序開發(fā)的狀態(tài)管理模式
這個狀態(tài)自管理應用包含以下幾個部分:

  • state懒棉,驅(qū)動應用的數(shù)據(jù)源草描;
  • view,以聲明方式將 state 映射到視圖策严;
  • actions穗慕,響應在 view 上的用戶輸入導致的狀態(tài)變化。

對于state數(shù)據(jù)源的處理妻导,分為兩種類型的操作:

  • mutations. mutations方法內(nèi)可直接修改state數(shù)據(jù)源逛绵,相當于setter方法,但這些方法內(nèi)不允許執(zhí)行異步操作倔韭。
  • getters. 用于獲取一些基于state數(shù)據(jù)源的計算值术浪。getters方法只能讀取state數(shù)據(jù)源的值,不能修改state數(shù)據(jù)源寿酌。

vuex整體大致架構如下:

vuex架構.png

可以看出胰苏,整個流程是單向的、閉環(huán)的醇疼。這符合狀態(tài)管理模式的特點硕并。

1.Action

Action的作用與Mutations類似,但它與Mutations有如下區(qū)別:

  • Action修改數(shù)據(jù)源是通過commit Mutations的方式來實現(xiàn)
  • Action支持執(zhí)行異步操作

一個簡單的action示例如下:

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

2.Action函數(shù)回調(diào)

在某些情況下秧荆,我們可能需要在action執(zhí)行完成后做一些操作倔毙,那么就要在action執(zhí)行完成后,回調(diào)一個函數(shù)回來辰如。那么普监,你可能會想著在payload里面添加一個回調(diào)函數(shù)的變量,如下:

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: {
    increment ({commit}, payload) {
      context.commit('increment')
      if (payload.success) payload.success()
    }
  }
})

然后在頁面中dispatch action:

this.$store.dispatch("increment", {
    success() {
        alert("incremented!")
    }
})

通過這種方式回調(diào)函數(shù)雖然會執(zhí)行,但是會存在如下問題:

  • 如果commit mutation中包含payload變量的屬性凯正,且該屬性是一個對象列表毙玻,那么mutation可能獲取不到commit過來的變量或者結果不對,如下:
const store = new Vuex.Store({
  state: {
    count: 0,
    list: []
  },
  mutations: {
    increment ({state}, index) {
      // list的內(nèi)容可能跟你commit時的結果不一樣
      state.list= list
      state.count++
    }
  },
  actions: {
    increment ({commit}, payload) {
      // commit時附帶payload的屬性值
      context.commit('increment', payload.index)
      if (payload.success) payload.success()
    }
  }
})

在頁面中dispatch action:

this.$store.dispatch("increment", {
    list: [{name: '李白'}, {name: '高漸離'}, {name: '蓋聶'}]
    success() {
        alert("incremented!")
    }
})

因此不要在payload中添加方法屬性廊散,不然commit時數(shù)據(jù)會出錯桑滩。那么又該怎么實現(xiàn)函數(shù)回調(diào)呢,vuex官方文檔中提供了解決方案:

actions: {
  actionA ({ commit }) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        commit('someMutation')
        resolve()
      }, 1000)
    })
  }
}

現(xiàn)在你可以:

store.dispatch('actionA').then(() => {
  // ...
})
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末允睹,一起剝皮案震驚了整個濱河市运准,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缭受,老刑警劉巖胁澳,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異米者,居然都是意外死亡韭畸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門蔓搞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胰丁,“玉大人,你說我怎么就攤上這事喂分〗跤梗” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵蒲祈,是天一觀的道長甘萧。 經(jīng)常有香客問我,道長讳嘱,這世上最難降的妖魔是什么幔嗦? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮沥潭,結果婚禮上邀泉,老公的妹妹穿的比我還像新娘。我一直安慰自己钝鸽,他們只是感情好汇恤,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拔恰,像睡著了一般因谎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上颜懊,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天财岔,我揣著相機與錄音风皿,去河邊找鬼。 笑死匠璧,一個胖子當著我的面吹牛桐款,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播夷恍,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼魔眨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了酿雪?” 一聲冷哼從身側(cè)響起遏暴,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎指黎,沒想到半個月后朋凉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡袋励,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年侥啤,在試婚紗的時候發(fā)現(xiàn)自己被綠了当叭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茬故。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蚁鳖,靈堂內(nèi)的尸體忽然破棺而出磺芭,到底是詐尸還是另有隱情,我是刑警寧澤醉箕,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布钾腺,位于F島的核電站,受9級特大地震影響讥裤,放射性物質(zhì)發(fā)生泄漏放棒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一己英、第九天 我趴在偏房一處隱蔽的房頂上張望间螟。 院中可真熱鬧,春花似錦损肛、人聲如沸厢破。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摩泪。三九已至,卻和暖如春劫谅,著一層夾襖步出監(jiān)牢的瞬間见坑,已是汗流浹背嚷掠。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留荞驴,地道東北人叠国。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像戴尸,于是被迫代替她去往敵國和親粟焊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

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

  • 安裝 npm npm install vuex --save 在一個模塊化的打包系統(tǒng)中孙蒙,您必須顯式地通過Vue.u...
    蕭玄辭閱讀 2,938評論 0 7
  • vuex 場景重現(xiàn):一個用戶在注冊頁面注冊了手機號碼项棠,跳轉(zhuǎn)到登錄頁面也想拿到這個手機號碼,你可以通過vue的組件化...
    sunny519111閱讀 8,017評論 4 111
  • Vuex是什么挎峦? Vuex 是一個專為 Vue.js應用程序開發(fā)的狀態(tài)管理模式香追。它采用集中式存儲管理應用的所有組件...
    蕭玄辭閱讀 3,120評論 0 6
  • 上一章總結了 Vuex 的框架原理,這一章我們將從 Vuex 的入口文件開始坦胶,分步驟閱讀和解析源碼透典。由于 Vuex...
    你的肖同學閱讀 1,788評論 3 16
  • Vuex 是一個專為 Vue.js 應用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲管理應用的所有組件的狀態(tài)顿苇,并以相應...
    白水螺絲閱讀 4,668評論 7 61