Action 可以包含任意異步操作,需要的朋友可以參考下" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vuex之Action的使用方法詳解

 更新時間:2023年11月13日 11:02:01   作者:mumuwei_l  
這篇文章主要介紹了Vuex之Action的使用方法詳解,Action 類似于 mutation ,不同在于Action 提交的是 mutation,而不是直接變更狀態(tài),
Action 可以包含任意異步操作,需要的朋友可以參考下

前言

在 mutation 中混合異步調(diào)用會導致你的程序很難調(diào)試。例如,當你調(diào)用了兩個包含異步回調(diào)的 mutation 來改變狀態(tài),你怎么知道什么時候回調(diào)和哪個先回調(diào)呢?這就是為什么我們要區(qū)分這兩個概念。在 Vuex 中,mutation 都是同步事務:

store.commit('add')// 任何由 "add" 導致的狀態(tài)變更都應該在此刻完成。

因此,Action 就出現(xiàn)了。

一、什么是 Action

Action 類似于 mutation ,不同在于:

  • Action 提交的是 mutation,而不是直接變更狀態(tài)。
  • Action 可以包含任意異步操作。

讓我們來注冊一個簡單的 action:

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

Action 函數(shù)接受一個與 store 實例具有相同方法和屬性的 context 對象,因此你可以調(diào)用 context.commit 提交一個 mutation,或者通過 context.state 和 context.getters 來獲取 state 和 getters。當我們在之后介紹到 Modules 時,你就知道 context 對象為什么不是 store 實例本身了。

實踐中,我們會經(jīng)常用到 ES2015 的 參數(shù)解構(gòu) (opens new window)來簡化代碼(特別是我們需要調(diào)用 commit 很多次的時候):

actions: {
  add({ commit }) {
    commit('add')
  }
}

二、分發(fā) Action(調(diào)用 Action)

Action 通過 store.dispatch 方法觸發(fā):

store.dispatch('add')

乍一眼看上去感覺多此一舉,我們直接分發(fā) mutation 豈不更方便?實際上并非如此,因為 mutation 必須同步執(zhí)行.。Action 就不受約束!我們可以在 action 內(nèi)部執(zhí)行異步操作:

actions: {
  addAsync ({ commit }) {
    setTimeout(() => {
      commit('add')
    }, 1000)
  }
}

Actions 支持同樣的 載荷方式和對象方式進行分發(fā):

// 以載荷形式分發(fā)
store.dispatch('addAsync', {
  amount: 10
})

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

三、在組件中分發(fā) Action

在組件中使用 this.$store.dispatch('xxx') 分發(fā) action,或者使用 mapActions 輔助函數(shù)將組件的 methods 映射為 store.dispatch 調(diào)用(需要先在根節(jié)點注入 store):

// main.js
// 根節(jié)點引入store
new Vue({
  el: '#app',
  store
})
// 組件
import { mapActions } from 'vuex'

export default {
  methods: {
     // 將 `this.add()` 映射為 `this.$store.dispatch('add')`
     // `mapActions` 也支持載荷:
     // 將 `this.addBy(amount)` 映射為 `this.$store.dispatch('addBy', amount)`
    ...mapActions(['add', 'addBy']),
    // 將 `this.increment()` 映射為 `this.$store.dispatch('add')`
    ...mapActions({
      increment: 'add' 
    })
  }
}

四、組合 Action

Action 通常是異步的,那么如何知道 action 什么時候結(jié)束呢?更重要的是,我們?nèi)绾尾拍芙M合多個 action,以處理更加復雜的異步流程?

首先,你需要明白 store.dispatch 可以處理被觸發(fā)的 action 的處理函數(shù)返回的 Promise,并且 store.dispatch 仍舊返回 Promise:

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

現(xiàn)在你可以調(diào)用

store.dispatch('actionA').then(() => {
  // 成功操作
})

在另外一個 action 中也可以:

actions: {
  actionB ({ dispatch, commit }) {
    return dispatch('actionA').then(() => {
      commit('someOtherMutation')
    })
  }
}

最后,如果我們利用 async / await我們可以如下組合 action:

// 假設 getData() 和 getOtherData() 返回的是 Promise

actions: {
  async actionA ({ commit }) {
    commit('gotData', await getData())
  },
  async actionB ({ dispatch, commit }) {
    await dispatch('actionA') // 等待 actionA 完成
    commit('gotOtherData', await getOtherData())
  }
}

一個store.dispatch 在不同模塊中可以觸發(fā)多個 action 函數(shù)。在這種情況下,只有當所有觸發(fā)函數(shù)完成后,返回的 Promise 才會執(zhí)行。

到此這篇關于Vuex之Action的使用方法詳解的文章就介紹到這了,更多相關Vuex的Action內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Vue+Elementui el-tree樹只能選擇子節(jié)點并且支持檢索功能

    Vue+Elementui el-tree樹只能選擇子節(jié)點并且支持檢索功能

    這篇文章給大家介紹了Vue+Element UI el-tree樹只能選擇子節(jié)點并且支持檢索的文章,通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • vue如何導出文件流獲取附件名稱并下載(在response.headers里解析filename導出)

    vue如何導出文件流獲取附件名稱并下載(在response.headers里解析filename導出)

    這篇文章主要介紹了vue如何導出文件流獲取附件名稱并下載(在response.headers里解析filename導出),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 利用Vue.js框架實現(xiàn)火車票查詢系統(tǒng)(附源碼)

    利用Vue.js框架實現(xiàn)火車票查詢系統(tǒng)(附源碼)

    這篇文章主要介紹了利用Vue.js框架實現(xiàn)火車票查詢系統(tǒng)的相關資料,,文中給出了詳細的介紹與示例代碼,并在文章結(jié)尾給出了完整的項目下載,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • Vue中強制組件重新渲染的正確方法

    Vue中強制組件重新渲染的正確方法

    這篇文章主要介紹了Vue中強制組件重新渲染的正確方法,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下
    2021-01-01
  • 解決Vue項目中Emitted value instead of an instance of Error問題

    解決Vue項目中Emitted value instead of an 

    這篇文章主要介紹了解決Vue項目中Emitted value instead of an instance of Error問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • vue.js中Vue-router 2.0基礎實踐教程

    vue.js中Vue-router 2.0基礎實踐教程

    這篇文章主要給大家介紹了關于vue.js中Vue-router 2.0基礎實踐的相關資料,其中包括vue-router 2.0的基礎用法、動態(tài)路由匹配、嵌套路由、編程式路由、命名路由以及命名視圖等相關知識,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-05-05
  • Vue3 插槽使用匯總

    Vue3 插槽使用匯總

    這篇文章主要給大家分享了Vue3的 插槽使用匯總,在 2.6.0中,vue 為具名插槽和作用于插槽引入了一個新的統(tǒng)一語法:v-slot。它取代了 slot 和 slot-scope 在新版中的應用,下面就一起來看看文章的詳細內(nèi)容吧
    2021-12-12
  • 解決vue打包css文件中背景圖片的路徑問題

    解決vue打包css文件中背景圖片的路徑問題

    今天小編就為大家分享一篇解決vue打包css文件中背景圖片的路徑問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • vue中使用elementUI組件手動上傳圖片功能

    vue中使用elementUI組件手動上傳圖片功能

    Vue是一套構(gòu)建用戶界面的框架, 開發(fā)只需要關注視圖層, 它不僅易于上手,還便于與第三方庫或既有項目的整合。這篇文章主要介紹了vue中使用elementUI組件手動上傳圖片,需要的朋友可以參考下
    2019-12-12
  • vue實現(xiàn)數(shù)字動態(tài)翻牌的效果(開箱即用)

    vue實現(xiàn)數(shù)字動態(tài)翻牌的效果(開箱即用)

    這篇文章主要介紹了vue實現(xiàn)數(shù)字動態(tài)翻牌的效果(開箱即用),實現(xiàn)原理是激將1到9的數(shù)字豎直排版,通過translate移動位置顯示不同數(shù)字,本文通過實例代碼講解,需要的朋友可以參考下
    2019-12-12

最新評論

慈溪市| 平定县| 德惠市| 西昌市| 思茅市| 太仆寺旗| 林州市| 嘉祥县| 高州市| 玉林市| 筠连县| 吉安县| 襄樊市| 宁武县| 丰顺县| 绍兴县| 台湾省| 浮山县| 台中县| 江永县| 玛纳斯县| 三亚市| 大庆市| 吉首市| 宁晋县| 邵阳县| 米泉市| 南阳市| 乐业县| 长宁县| 府谷县| 黔西| 东丽区| 龙胜| 西宁市| 衡水市| 西青区| 广南县| 山东省| 阿坝县| 武城县|