”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Redux 工具包:React Thunk 和 React Saga。向 Vishal Tiwari 学习。

Redux 工具包:React Thunk 和 React Saga。向 Vishal Tiwari 学习。

发布于2024-11-09
浏览:539

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]删除
最新教程 更多>
  • 在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
    在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
    For Each Loop vs. Iterator: Efficiency in Collection TraversalIntroductionWhen traversing a collection in Java, the choice arises between using a for-...
    编程 发布于2025-06-21
  • 在C#中如何高效重复字符串字符用于缩进?
    在C#中如何高效重复字符串字符用于缩进?
    在基于项目的深度下固定字符串时,重复一个字符串以进行凹痕,很方便有效地有一种有效的方法来返回字符串重复指定的次数的字符串。使用指定的次数。 constructor 这将返回字符串“ -----”。 字符串凹痕= new String(' - ',depth); console.Wr...
    编程 发布于2025-06-21
  • 在Pandas中如何将年份和季度列合并为一个周期列?
    在Pandas中如何将年份和季度列合并为一个周期列?
    pandas data frame thing commans date lay neal and pree pree'和pree pree pree”,季度 2000 q2 这个目标是通过组合“年度”和“季度”列来创建一个新列,以获取以下结果: [python中的concate...
    编程 发布于2025-06-21
  • 如何在php中使用卷发发送原始帖子请求?
    如何在php中使用卷发发送原始帖子请求?
    如何使用php 创建请求来发送原始帖子请求,开始使用curl_init()开始初始化curl session。然后,配置以下选项: curlopt_url:请求 [要发送的原始数据指定内容类型,为原始的帖子请求指定身体的内容类型很重要。在这种情况下,它是文本/平原。要执行此操作,请使用包含以下标头...
    编程 发布于2025-06-21
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-06-21
  • 在PHP中如何高效检测空数组?
    在PHP中如何高效检测空数组?
    在PHP 中检查一个空数组可以通过各种方法在PHP中确定一个空数组。如果需要验证任何数组元素的存在,则PHP的松散键入允许对数组本身进行直接评估:一种更严格的方法涉及使用count()函数: if(count(count($ playerList)=== 0){ //列表为空。 } 对...
    编程 发布于2025-06-21
  • PHP未来:适应与创新
    PHP未来:适应与创新
    PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。 引言在编程世界中,PHP一直是网页开发的中流砥柱。作为一个从1994年就开始发展...
    编程 发布于2025-06-21
  • FastAPI自定义404页面创建指南
    FastAPI自定义404页面创建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    编程 发布于2025-06-21
  • C++中如何将独占指针作为函数或构造函数参数传递?
    C++中如何将独占指针作为函数或构造函数参数传递?
    在构造函数和函数中将唯一的指数管理为参数 unique pointers( unique_ptr [2启示。通过值: base(std :: simelor_ptr n) :next(std :: move(n)){} 此方法将唯一指针的所有权转移到函数/对象。指针的内容被移至功能中,在操作...
    编程 发布于2025-06-21
  • Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    在ASP.NET async void void async void void void void void的设计无需返回asynchroncon而无需返回任务对象。他们在执行过程中增加未偿还操作的计数,并在完成后减少。在某些情况下,这种行为可能是有益的,例如未期望或明确预期操作结果的火灾和...
    编程 发布于2025-06-21
  • 同实例无需转储复制MySQL数据库方法
    同实例无需转储复制MySQL数据库方法
    在同一实例上复制一个MySQL数据库而无需转储在同一mySQL实例上复制数据库,而无需创建InterMediate sqql script。以下方法为传统的转储和IMPORT过程提供了更简单的替代方法。 直接管道数据 MySQL手动概述了一种允许将mysqldump直接输出到MySQL clie...
    编程 发布于2025-06-21
  • 如何实时捕获和流媒体以进行聊天机器人命令执行?
    如何实时捕获和流媒体以进行聊天机器人命令执行?
    在开发能够执行命令的chatbots的领域中,实时从命令执行实时捕获Stdout,一个常见的需求是能够检索和显示标准输出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    编程 发布于2025-06-21
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-06-21
  • Android如何向PHP服务器发送POST数据?
    Android如何向PHP服务器发送POST数据?
    在android apache httpclient(已弃用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    编程 发布于2025-06-21
  • Python读取CSV文件UnicodeDecodeError终极解决方法
    Python读取CSV文件UnicodeDecodeError终极解决方法
    在试图使用已内置的CSV模块读取Python中时,CSV文件中的Unicode Decode Decode Decode Decode decode Error读取,您可能会遇到错误的错误:无法解码字节 在位置2-3中:截断\ uxxxxxxxx逃脱当CSV文件包含特殊字符或Unicode的路径逃...
    编程 发布于2025-06-21

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3