Redux 中异步 Action 和异步 Reducer 的实现

Redux 是一个流行的 JavaScript 应用程序状态管理库。它可以帮助开发者轻松管理应用程序状态,并提供预测性和可维护性。在 Redux 中,Action 是一个描述发生了什么的简单对象。Reducer 是一个纯函数,用于根据当前状态和 Action 返回新的状态。但是,Redux 中的 Action 和 Reducer 默认是同步的。在某些情况下,需要异步 Action 和异步 Reducer 来处理异步数据流。本文将介绍 Redux 中异步 Action 和异步 Reducer 的实现。

异步 Action

在 Redux 中,异步 Action 是指 Action 本身并不立即返回结果,而是在一段时间后才会返回结果。例如,当从后台服务器获取数据时,可能需要等待一段时间才能得到结果。为了实现异步 Action,可以使用 Redux 中的 redux-thunk 中间件。

安装和配置 redux-thunk

首先,需要安装 redux-thunk 中间件。可以使用 npm 或 yarn 安装:

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

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

然后,在 Redux Store 中应用 redux-thunk 中间件。在创建 Store 的代码中引入 applyMiddlewarethunk,并将它们作为参数传递给 createStore 方法:

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

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

编写异步 Action

在 Redux 中,Action 是一个简单的 JavaScript 对象,它必须具有一个 type 属性来描述 Action 的类型。对于异步 Action,可以将其 type 属性设置为字符串,表示异步 Action 的开始和结束。

例如,假设需要从服务器获取用户数据。可以编写以下异步 Action:

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

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

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

在上面的代码中,fetchUser 是一个异步 Action,它接受一个 userId 参数。在 Action 的内部,首先调用 dispatch 方法,将一个带有 FETCH_USER_REQUEST 类型的 Action 分发到 Store 中。然后,使用 fetch 函数从服务器获取用户数据,并在获取成功时将 FETCH_USER_SUCCESS 类型的 Action 分发到 Store 中。如果获取数据失败,则将 FETCH_USER_FAILURE 类型的 Action 分发到 Store 中。

处理异步 Action

异步 Action 与同步 Action 不同,因为它们不会立即返回结果。在异步 Action 中,需要使用 dispatch 方法将 Action 分发到 Store 中,以便 Reducer 可以处理它们。

在上面的异步 Action 中,当调用 fetchUser 方法时,它返回一个函数,而不是简单的 JavaScript 对象。这个函数接受一个 dispatch 参数,并在函数内部使用 dispatch 方法将 Action 分发到 Store 中。

当在组件中调用 fetchUser 方法时,可以通过 dispatch 方法将其分发到 Store 中:

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

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

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

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

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

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

在上面的代码中,fetchUser 方法通过 mapDispatchToProps 函数映射到组件的 props 中。当组件挂载时,调用 useEffect 钩子,并调用 fetchUser 方法,将 userId 传递为参数。在 fetchUser 方法内部,它将 FETCH_USER_REQUEST 类型的 Action 分发到 Store 中,并使用 fetch 函数从服务器获取用户数据。当获取成功时,将 FETCH_USER_SUCCESS 类型的 Action 分发到 Store 中。

异步 Reducer

在 Redux 中,Reducer 是一个纯函数,用于根据当前状态和 Action 返回新的状态。但是,Redux 中的 Reducer 默认是同步的,并且只能处理同步 Action。在某些情况下,需要异步 Reducer 来处理异步数据流。例如,在从后台服务器获取数据时,需要等待一段时间才能得到结果。为了实现异步 Reducer,可以使用 Redux 中的 redux-thunk 中间件。

编写异步 Reducer

在 Redux 中,异步 Reducer 与同步 Reducer 不同,因为它们需要处理异步 Action。为了处理异步 Action,需要在 Reducer 中使用 switch 语句来处理每个 Action 类型。在处理异步 Action 时,需要分别处理 Action 的开始和结束。

例如,假设需要从服务器获取用户数据。可以编写以下异步 Reducer:

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

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

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

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

在上面的代码中,userReducer 是一个异步 Reducer。它接受一个名为 state 的参数,并根据 action.type 处理每个 Action 类型。当收到 FETCH_USER_REQUEST 类型的 Action 时,将 loading 属性设置为 true,并将 error 属性设置为 null。当收到 FETCH_USER_SUCCESS 类型的 Action 时,将 user 属性设置为 action.payload,并将 loading 属性设置为 false。当收到 FETCH_USER_FAILURE 类型的 Action 时,将 loading 属性设置为 false,并将 error 属性设置为 action.payload

应用异步 Reducer

在 Redux 中,可以通过 combineReducers 方法将多个 Reducer 合并为一个单一的 Reducer。在创建 Store 的代码中,将合并后的 Reducer 传递给 createStore 方法。

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

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

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

在上面的代码中,使用 combineReducers 方法将 userReducer 合并到 rootReducer 中,并将 rootReducer 传递给 createStore 方法。

处理异步 Reducer

异步 Reducer 与同步 Reducer 不同,因为它们需要处理异步 Action。在异步 Reducer 中,需要处理每个 Action 类型的开始和结束。在开始时,需要将 loading 属性设置为 true,并将 error 属性设置为 null。在结束时,需要将 loading 属性设置为 false,并将 error 属性设置为 action.payload

总结

在 Redux 中,异步 Action 和异步 Reducer 可以帮助开发者处理异步数据流。异步 Action 可以通过 redux-thunk 中间件实现,而异步 Reducer 可以通过在 Reducer 中处理异步 Action 实现。在处理异步数据流时,需要注意异步 Action 和异步 Reducer 的实现方式,以确保代码的正确性和可维护性。

示例代码:https://github.com/zhongdeming428/async-redux-example

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


猜你喜欢

  • 新的 ECMAScript 2021 特性:检查函数的参数类型

    在前端开发中,函数是非常重要的工具。但是,当函数的参数不符合预期时,常常会导致程序出错。ECMAScript 2021 引入了一项新的特性,可以检查函数的参数类型,以避免这种情况的发生。

    10 个月前
  • 在 Next.js 10 中使用 Image 组件

    随着 Web 应用程序的不断发展,用户对页面加载速度的要求也越来越高。图片是 Web 页面中不可或缺的一部分,但是图片的加载速度往往比较慢,会影响用户体验。为了解决这个问题,Next.js 10 推出...

    10 个月前
  • SSE 在移动端在线教育中的应用

    前言 随着移动互联网的发展,移动在线教育已经成为了一种趋势。如何在移动端在线教育中实现实时的数据推送和更新,成为了一个亟待解决的问题。本文将介绍如何使用 SSE 技术实现移动端在线教育应用中的实时数据...

    10 个月前
  • Serverless 框架下多个 Lambda 函数并行执行方法

    Serverless 架构已经成为现代云应用程序的主要选择。它可以帮助开发者快速构建和部署应用程序,而无需关注底层基础设施。在 Serverless 架构中,Lambda 函数是一种无服务器计算的方式...

    10 个月前
  • Docker 容器内安装和使用 Chrome 浏览器

    随着前端开发的不断发展,我们需要在不同的浏览器中进行测试和调试。而 Docker 容器是一种轻量级的虚拟化技术,可以方便地创建和运行应用程序。在 Docker 容器中安装和使用 Chrome 浏览器,...

    10 个月前
  • SASS 如何实现背景颜色过渡效果?

    在前端开发中,我们经常需要实现页面元素的过渡效果,其中背景颜色过渡效果是比较常见的一种。本文将介绍如何使用 SASS 实现背景颜色过渡效果,包括基本用法和高级用法。

    10 个月前
  • 在 Jest 中使用 Snapshot 快速测试组件渲染结果

    Jest 是一个流行的 JavaScript 测试框架,它提供了一系列工具和 API,可以帮助我们编写高质量的测试用例。其中,Snapshot 是 Jest 的一个特性,它可以快速测试组件的渲染结果,...

    10 个月前
  • Hapi 框架的跨域处理详解

    什么是跨域? 跨域指的是客户端请求的资源与服务端所在域名不同,浏览器会根据同源策略限制对资源的访问,以保证用户信息的安全。同源策略是指,如果两个 URL 的协议、端口号和主机名都相同,那么这两个 UR...

    10 个月前
  • 解决 Koa-session 存储 Session 时遇到的问题

    Koa-session 是一个用于 Koa 的 session 中间件,它能够让我们在 Koa 应用中方便地使用 session。但是,在使用 Koa-session 时,我们可能会遇到一些问题,比如...

    10 个月前
  • Fastify 框架如何优化数据查询性能

    Fastify 是一款快速、低开销、可扩展的 Node.js Web 框架,它的性能比 Express、Koa 等传统框架更快。但是在处理大量数据查询时,仍然需要一些优化技巧来提高性能。

    10 个月前
  • 高效使用 Web Components 提高项目开发效率

    Web Components 是一种用于构建可重用 UI 组件的技术。它使得开发者可以将组件的 HTML、CSS 和 JavaScript 封装在一起,形成一个独立的、可重用的组件。

    10 个月前
  • Node.js 之基于 mongoose—schema 插件机制的实际应用

    介绍 Node.js 是一种基于 Chrome V8 引擎的 JavaScript 运行环境,可用于开发高性能的网络应用程序。而 mongoose 是 Node.js 中最常用的 MongoDB 驱动...

    10 个月前
  • ES9 引入了 Object.fromEntries() 方法,提升数据解析效率

    ES9 引入了 Object.fromEntries() 方法,提升数据解析效率 在前端开发中,我们经常需要处理各种数据结构,比如对象、数组等。在 ES9 中,引入了 Object.fromEntri...

    10 个月前
  • 如何在 Chai.js 中使用 chai-json-schema 插件

    前言 在进行前端开发中,测试是一个非常重要的环节。其中,单元测试是最基础的测试方式。而在单元测试中,断言库是必不可少的工具。Chai.js 是一个流行的 JavaScript 断言库,它提供了 BDD...

    10 个月前
  • RxJS 实现图片懒加载

    在现代网站中,图片通常是占据了大量的资源,而在移动设备上加载过多的图片会导致页面变得缓慢。这就是为什么图片懒加载技术变得越来越流行的原因。而 RxJS 是一个流式编程库,它可以帮助我们更好地管理异步事...

    10 个月前
  • Enzyme 测试框架如何在 React Native 应用中使用

    Enzyme 测试框架如何在 React Native 应用中使用 Enzyme 是一个流行的 JavaScript 测试工具,它可以帮助我们在 React 应用中进行组件测试。

    10 个月前
  • Kubernetes 中 Pod 就绪探针的作用与使用

    什么是 Pod 就绪探针? 在 Kubernetes 中,Pod 就绪探针是一项重要的功能,它用于判断 Pod 是否已经准备好接受流量。Pod 就绪探针是一种用于检查应用程序是否已经启动并且准备好接受...

    10 个月前
  • 在 Mocha 测试中使用 jsdom 进行 DOM 测试的方法和技巧

    随着前端技术的不断发展,测试已经成为了前端开发中不可或缺的一部分。在测试中,DOM 测试是一个非常重要的环节,因为它能够帮助我们验证页面的交互和渲染是否正确。本文将介绍如何使用 jsdom 在 Moc...

    10 个月前
  • 遇到 SPA 应用搜索引擎优化问题该如何解决

    随着前端技术的不断发展,越来越多的 Web 应用采用了 SPA(Single Page Application)架构,这种架构可以提供更好的用户体验和更快的页面响应速度。

    10 个月前
  • 在 React 项目中使用 ECMAScript 2017 中的 async/await 特性

    在 React 项目中使用 ECMAScript 2017 中的 async/await 特性 随着前端技术的不断发展,我们越来越多地使用异步操作来处理数据和网络请求。

    10 个月前

相关推荐

    暂无文章