Redux-saga 基础知识和实现

面试官:小伙子,你的数组去重方式惊艳到我了

Redux-saga 是一个用于管理 Redux 的副作用(异步操作,如与服务器 API 的请求或浏览器缓存或定时器等)的库。通过 redux-saga,我们可以将异步操作(side effect)和业务逻辑分开,使代码更易于测试、理解和维护。本文将介绍 redux-saga 的基本概念和用法,并通过示例代码演示实现。

基本概念

Redux-saga 的核心是 Generator 函数和 Effect。以下是 redux-saga 的常用概念:

Generator 函数

Generator 函数是 JavaScript 中的一个特殊函数,它可以被中断并恢复。执行 Generator 函数将返回一个迭代器对象,该迭代器对象可迭代返回多个值,而不仅仅是单个值。

--------- ------------- -
  ----- --
  ----- --
  ----- --
-

----- --------- - --------------

------------------------------ -- - ------ -- ----- ----- -
------------------------------ -- - ------ -- ----- ----- -
------------------------------ -- - ------ -- ----- ----- -
------------------------------ -- - ------ ---------- ----- ---- -

Generator 函数内部可以使用 yield 语句返回值,并暂停函数的执行,等待下一次调用 next() 方法恢复执行。Generator 函数可以无限制地调用 yield 来返回多个值。

Effect

Effect 是一个对象,它描述了 Generator 函数的一种指令。Effect 可被 dispatch(发送)到 saga 中,用于控制 saga 如何处理副作用。

常用的 Effect 包括:

  • call(fn, ...args):调用函数 fn,并传递给它一些参数(args)。如果 fn 返回 Promise,则暂停后续 saga 执行,直到 Promise resolve 或 reject。如果 fn 返回一个 Generator 对象,则暂停 saga 执行,直到该 Generator 执行完成。

  • put(action):发送一个 Redux action。相当于 dispatch 一个 action。

  • select(selector):从 Redux store 中获取 state。

  • take(pattern):暂停 saga 执行,直到一个匹配 pattern 的 action 被派发到 Redux store 中。

  • fork(fn, ...args):以非阻塞方式调用函数 fn,并传递给它一些参数(args)。

  • race(effects):并行地运行多个 Effect,并返回第一个完成的 Effect。

  • cancel(task):取消一个 Effect。

示例说明

下面通过一个简单的 Saga 示例来演示实现。该示例使用了 Redux 和 React。

安装依赖

首先,我们需要安装需要的依赖:

--- ------- ----- ----------- ----------

创建 Store

然后,我们需要创建 Redux Store。这里将设置默认的 state 为 0,并提供两种操作增加和减少 state。当 state 改变时,组件会自动更新。

------ - ----------- - ---- --------

----- ------------ - - ------ - --

-------- ------------- - ------------- ------- -
  ------ ------------- -
    ---- ------------
      ------ - ------ ----------- - - --
    ---- ------------
      ------ - ------ ----------- - - --
    --------
      ------ ------
  -
-

------ ------- ---------------------

创建 Saga

接着,我们需要在 Redux Store 中使用 Saga。

下面是增加和减少 state 的 Saga 实现。

------ - ---------- --- - ---- ---------------------

------ --------- --------------- -
  ----- ----- ----- ----------- ---
-

------ --------- --------------- -
  ----- ----- ----- ----------- ---
-

------ --------- ---------------- -
  ----- ---------------------------- ---------------
-

------ --------- ---------------- -
  ----- ---------------------------- ---------------
-
  • watchIncrementwatchDecrement 监听 INCREMENT_ASYNCDECREMENT_ASYNC 发起的 action,并分别调用 incrementSagadecrementSaga

  • incrementSaga 调用 put({ type: 'INCREMENT' }) 时,代表将派发一次 INCREMENT action。

  • decrementSaga 调用 put({ type: 'DECREMENT' }) 时,代表将派发一次 DECREMENT action。

创建 React 组件

最后,我们需要创建一个 React 组件来将 Saga 和 React 组件连接起来。下面是一个极简的组件。

------ ----- ---- --------
------ - ------------ ----------- - ---- --------------

-------- --------- -
  ----- ----- - ------------------- -- -------------
  ----- -------- - --------------

  ----- --------------- - -- -- -
    ---------- ----- ----------------- ---
  --

  ----- --------------- - -- -- -
    ---------- ----- ----------------- ---
  --

  ------ -
    -----
      ------------ ------------
      ------- -------------------------------------
      ------- -------------------------------------
    ------
  --
-

------ ------- --------

该组件使用 React Hook useSelectoruseDispatch 分别获取 state 和 dispatch。

当用户点击“+1”时,组件会派发一个 INCREMENT_ASYNC action,这个 action 将被 Saga 监听, Saga 会调用 incrementSaga,并将 INCREMENT action 派发到 Redux Store 中。

当用户点击“-1”时,组件会派发一个 DECREMENT_ASYNC action,这个 action 将被 Saga 监听, Saga 会调用 decrementSaga,并将 DECREMENT action 派发到 Redux Store 中。

结论

Redux-saga 是一个非常有用的库,它使得 Redux 更容易使用,使得代码更易于测试、理解、维护。如需更深入了解请参考其官方文档,官方文档详细讲述了如何在 Saga 中处理更多的 Effect 和如何更好地控制副作用。我们希望通过本文的介绍和示例代码,您可以更好地理解和使用 redux-saga。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/66fa76dd44713626014c8dbb


猜你喜欢

  • 使用 Custom Elements 构建可定制化的 Web 组件

    在现代网页设计中,网页将不再是一些简单的静态网页,而是需要更多的互动和动态效果。为了达到这个目的,Web 开发者需要使用许多不同的技术和工具,其中之一就是 Custom Elements。

    21 天前
  • 在 Web Components 里如何处理子组件事件

    Web Components 是一种新型的前端技术,旨在为 Web 应用程序提供可以复用的自定义组件。在这些组件中,子组件事件是一个非常重要的部分,因为子组件之间的交互对于组件的整体效果和用户体验至关...

    21 天前
  • 手写基础的 Promise

    Promise 是一种常用的异步编程解决方案,已成为现代 Web 应用开发的重要基石。在本篇文章中,我们将手写一个基础的 Promise,通过深度学习实现一个适合自己的 Promise。

    21 天前
  • 如何在 Hapi 框架中进行授权

    在现代 Web 应用中,授权是一个非常重要的话题。Hapi 是一个流行的 Node.js Web 框架,它提供了许多有用的工具来简化 Web 应用程序的开发。在本文中,我们将讨论如何在 Hapi 框架...

    21 天前
  • Docker 常见问题及解决方式

    Docker 是一个流行的开源容器引擎,用于创建、部署和运行应用程序。Docker 技术已经成为现代化应用程序开发和部署的标准之一。本文将探讨一些常见的 Docker 问题及解决方式。

    21 天前
  • Koa 中间件 koa-bodyparser 的使用技巧

    Koa 是一个 Node.js 的 web 框架,在构建应用时经常使用中间件。koa-bodyparser 是一个将 POST、PUT、DELETE 等请求体中的数据解析为 JSON 格式的 Koa ...

    21 天前
  • 解决 Fastify 框架中的问题:Inherited method xyz shadows method of same name from parent class

    在使用 Fastify 框架的过程中,有时候会遇到这个错误:Inherited method xyz shadows method of same name from parent class。

    21 天前
  • Serverless 与微服务架构的相关性对比

    随着互联网的发展,Web 应用也随之变得越来越复杂。为了让 Web 应用更好地满足用户需求,开发人员需要选择一种适合的架构。传统的单体应用架构已经不能满足当今需要高可用、高可扩展、低成本的 Web 应...

    21 天前
  • Angular 中解决 "Error: Can't bind to 'ngModel' since it isn't a known property of 'input'" 的方法

    在使用 Angular 框架进行前端开发时,我们可能会碰到这样一个错误信息:"Error: Can't bind to 'ngModel' since it isn't a known propert...

    21 天前
  • ES10 如何兼容 ES6 及以下版本

    随着 JavaScript 技术的不断发展,ECMAScript 成为了前端开发者必须学习的一项技能。ECMAScript 不断更新,每个版本都会增加新的特性和语法。

    21 天前
  • VueCLI3 配置 Jest 单元测试遇到的那些坑

    如果你在使用 VueCLI3 建立的项目中加入了单元测试,那么你可能会遇到一些配置上的困难,特别是在使用 Jest 时。本文将介绍如何在 VueCLI3 中添加 Jest 单元测试,并列举一些遇到的问...

    21 天前
  • RESTful API 中关于 HTTP 状态码的知识总结

    在进行 RESTful API 开发中,HTTP 状态码是非常重要的一部分。它们用于指示访问资源的结果,并在发生问题时提供有用的信息。在本文中,我们将讨论常见的 HTTP 状态码及其含义、示例代码以及...

    21 天前
  • 前端性能调试与优化的探究

    引言 在现代 Web 领域,前端性能是一个非常重要的问题。随着 Web 应用越来越复杂,前端代码的规模和复杂度也在逐渐增加。如果不进行良好的性能调试和优化,会给用户带来不好的体验。

    21 天前
  • 使用 Headless CMS 进行数据可视化的技巧分享

    Headless CMS(无头 CMS)是一种不同于传统 CMS 的架构,它将内容与前端视图分离。它通过 API 接口将数据暴露给开发者,开发者可以根据自己的需要对数据进行处理和展示,从而实现了更高的...

    21 天前
  • ECMAScript 2017 (ES8) 中的 exponentiation 操作符

    在 ECMAScript 2017 (ES8) 中,新增了一个 exponentiation(指数)操作符,用于进行指数运算。这个操作符的优先级相当高,比乘法和除法还要高,因此在运算时需要注意。

    21 天前
  • 如何在 Node.js 项目中使用 Babel

    Babel 是一个 JavaScript 编译器,可以将 ES6/ES7/ES8 的代码转换为可在当前和旧版浏览器上运行的代码。它是现代前端应用程序开发中不可或缺的工具之一。

    21 天前
  • ECMAScript 2020 (ES11) 中的 import() 使用指南

    在 ECMAScript 2020 中,JavaScript 引入了一个新的 import() 函数,可以动态地加载 JavaScript 模块。与传统的 import 语句不同,在 import()...

    21 天前
  • Hapi 中的身份验证和授权:完整指南

    在今天的互联网时代,网站和应用程序安全性变得特别重要。为了保护网站和应用程序不被黑客攻击,越来越多的开发者们倾向于使用身份验证和授权技术。Hapi 是一种基于 Node.js 的 Web 框架,它提供...

    21 天前
  • 如何在 Deno 中部署 MongoDB?

    Deno 是一个现代化的 JavaScript 和 TypeScript 运行时环境,与 Node.js 相比具有更高的安全性和更好的开发体验。MongoDB 是一个流行的 NoSQL 数据库,可以为...

    21 天前
  • 无障碍设计:WordPress 如何改进

    作为一个人人都可以使用的平台,无障碍设计是 WordPress 官方一直致力改善的目标之一。然而,要做好无障碍设计并不是一件容易的事情,需要考虑到很多有各种不同障碍的用户群体的需求。

    21 天前

相关推荐

    暂无文章