挑戰全網最幽默的Vuex系列教程:第四講 Vuex旗下的Action

来源:https://www.cnblogs.com/justbecoder/archive/2020/04/26/12777834.html
-Advertisement-
Play Games

寫在前面 通過上一講「Vuex 旗下的 Mutation」,我們知道瞭如何去修改 State 的數據,而且只能通過 Mutation 去提交修改,另外還瞭解到了 Mutation 必須是同步函數,那麼如果需求當中必須要用到非同步函數怎麼辦? 好辦,那就輪到 Action 上場了。 簡單介紹 Actio ...


寫在前面

通過上一講「Vuex 旗下的 Mutation」,我們知道瞭如何去修改 State 的數據,而且只能通過 Mutation 去提交修改,另外還瞭解到了 Mutation 必須是同步函數,那麼如果需求當中必須要用到非同步函數怎麼辦?

好辦,那就輪到 Action 上場了。

簡單介紹

Action 類似於 mutation,不同在於:

1、Action 提交的是 mutation,而不是直接變更狀態。
2、Action 可以包含任意非同步操作。

看一個簡單的 action 示例:

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

可以看到,Action 函數接受一個 context 參數,註意,這個參數可不一般,它與 store 實例有著相同的方法和屬性,但是他們並不是同一個實例,後面學習 Modules 的時候會介紹它們為什麼不一樣。

所以在這裡可以使用 context.commit 來提交一個 mutation,或者通過 context.statecontext.getters 來獲取 state 和 getters。

當然,為了代碼簡化,我們可以使用 ES2015 的 參數解構 來直接展開,便於 commitstate 等多次調用。如下:

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

分發 Action

store.dispatch('increment')

Mutation 通過 store.commit 觸發,那麼 Action 則通過 store.dispatch 方法觸發。

乍一眼看上去感覺多此一舉,我們直接分發 mutation 豈不更方便?實際上並非如此,還記得 mutation 必須同步執行這個限制麽?Action 就不受約束!我們可以在 action 內部執行非同步操作:

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

和 Mutation 分發的方式異曲同工,這是註意這裡是 dispatch

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

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

來看一個更加實際的購物車示例,涉及到調用非同步 API 和分發多重 mutation:

actions: {
  checkout ({ commit, state }, products) {
    // 把當前購物車的物品備份起來
    const savedCartItems = [...state.cart.added]
    // 發出結賬請求,然後樂觀地清空購物車
    commit(types.CHECKOUT_REQUEST)
    // 購物 API 接受一個成功回調和一個失敗回調
    shop.buyProducts(
      products,
      // 成功操作
      () => commit(types.CHECKOUT_SUCCESS),
      // 失敗操作
      () => commit(types.CHECKOUT_FAILURE, savedCartItems)
    )
  }
}

註意示例中正在進行一系列的非同步操作,並且通過提交 mutation 來記錄 action 產生的副作用(即狀態變更)。

組合 Action
Action 通常是非同步的,那麼如何知道 action 什麼時候結束呢?更重要的是,我們如何才能組合多個 action,以處理更加複雜的非同步流程?

首先,你需要明白 store.dispatch 可以處理被觸發的 action 的處理函數返回的 Promise,並且 store.dispatch 仍舊返回 Promise:

不知道什麼是 Promise 的,可以 戳此瞭解下

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

調用:

store.dispatch('actionA').then(() => {
  // ...
})

當然,也可以這樣:

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 在不同模塊中可以觸發多個 action 函數。在這種情況下,只有當所有觸發函數完成後,返回的 Promise 才會執行。

我們在實際項目中經常的會遇到這種情況,比如說你現在想要處理 B 事件,但是 B 事件需要一種資源才能進行,而這種資源必須通過 A 事件來獲得。這個時候,我們就需要組合 Action 來處理這些事件了。

寫在最後

這一講官方講解得非常清晰,基本上沒啥難理解的,所以大部分都是直接引用了。當然,有任何的疑問都可以在下方留言和我一起溝通討論,謝謝!

轉載聲明:

作者:大巨集說
鏈接:https://www.jianshu.com/p/7238d4d42725

後記

以上就是胡哥今天給大家分享的內容,喜歡的小伙伴記得點贊收藏呦,關註胡哥有話說,學習前端不迷路,歡迎多多留言交流...

胡哥有話說,一個有技術,有情懷的胡哥!現任京東前端攻城獅一枚。
胡哥有話說,專註於大前端技術領域,分享前端系統架構,框架實現原理,最新最高效的技術實踐!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 把方法綁定到對應的對象上,那麼該對象就不用再重寫一遍相同的方法了,這樣就達到了重覆利用的目的。 一、bind方法 使用bind重新綁定對象。 二、apply方法 自行設置綁定對象,傳入數組作為參數。 三、call方法 自行設置綁定對象,傳入參數用逗號隔開。 ...
  • this的含義 this表示的是 綁定的對象 ,通常在函數中使用。 不同的代碼形式下, 綁定的對象 代表不同的東西。 下麵看一下常見的幾種代碼形式: 一、獨立的函數 二、對象的方法 三、事件處理程式 四、構造函數 ...
  • 在前段頁面展示中,需要把 編碼 轉義成 文字 展示到頁面上: 0100001 文字1 case “0100001” : "s=文字1" (轉換成case語句,以下相同) 0100002 文字2 0100003 文字3 0100004 文字4 0100005 文字5 0100006 文字6 01000 ...
  • html <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title></title> </head> <body> <div id="app"><input type="text" v-model="text" /> {{text}} ...
  • 實現思路主要組件嵌套(組件自己調用自己) 下麵是組件所需要的數據 { "code": 1, "data": { "menuVoList": [ { "childList": [ { "childList": [], "menu": { "createBy": "0-1", "createTime": ...
  • Vue.js文檔 介紹 1. Vue.js是什麼? 用於構建用戶界面的漸進式框架(漸進式JavaScript框架) 和其他大型框架的區別:自底層向上,逐層應用 核心庫只關註視圖層,易上手,便於和第三方庫和既有項目整合 為複雜單頁提供驅動(結合其他工具和支持類庫) Vue和其他庫/框架的區別:等文檔學 ...
  • 實現滑鼠左鍵拖拽效果的兩種方式: 方式一: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale= ...
  • this 去哪? 本文寫於 2020 年 4 月 26 日 最後兩行函數的值為什麼不一樣??? 之前關於函數的文章里寫過了, 可以讓 和`obj.foo()`等價,那為什麼 this 指向不一樣? 在學 React 的時候,很多人會發現有個很煩人的操作,就是在 裡面,需要 。 首先需要從函數的調用開 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...