学习 Redux:从 “你不知道的 JavaScript” 到实际应用

Redux 是一个流行的 JavaScript 应用程序状态管理工具。它旨在简化前端应用程序数据的存储和操作,并且能够轻松跨组件维护数据。

虽然 Redux 可以用于任何 JavaScript 应用程序,它最常用于 React 应用程序中。本文将介绍 Redux 的基本概念和工作原理,并提供一些实践经验和示例代码。

Redux 前置知识

在学习 Redux 之前,需要对 JavaScript 有一定的了解。特别是需要对闭包、函数式编程和 ES6 等语言特性有一定的掌握。如果您还没有学习这些知识,我们建议您先学习这些主题。

在这里提到的一些重要概念包括:

  • 函数式编程
  • 纯函数
  • 组合
  • 核心 Redux 概念:state、action、reducers 和 store
  • React 组件在 Redux 中的作用

Redux 概述

Redux 是一个状态容器,它允许我们将应用程序数据存储在一个单独的地方,而不是分散在多个组件中。它允许我们通过 store 总体掌握应用程序状态。

核心概念

Redux 包含以下核心概念:

  1. State:应用程序数据,以单一对象形式呈现。
  2. Action:对 State 进行操作的对象,包含一个 action 类型和一个可选数据负载。
  3. Reducer:一个纯函数,根据 Action 的类型来更新 State。
  4. Store:将 State、Action 和 Reducer 结合在一起的对象。Store 通过 dispatch 方法来处理 Action,Reducer 根据 Action 类型更新 State。Store 可以通过 subscribe 方法添加监听器。

三大原则

Redux 的设计受到了 Flux 架构的启发,但是有一些重要区别。下面是 Redux 设计的三个基本原则:

  1. 单一状态树:应用程序的所有状态都存储在一个单一对象中。
  2. 状态只读:不能直接改变状态,需要触发一个 Action。
  3. 纯函数更新状态:Reducer 是一个纯函数,它可以根据 Action 的类型和可选负载更新 State。

Redux 实践

在 Redux 应用中,React 组件会通过 dispatch 发送一个 action,然后 Reducer 函数会修改状态树,Redux 使用 store 来组织状态,通过 store 来派发更新,更新后渲染组件。

下面是一个使用 Redux 实现 To-Do App 的示例。

Store

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

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

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

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

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

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

Action Creator

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

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

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

React 组件

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

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

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

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

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

在上面的示例中,我们首先创建了一个 Store,并将 todosReducer 函数作为参数传入。todosReducer 函数返回了一个新的 State 对象,根据 Action 的类型更新 State。Store 可以通过 getState 方法来获取状态。

我们还创建了一个 ADD_TODO 类型的 action creator,用于向 Store 发送操作指令。我们将该 action creator 导出,方便其他组件调用。

在 React 组件中,我们使用了高阶组件 useEffect 监听 Store 的 update 事件,每次修改渲染 UI。handleClick 函数接受表单数据,调用添加 Action Creator 的方法,并将 todoText 传递给 reducer 处理。

总结

Redux 是一个流行的前端状态管理工具,它有很多强大的特性,是 React 中最佳的存储库之一。本文介绍了 Redux 的核心概念和工作原理,并提供了一个使用 Redux 和 React 实现 To-Do App 的示例。学习 Redux 的过程中,学习一些高级概念和设计模式是必须的,但是纯函数的理解和实现,是入门 Redux 的首要难点。

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


猜你喜欢

  • Babel 中如何使用 Class Properties 和 Class Fields

    在现代 JavaScript 中,类 (Class) 是一种非常常见的编程方式。但是,JavaScript 中的 Class 功能相对于其他编程语言来说还比较青涩,缺乏一些基本的语法特性,例如:cla...

    1 年前
  • RESTful API 中的数据过滤详解

    随着 RESTful API 的广泛应用,越来越多的 Web 应用程序需要检索数据并根据用户的需要返回特定的数据。在大型系统中,数据过滤变得尤为重要,因为过滤数据可以减少返回的数据量并提高系统的响应速...

    1 年前
  • 从拍平数组到递归对象:解析 ES11 新增的 array.flat、arr.filter 和 Object.fromEntries

    在前端开发中,经常会遇到对数组和对象的操作,特别是在对数据进行处理和展示时,对数据的操作是不可或缺的。ES11 新增了一些数组和对象的新方法,本文将详细介绍其中的 array.flat、arr.fil...

    1 年前
  • 在 Node.js 项目中如何集成 ESLint

    在 Node.js 项目中如何集成 ESLint 随着 JavaScript 代码量的不断增长和团队协作的加强,代码风格的一致性逐渐变得非常重要。ESLint 是一个功能强大的 JavaScript ...

    1 年前
  • 无障碍设备开发与智能家居应用的结合

    随着科技的不断发展,智能家居应用越来越普及,它能给人们带来很多便利,例如:自动化控制、节能减排等等。但是有一个问题必须要面对:智能家居应用是否也能让使用一些特殊设备、例如视力、听力等障碍的人士得...

    1 年前
  • Chai 如何断言两个浮点数是否接近

    Chai 如何断言两个浮点数是否接近 在前端编程中,我们经常需要比较浮点数的值。然而,由于浮点数的精度问题,可能会导致两个看似相等的浮点数在比较时出现误差。为了应对这个问题,Chai 提供了一个接近断...

    1 年前
  • ECMAScript 2019 (ES10): 利用 closure 可尝试模拟私有属性实现

    在 JavaScript 中,我们经常需要在对象中定义私有属性。而如果使用传统的方法,我们通常需要使用下划线前缀命名属性来表示它们是私有的。但在 ECMAScript 2019 (ES10) 中,我们...

    1 年前
  • Express.js 中使用 body-parser 中间件解析 POST 请求参数

    介绍 在 Node.js 和 Express.js 中,处理 HTTP 请求是非常常见的任务。虽然 GET 请求可以将参数放在 URL 中,但 POST 请求通常需要将参数放在请求正文中。

    1 年前
  • 盘点 Web Components 的优点和缺点

    随着前端技术的不断进步和发展,我们也不断的迎来新的开发理念和技术概念。Web Components 是一个很好的例子,它可以被看作是一种新型的前端开发技术。这里我们将详细讨论 Web Componen...

    1 年前
  • 基于 JWT 的认证和授权在 Next.js 中的应用实践

    基于 JWT 的认证和授权在 Next.js 中的应用实践 前言 基于 JWT 的认证和授权在现在的前后端开发中已成为一种常见的方式。Next.js 是一个非常流行的 React 框架,它提供了服务器...

    1 年前
  • 用 PM2 部署 Node.js 项目

    在 Node.js 项目中,部署是一个必须要考虑的问题。因为 Node.js 项目的本质是单线程、异步 IO,能承受的请求是有限的,而且 Node.js 代码在处理请求时也需要加载一些资源,比如代码、...

    1 年前
  • Angular 中如何实现下拉框

    下拉框(dropdown)是前端开发中常用的组件之一,它通常用于选择某个选项或展示下拉菜单。Angular 是一个流行的前端框架,在 Angular 中实现下拉框的过程也比较简单。

    1 年前
  • 解决 Tailwind 中 Flexbox 布局出现间距的问题

    在开发前端应用时,常常使用 Flexbox 布局来实现灵活且简洁的页面布局。而在使用 Tailwind CSS 进行开发时,我们有时会遇到 Flexbox 布局出现间距的问题。

    1 年前
  • Mongoose 中使用 update 查询的方式及常见错误详解

    前言 Mongoose 是 Node.js 下应用最广泛的 MongoDB 驱动,它提供了一系列操作 MongoDB 数据库的 API,极大地方便了 Node.js 开发者的开发工作。

    1 年前
  • Deno 中如何实现多线程并发操作

    Deno 是一个安全的 JavaScript 和 TypeScript 运行时,与 Node.js 相比,它具有更高的安全性和更好的模块化支持,并且支持用 Rust 编写的本地扩展。

    1 年前
  • Promise.allSettled() 在 ES12 中的实现

    在 JavaScript 前端开发中,异步编程是一个不可避免的话题,Promise 是一种常用的实现异步编程的方式。在 ES6 引入 Promise 后,它的使用逐渐普及。

    1 年前
  • ES6 中的 async/await 使用详解

    在现代前端开发中,异步操作是不可避免的。为了提高代码可读性和可维护性,ES6 在语言层面加入了 async/await,来处理异步操作,使得异步代码更加清晰易懂。本文将详细介绍 async/await...

    1 年前
  • Socket.io 连接中断的可能原因及解决方案

    在前端开发中,经常会在项目中使用 Socket.io 进行实时通信。然而,在实际应用中,我们可能会遇到 Socket.io 连接中断的问题,这会影响到我们的项目的正常运行。

    1 年前
  • GraphQL 中的全文搜索实现

    GraphQL 是一种用于 API 开发的语言和运行时环境。该语言用于查询和操作数据,是一个在 API 领域备受好评的技术。在这篇文章中,我们将重点关注 GraphQL 中的全文搜索实现。

    1 年前
  • Mocha 测试框架:使用 this.timeout() 方法设置超时时间

    Mocha 测试框架:使用 this.timeout() 方法设置超时时间 Mocha 是 Node.js 下最流行的 JavaScript 测试框架之一。它的简单易用性和灵活的配置使其成为前端开发者...

    1 年前

相关推荐

    暂无文章