react系列(六)Redux Saga

来源:https://www.cnblogs.com/liuyongjia/archive/2018/11/04/9905523.html
-Advertisement-
Play Games

在Redux中常要管理非同步操作,目前社區流行的有Redux Saga、Redux thunk等。在管理複雜應用時,推薦使用Redux Saga,它提供了用 generator 書寫類同步代碼的能力。 在講解 ReduxSaga 前,先要說明一下 Redux Middleware 的概念。 Middl ...


在Redux中常要管理非同步操作,目前社區流行的有Redux-Saga、Redux-thunk等。在管理複雜應用時,推薦使用Redux-Saga,它提供了用 generator 書寫類同步代碼的能力。
在講解 ReduxSaga 前,先要說明一下 Redux Middleware 的概念。

Middleware

它提供的是位於 action 被髮起之後,到達 reducer 之前的擴展點。

如果寫過 Koa 或者 Express ,就會很容易理解 Middleware 的概念。
可以說,Middleware 是一種置於一個調用發起到被處理這段過程之間的函數。它可以對發起的調用進行處理,處理後直接返回,或者調用下一個中間件。
在Redux中,使用柯里化函數聲明中間件,一個簡單的例子如下:

/**
 * 記錄所有被髮起的 action 以及產生的新的 state。
 */
const logger = store => next => action => {
  console.group(action.type)
  console.info('dispatching', action)
  let result = next(action)
  console.log('next state', store.getState())
  console.groupEnd(action.type)
  return result
}

然後需要將它應用到Redux上

import { createStore, combineReducers, applyMiddleware } from 'redux'

const todoApp = combineReducers(reducers)
const store = createStore(
  todoApp,
  // applyMiddleware() 告訴 createStore() 如何處理中間件
  applyMiddleware(logger, crashReporter)
)

之後dispatch的每一個action都會觸發log中間件。
更詳細的用法在Redux文檔里說明得很詳細了,Redux-Middleware

使用Redux Saga

先定一個小目標,寫一個非同步增加的demo。
先來創建一個sagas.js文件,用來存放我們的sagas。

import { delay } from 'redux-saga'
import { put, takeEvery } from 'redux-saga/effects'

export function* plusAsync() {
  yield delay(1000)
  yield put({ type: 'PLUS' })
}

// 在dispatch到store並且匹配pattern的每一個action上派生一個saga
export function* watchPlusAsync() {
  yield takeEvery('PLUS_ASYNC', incrementAsync)
}

在上篇例子的基礎上,增加一個按鈕,用來派發PLUS_ASYNC事件。

 <button onClick={dispatch({type: 'PLUS_ASYNC'}}>{"plusAsync"}</button>

在使用時,經常需要將多個sagas合併成一個。

import { all } from 'redux-saga/effects'

// ...

export default function* rootSaga() {
  yield all([
    watchPlusAsync()
  ])
}

最後,需要創建saga Middleware。並將中間件應用到redux上。

import { createStore, applyMiddleware } from "redux";

// ...

// 創建一個Store
const sagaMiddleware = createSagaMiddleware()
const store = createStore(
  counter,
  applyMiddleware(sagaMiddleware)
)

// 運行sagas
sagaMiddleware.run(allSagas);

常用API說明

middleware.run(saga, ...args)

動態地運行 saga。只能 用於在 applyMiddleware 階段 之後 執行 Saga。

takeEvery(pattern, saga, ...args)

在發起(dispatch)到 Store 並且匹配 pattern 的每一個 action 上派生一個 saga。

pattern用來匹配對應的TYPE,對應到指定的saga處理函數上。
args就是相當於指定給saga的參數數組,並且takeEvery會將action拼到最後一個參數上。

takeLatest(pattern, saga, ...args)

在發起到 Store 並且匹配 pattern 的每一個 action 上派生一個 saga。並自動取消之前所有已經啟動但仍在執行中的 saga 任務。

這個函數可以說是takeEvery的防抖版本。
具體例子可以查看這裡-redux_saga_example

put(action)

創建一個 Effect 描述信息,用來命令 middleware 向 Store 發起一個 action。 這個 effect 是非阻塞型的,並且所有向下游拋出的錯誤(例如在 reducer 中),都不會冒泡回到 saga 當中。

all

創建一個 Effect 描述信息,用來命令 middleware 並行地運行多個 Effect,並等待它們全部完成。這是與標準的 Promise#all 相當對應的 API。

更多API請查看Saga文檔

總結

saga的用法比較簡單,分為4步。

  1. 創建saga並且將使用takeEvery給每一個符合patternaction都增加一個對應的saga處理函數。
  2. 使用all導出編寫的saga。
  3. 創建saga中間件,在使用redux創建store時,應用saga中間件。
  4. 運行中間件。

感謝閱讀。


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

-Advertisement-
Play Games
更多相關文章
  • 資料庫 1. 資料庫伺服器:運行資料庫管理軟體的電腦 2. 資料庫管理軟體:mysql,oracle,db2,sqlserver 3. 庫:文件夾 4. 表:文件 5. 記錄:食物一系列典型的特征 6. 數據:描述事物特征的符號 資料庫的分類: 關係型:sqllite,db2,oracle,acc ...
  • 一. 概述 字典又稱符號表(symbol table),關聯數組(associative array), 映射(map),是一種用於保存鍵值對(key-value pair)的抽象數據結構。在字典中,一個key和一個value進行關聯稱為鍵值對。在字典中每個鍵都是唯一的,程式可以在字典中根據鍵查找關 ...
  • 有很多學習大數據的朋友,在初期學習時,通常會對如何學習而感到迷茫。我經常收到零基礎的朋友關於如何入門、如何規劃學習大數據、大數據的學習流程是什麼的一些問題。今天我就粗淺的總結幾點學習大數據方法。 一、興趣建立 興趣是可以讓一個人持續關註一個事物的核心動力,那麼興趣的培養就非常重要了。如果你把寫程式單 ...
  • 1、CONCAT(str1,str2,...) 返回來自於參數連結的字元串。如果任何參數是NULL,返回NULL。可以有超過2個的參數。一個數字參數被變換為等價的字元串形式。 select CONCAT('My', 'S', 'QL');--'MySQL' select CONCAT('My', N ...
  • 一.概述 在sql server里臨時表存儲在TempDB庫中,TempDB是一個系統資料庫,它只有Simple恢復模式,也是最小日誌記錄操作。主要用於存放局部臨時表,全局臨時表,表變數,都是基於臨時特征,每次伺服器或服務重啟後,都會按照Model庫的配置重新創建TempDB庫。在sql serve ...
  • https://www.bilibili.com/video/av27255821/ ...
  • 轉載請註明出處:https://www.cnblogs.com/Joanna-Yan/p/9896180.html 需求:設備傳回伺服器的軌跡點,需要在web地圖上顯示。包括畫坐標點覆蓋物、軌跡路線圖。當數據量達到一定量時,界面出現卡頓。問題出現幾天前端人員都未解決。 第一反應,大量的覆蓋物肯定不能 ...
  • 在學習ant-desin過程中,發現很多知識都不清楚,從現在開始,每天將自己學習到的知識進行一個總結記錄,前端大佬勿擾勿噴。先介紹幾個基礎概念和一些常用命令: 1、什麼是腳手架 我們經常在各個博客論壇下看到腳手架這個名詞,那什麼是腳手架呢。看到很多前輩們的說法之後,腳手架就相當於預定義的一套模板環境 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...