」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Redux 工具包:React Thunk 和 React Saga。

Redux 工具包:React Thunk 和 React Saga。

發佈於2024-11-09
瀏覽:618

Redux toolkit: React Thunk and React Saga.Learn from Vishal Tiwari.

React Thunk 和 React Saga 是用于处理 React 应用程序中副作用的中间件库,特别是用于管理 API 调用等异步操作。两者通常与 Redux 一起使用,但用途和方法略有不同。


React Thunk

1. 概述:

React Thunk 是一个中间件,允许您编写返回函数而不是操作对象的操作创建器。这对于处理异步操作(例如 API 请求)或复杂的同步逻辑(例如操作的条件分派)非常有用。返回的函数接收dispatch和getState作为参数,允许您调度其他操作或访问函数内的当前状态。

2. 关键概念:

  • 中间件: Thunk 是扩展商店处理函数(即 thunk)能力的中间件。
  • 异步操作:使用 Thunk,您可以延迟操作的分派或根据特定状态或逻辑有条件地分派它。
  • 简单: Thunk 相对简单,在大多数用例中都很容易使用。

3. 工作原理:

  • 通常,动作创建者返回纯 JavaScript 对象(动作)。
  • 使用 Thunk,动作创建者可以返回接收调度和 getState 的函数(“thunk”)。在此函数内,您可以执行异步逻辑(例如,从 API 获取数据),然后分派实际操作。

4. 示例:

以下是如何在 React 应用程序中使用 redux-thunk 的基本示例:

   // Action Creator with Thunk
   export const fetchUser = () => {
     return async (dispatch) => {
       dispatch({ type: 'FETCH_USER_REQUEST' });
       try {
         const response = await fetch('/api/user');
         const data = await response.json();
         dispatch({ type: 'FETCH_USER_SUCCESS', payload: data });
       } catch (error) {
         dispatch({ type: 'FETCH_USER_FAILURE', payload: error });
       }
     };
   };

5. Thunk的优点:

  • 简单性: Thunk 易于理解和实现。
  • 占地面积小:它重量轻,不需要复杂的配置。
  • 直接控制调度:您可以更好地控制何时以及如何调度操作。

6. 缺点:

  • 难以扩展:对于复杂的异步流程,Thunk 可能会变得混乱,具有嵌套逻辑和大量调度调用。
  • 更少的结构: Thunk 不强制使用特定的结构来管理副作用,如果处理不当,可能会导致代码不一致。

反应传奇

1. 概述:

React Saga是一个中间件,允许您使用生成器函数以更有组织的方式处理副作用。它不像 Thunk 那样返回函数,而是使用“效果”系统来管理异步操作并控制逻辑流程。 Sagas 是长时间运行的后台进程,可以侦听分派的操作并执行 API 调用、数据获取和其他任务等副作用。

2. 关键概念:

  • 生成器函数: Sagas 是使用 ES6 生成器函数 (function*) 实现的,它允许您编写看起来同步的异步代码。
  • 观察者和工作者:传奇通常分为“观察者”传奇(监听调度的动作)和“工作者”传奇(处理副作用)。
  • Take、put、call: Redux-Saga 提供了效果创建器(take、put、call 等)来控制何时触发副作用、调度操作和调用 API。

3. 工作原理:

  • 使用 Redux-Saga,您可以定义负责处理副作用的 sagas(长时间运行的后台任务)。
  • Sagas 通常被编写为生成器函数和产生效果,例如 call(调用函数)和 put(分派操作)。
  • Sagas 还可以使用 take 等待特定操作,或者使用 takeEvery 或 takeLatest 监听任何操作。

4. 示例:

这是如何使用 redux-saga 的基本示例:

   import { call, put, takeLatest } from 'redux-saga/effects';

   // Worker saga: will be fired on FETCH_USER_REQUEST actions
   function* fetchUser(action) {
     try {
       const response = yield call(fetch, '/api/user');
       const data = yield response.json();
       yield put({ type: 'FETCH_USER_SUCCESS', payload: data });
     } catch (e) {
       yield put({ type: 'FETCH_USER_FAILURE', message: e.message });
     }
   }

   // Watcher saga: spawns a new fetchUser task on each FETCH_USER_REQUEST
   function* mySaga() {
     yield takeLatest('FETCH_USER_REQUEST', fetchUser);
   }

   export default mySaga;

5. Redux-Saga的优点:

  • 更适合复杂的副作用: Saga 基于效果的方法更具可扩展性,适合管理复杂的异步流(例如,处理重试、去抖或级联 API 调用)。
  • 可测试: Sagas 很容易测试,因为它们是围绕生成器函数构建的。
  • 声明性:效果的使用可以让人们更清楚会发生什么副作用,使流程更加可预测。
  • 取消和顺序: Saga 可以轻松取消正在进行的任务或强制执行事件的顺序流(例如等待多个操作)。

6. 缺点:

  • 更陡峭的学习曲线:使用生成器函数和整体 saga 模式对于初学者来说可能很难掌握。
  • 开销:对于小型应用程序,与 Thunk 等更简单的解决方案相比,它可能感觉有点矫枉过正。
  • 详细:与 Thunk 相比,Sagas 往往涉及更多样板代码。

比较:React Thunk 与 React Saga

方面 React Thunk React Saga
概念 返回动作创建者中的函数 使用生成器函数产生副作用
学习曲线 更容易学习和使用 由于生成器而具有更高的学习曲线
异步流程 处理简单的异步逻辑 更适合复杂的异步工作流程
代码结构 结构较少,在大型应用程序中可能会变得混乱 提供清晰、结构化的方法
测试 测试可能更具挑战性 由于生成器而更容易测试
用例 简单的异步逻辑,API 请求 复杂流程(例如序列、重试)
表现 轻的 更强大,但开销稍大

何时使用哪个?

  • 使用 React Thunk if:

    • 您的应用程序有相对简单的异步需求,例如基本的API请求和基于条件的调度。
    • 您想要一个轻量级、易于理解、没有太多样板的解决方案。
  • 使用 React Saga 如果:

    • 您需要管理更复杂的异步流程,例如重试、操作排序、竞争条件或相互依赖的多个任务。
    • 您更喜欢声明式方法并希望更好地控制副作用。
    • 从长远来看,您的应用程序需要更好的可测试性和代码可维护性。
版本聲明 本文轉載於:https://dev.to/vishal_tiwari_114f21d14e5/redux-toolkit-react-thunk-and-react-sagalearn-from-vishal-tiwari-58b?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-09
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-09
  • 為什麼在 Java 中使用相同的種子時會得到相同的隨機數?
    為什麼在 Java 中使用相同的種子時會得到相同的隨機數?
    具有固定種子的Java隨機數:為什麼輸出相同? 在您的程式碼中,您定義了一種使用以下命令產生隨機數的方法指定的種子。但是,您會注意到,當您提供相同的種子時,所有 100 個產生的數字都是相同的。 此行為是預期的,因為在 Random 建構函式中使用相同的種子會產生可預測的數字序列。種子是初始化隨機數...
    程式設計 發佈於2024-11-09
  • jQuery Chaining 如何簡化開發並提高程式碼效率?
    jQuery Chaining 如何簡化開發並提高程式碼效率?
    理解 jQuery 中的物件和方法連結在 jQuery 中,連結允許在單一語句中串聯多個 jQuery 方法。這使開發人員能夠簡化程式碼並輕鬆執行複雜的操作。 連結的基本原理涉及每個 jQuery 方法的回傳值。當呼叫 jQuery 方法時,它通常會傳回一個表示所選元素的 jQuery 物件。這允許...
    程式設計 發佈於2024-11-09
  • Hono.js 基準測試:Node.js、Deno 和 Bun — 哪個最快?
    Hono.js 基準測試:Node.js、Deno 和 Bun — 哪個最快?
    Deno 2.0 剛剛發布,並聲稱比 Bun 和 Node.js 更快,同樣,Bun 也聲稱更快。這引起了我的興趣,所以我決定測試它們的性能,看看它們在現實場景中的比較。 為了公平比較,我需要選擇一個與所有三種 JavaScript 執行時間環境(Node.js、Deno 和 Bun)相容的框架。...
    程式設計 發佈於2024-11-09
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-11-09
  • 何時應該使用 Tkinter 的 Entry Get 函數來有效檢索輸入?
    何時應該使用 Tkinter 的 Entry Get 函數來有效檢索輸入?
    Tkinter Entry 的Get 函數:深入探討其功能和用法在Tkinter 中,Entry 小部件通常用於收集用戶輸入以進一步收集使用者輸入然而,與Entry 關聯的get() 函數通常無法產生所需的結果,這可能會讓開發人員感到困惑。本文深入探討 get() 的概念,全面了解其執行與應用。 理...
    程式設計 發佈於2024-11-09
  • 如何克服 PHP 中日期表示的 2038 限制?
    如何克服 PHP 中日期表示的 2038 限制?
    PHP 中的日期表示:克服2038 年限制雖然PHP 的原生日期函數在2038 年有一個截止日期,但還有其他方法處理超出此限制的日期。其中一種方法是僅儲存年、月和日,而忽略小時、分鐘、秒和毫秒部分。 透過丟棄這些附加時間部分,可以顯著擴展可表示日期的範圍。這是因為這些元件中的每一個都佔用了 PHP ...
    程式設計 發佈於2024-11-09
  • 如何在 Go (Gorilla) 中向特定客戶端發送有針對性的 Websocket 更新?
    如何在 Go (Gorilla) 中向特定客戶端發送有針對性的 Websocket 更新?
    在Go (Gorilla) 中向特定客戶端發送Websocket 更新儘管是Go 新手,但您尋求有關實現Websocket 通信的指導您的預輸入項目。您已嘗試利用 Gorilla 的 GitHub 儲存庫中的範例,但在理解如何識別特定客戶端並針對 websocket 更新進行定位方面遇到了挑戰。 要...
    程式設計 發佈於2024-11-09
  • 使用swoole作為基於ESP6的腳本可程式控制器的雲端物聯網閘道框架
    使用swoole作為基於ESP6的腳本可程式控制器的雲端物聯網閘道框架
    腳本可程式控制器的本機功能基本上已完成,開始實現遠端相關功能。 遠端系統整體架構如下: 使用ESP8266的SDK實作tcp伺服器和tcp客戶端。 在tcp伺服器的基礎上編寫http協議解析程式碼,設計簡單的http伺服器,處理與瀏覽器的資料交互,包括內建網頁的下載,並使用ajax技術獲取狀態並...
    程式設計 發佈於2024-11-09
  • 為什麼在 Java 的 Random 類別中設定種子會傳回相同的數字?
    為什麼在 Java 的 Random 類別中設定種子會傳回相同的數字?
    Java隨機數產生:為什麼設定種子會回傳相同的數字? 儘管將Random類別的種子設定為特定值,但隨機數產生器始終會傳回相同的數字。讓我們探討一下可能導致此問題的原因。 了解 Random 類別和種子初始化Java Random 類別旨在產生偽隨機數。預設情況下,它使用其內部時鐘作為種子值,使其產生...
    程式設計 發佈於2024-11-09
  • 如何克服使用反射設定結構體欄位值時 SetCan() 總是傳回 False 的問題?
    如何克服使用反射設定結構體欄位值時 SetCan() 總是傳回 False 的問題?
    使用結構體的 SetString 探索反射反射提供了動態操作 Go 結構的強大工具。在此範例中,我們在嘗試使用反射來設定結構體欄位的值時遇到一個常見問題:CanSet() 始終傳回 false。這種障礙阻止了字段修改,使我們陷入困境。 識別陷阱提供的程式碼片段突顯了兩個基本錯誤:傳遞值而非指標: ...
    程式設計 發佈於2024-11-09
  • 為什麼 MySQL 中帶有子查詢的「IN」查詢很慢,如何提升效能?
    為什麼 MySQL 中帶有子查詢的「IN」查詢很慢,如何提升效能?
    MySQL 中帶有子查詢的緩慢「IN」查詢當使用子查詢時,使用「IN」運算子的MySQL查詢可能會表現出顯著的效能下降檢索「IN」子句的值很複雜。在這種情況下,用明確值取代子查詢結果會顯著縮短執行時間。 要了解此行為的原因,需要注意的是,每次評估「IN」查詢時,MySQL 都會執行子查詢。在提供的範...
    程式設計 發佈於2024-11-09
  • 如何使用WinAPI取得螢幕解析度?
    如何使用WinAPI取得螢幕解析度?
    使用 WinAPI 取得螢幕解析度在 WinAPI 中,存在多個函數來決定目前螢幕解析度。適當的選擇取決於具體要求。 檢索顯示尺寸檢索顯示尺寸檢索顯示尺寸 主監視器:使用GetSystemMetrics(SM_CXSCREEN) 和GetSystemMetrics( SM_CYCYSEN) 取得主顯...
    程式設計 發佈於2024-11-09
  • 如何修復透過 Gmail REST API 發送電子郵件時出現的「400 錯誤請求 + 失敗前提條件」錯誤?
    如何修復透過 Gmail REST API 發送電子郵件時出現的「400 錯誤請求 + 失敗前提條件」錯誤?
    Gmail REST API:解決“400 Bad Request Failed Precondition”錯誤嘗試使用Gmail REST API 與伺服器發送電子郵件時-到伺服器授權時,您可能會遇到一條錯誤訊息,指出「400 Bad Request Failed Precondition」。此錯...
    程式設計 發佈於2024-11-09

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3