Redux 数据流程与应用状态的维护技巧

什么是 Redux

Redux 是一种 JavaScript 应用程序的状态容器,它可以管理应用程序的状态并控制它们是如何被处理的。Redux 非常适合于大型应用程序,因为它可以帮助开发者更好地组织和维护应用程序的代码。

在 Redux 中,数据流向是单向的:从视图(即用户操作)到 action,再到 reducer,最后到 store。下面就让我们逐一了解每一个流程。

数据流程

视图

Redux 数据流程的开始就是视图。视图层通过用户操作(例如按钮点击或者输入框输入)来发起一个 action。

action 是一个带有识别信息和有效载荷的 JavaScript 对象。它只描述了发生了什么,但是没有具体的实现。它们显示了一个事件所对应的类型,并且传递给 reducer 进行处理。

例如,当用户单击增加按钮:

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

Action

Action 的主要目的是发出指令,改变状态(state)的唯一途径就是通过 dispatch 发布一个 action。

Action 只是一个描述文件,它描述了一个事件对于应用的状态改变。

对应的 reducer 就会根据这个 action 的 type,进行相应的状态的更新。

例如,在单击增加按钮时,将会执行 INCREASE_COUNT 的 action,这个 action 将告诉 reducer 状态要加 1:

Reducer

Reducer 是一个纯函数,它接受现有的状态和一个 action,然后返回新的状态。Reducer 的职责是处理 action 并更新应用程序的状态。

Reducer 将不同的 Action 分类进行处理,并通过返回新的状态来反馈给 Redux Store。

例如,当收到 INCREASE_COUNT action 时,reducer 将会让状态加 1:

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

Store

Store 将处理过的 state 保存,并在视图中被访问到。Action 是通过 Store.dispatch() 方法发起的,Store 将通过 Reducer 来更新应用程序的状态。Store 是纯粹的 JavaScript 对象,保存了应用程序的 state。

例如,将 countReducer 放入 Store 中:

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

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

现在,我们已经在 Redux Store 中设置了状态,重要的是如何在项目中使用它。

应用状态的维护技巧

Redux 提供了一种可以管理应用的全局状态的约定方式,这使得你可以清楚的知道状态发生了什么,并且在整个应用程序中保持一致性。

避免过多的嵌套

当你使用一个庞大的 Redux 状态时,你可能会开始看到一些嵌套胡同。你可以使用分离的 reducer,但有时你需要管理并且更新多个数据源,这就是一个非常麻烦的问题。

例如,一个有人员组织结构的应用程序,我们需要保存每个雇员的详细信息和部门的详细信息:

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

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

这将使状态看起来十分复杂,因此我们可以将每个子状态分成单独的 reducer。然后我们可以将它们组合成一个大型的 reducer,以帮助我们完成整个数据源的维护。

例如,我们可以将 reducer 拆分为3个子状态管理器:employees、departments 和 organization:

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

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

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

现在,我们将 employeeReducer 独立作为一个子状态管理器,这使我们可以更好地维护员工信息的修改。同样,我们也可以更细致地管理部门信息的修改。

将状态进行拆分

如果你的状态看起来非常长,你可能想要考虑将它拆分成更小的子状态。

例如,我们的应用程序可能已经包含了几个状态:用户信息(User)、过滤器(Filter)、分页(Pagination)和 雇员信息(Employee):

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

我们可以根据子状态的类型,将主状态分解成更多的子状态:

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

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

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

这个方法可以减小代码的复杂度,也可以更好地管理和维护你的应用程序。

使用 combineReducers

combineReducers 负责将多个 reducer 合并成一个 reducer,它的核心工作是通过依次执行多个 reducer 并合并他们的结果。combineReducers 非常适合管理多种状态,例如上面提到的 User、Filter、Pagination 和 Employee。

例如,我们将 User、Filter 和 Employee 合并到一个 Reducer 中:

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

我们已经按类型将大型的状态拆分成了多个子状态,现在我们可以使用 combineReducers() 函数即可将它们合并成一个单一的状态。

示例代码

以下是对应示例代码,基于这个示例,你可以更好地理解 Redux 数据流程:

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

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

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

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

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

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

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

输出

-
-

总结

Redux 是一个非常强大且灵活的状态容器。在实际项目使用中,当应用程序状态变得非常复杂时,应该进行状态拆分,并将其分为多个子状态管理器,这使得每个部分都能更好地聚焦于其任务。

重要的是,理解整个数据流程,这将使你在应用中更清晰地管理状态、更好地组织代码和更轻松地更新状态。

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


猜你喜欢

  • Serverless 环境下使用 Docker 遇到的问题及解决方案

    前言 在 Serverless 架构下,我们可以将一些应用分别打包成独立的函数,让它们在需要的时候自动调用执行,这大大提高了应用的可靠性和灵活性。但在某些情况下,我们需要在函数中使用 Docker 容...

    9 个月前
  • ES10 新增 Nullish Coalescing 运算符解决 Undefined 和 Null 判断的问题

    在前端开发中,我们经常需要对变量进行类型判断、空值判断等处理。在过去,我们一般使用 || 运算符来判断一个值是否为 undefined 或 null,如下所示: ----- ---- - ------...

    9 个月前
  • 在 Fastify 应用程序中部署 OpenAPI

    什么是 Fastify Fastify 是一个快速、低开销的 Web 框架,可以用于部署 Node.js 应用程序。它在效率和性能方面优于很多其他流行的 Web 框架,比如 Express 和 Koa...

    9 个月前
  • 解决 Express.js 中 POST 请求数据格式错误的问题

    在使用 Express.js 开发 Web 应用时,常常需要处理 POST 请求。然而,当 POST 请求中的数据格式出现错误时,可能会导致应用出现错误,甚至崩溃。

    9 个月前
  • 如何使用 Enzyme 测试 React 中的多边形图形组件

    React 是一种流行的前端框架,可以用于构建可重用的组件。在本文中,我们将介绍如何使用 Enzyme 测试 React 中的多边形图形组件。 Enzyme 是什么? Enzyme 是一个用于 Rea...

    9 个月前
  • Hapi 和 Seeli-Mongoose 实现 MongoDB 数据库操作

    Hapi 和 Seeli-Mongoose 实现 MongoDB 数据库操作 在前端开发中,涉及到数据库操作时,我们通常使用 MongoDB 数据库。而在 Node.js 环境下,使用 Hapi 和 ...

    9 个月前
  • 在 Deno 中如何使用 Express?

    在 Deno 中使用 Express 和在 Node.js 中使用非常相似。Express 是一个流行的 Node.js Web 应用程序框架。使用 Express,您可以轻松地构建具有路由、中间件和...

    9 个月前
  • 如何使用 Socket.io 构建完全实时的聊天应用

    在现代 Web 应用程序中,我们越来越经常需要实时性,这包括聊天应用、实时游戏和协同工具等。 Socket.io 是一个基于 Node.js 的实时 Web 应用程序框架,提供了一种简单的方式来构建实...

    9 个月前
  • Enzyme 与 Jest 如何配合使用测试 React 组件的交互与渲染

    Enzyme 与 Jest 如何配合使用测试 React 组件的交互与渲染 React 组件是前端开发中一个非常核心的概念,在 React 应用中的每一个组件都扮演着至关重要的角色。

    9 个月前
  • 如何在 Web Components 中使用 JavaScript Promises 来处理异步操作

    随着 Web Components 技术的发展,现代前端应用不断地向组件化方向发展。在组件化开发中,处理异步操作是不可避免的。本文将介绍如何在 Web Components 中使用 JavaScrip...

    9 个月前
  • 使用 LESS 时如何避免出现样式覆盖问题?

    在前端开发中,我们经常会遇到样式覆盖的问题,这是由于多个样式规则作用于同一元素,最终只有一个样式起作用,经常会导致样式出现异常甚至无法达到预期目的。为解决这个问题,我们可以使用 LESS 这个 CSS...

    9 个月前
  • 在 TypeScript 中使用 ES6 Promise:完美指南

    在 TypeScript 中使用 ES6 Promise:完美指南 ES6 Promise 是 JavaScript 中非常强大的异步编程模型,可以方便地解决异步回调地狱的问题,使代码更加简洁易读。

    9 个月前
  • Mocha 测试中出现 “chunk failed to be read” 错误的解决方法

    在进行 JavaScript 前端开发时,常常需要使用 Mocha 进行单元测试。然而,有时候在执行测试时,会出现 “chunk failed to be read” 错误,导致测试无法正常执行。

    9 个月前
  • RESTful API 设计中的幂等性原则详解

    在 RESTful API 的设计中,幂等性是一个十分重要的原则。幂等性的含义是,对于同一个请求,无论进行多少次操作,产生的结果都是一样的。在 API 的使用中,这个原则能够保证数据的一致性和可靠性,...

    9 个月前
  • Next.js 中如何使用 CSS Modules?

    在前端开发中,CSS Modules 是一个非常流行的技术,可以帮助我们更好地组织样式代码,避免命名冲突和样式污染。在 Next.js 中,使用 CSS Modules 也非常方便。

    9 个月前
  • Mongoose Date 类型时间戳陷阱与解决方式

    在使用 Mongoose 开发 Node.js 项目时,我们经常会使用 Date 类型来存储时间戳。但是,在使用过程中,我们可能会遇到一些令人困惑的问题。本文将介绍 Date 类型时间戳的陷阱以及解决...

    9 个月前
  • TailwindCSS 教程:为什么需要配置 Webpack?

    TailwindCSS 是一种流行的 CSS 框架,它提供了许多工具和类帮助我们快速构建现代化的网站界面。TailwindCSS 可以轻松定制,在不同的项目中灵活适配。

    9 个月前
  • Docker 部署 Rails 应用指南

    作为一名前端工程师,我们经常需要部署应用程序。Docker 作为目前最流行的容器化解决方案,能够为应用程序提供更高效、安全、可靠的部署方式。在这篇文章中,我们将重点介绍如何使用 Docker 来部署 ...

    9 个月前
  • ES12 中引入的新 Number BigInt 型函数:引入 Pow()、Mod()、Sqrt()

    在 ES12 版本中,引入了一种新的数据类型:BigInt。相较于 Number 类型,BigInt 类型的数值范围更大,可以处理远超 JavaScript 数值精度范围的计算。

    9 个月前
  • 使用 Chai 进行 API 测试时如何处理不稳定的测试数据

    使用 Chai 进行 API 测试时如何处理不稳定的测试数据 在进行 API 测试的过程中,我们可能会遇到一些不稳定的测试数据。这些数据可能会因为各种原因而发生变化,例如某个接口返回的数据结构有所改变...

    9 个月前

相关推荐

    暂无文章