SPA 中的 Redux 入门教程

引言

随着 Web 技术日新月异的发展,越来越多的项目采用前后端分离的方式进行开发。而前端作为用户与 Web 应用的交互界面,其代码量和复杂度也逐渐增加。在这样的背景下,为了更好地管理前端代码,开发者们开始注重状态管理机制的实现。因此,Redux 作为流行的应用状态管理工具而广受欢迎。

本篇文章介绍了 Redux 在单页应用(SPA)中的使用,包括 Redux 的设计初衷、核心概念、工作原理以及详细的入门实践,帮助读者快速上手 Redux,提高 Web 应用的开发效率。

Redux 的设计初衷

Redux 的设计目标是「可预测性」(predictability)和「可维护性」(maintainability)。具体来说:

  • 可预测性:Redux 提供了一种明确、可预测的方法来更新应用的状态(state)。开发人员能够清晰地跟踪应用程序状态的变化,这有助于减少出错概率并减轻维护负担。另外,Redux 还提供了时间旅行调试工具(time travel debugging),开发人员可以回溯到任何时间点上在应用中发生的状态变化。

  • 可维护性:Redux 强制实行单向数据流,使得整个应用的状态集中管理,方便代码的维护和代码逻辑的调试。Redux 通过 actions、reducers 和 store 这三个基本单元,进行了一系列精细的抽象和封装,使其逻辑结构更加清晰,易于维护和扩展。

Redux 的核心概念

在学习 Redux 之前,有必要先了解其三个基本概念:

  • Action:是一个对象,描述了发生了什么事情,比如用户点击了一个按钮或者数据从服务器返回了。

  • Reducer:是一个纯函数,它接收一个 action 和当前状态(state),返回一个新的状态。Reducer 的设计理念是「基于现有的状态和 action 生成新的状态」,因此 Redux 应用程序的状态总是不可变的。这一点非常重要,因为它允许开发人员追踪状态变化历史。

  • Store:是一个 JavaScript 对象,它保存了应用程序的状态。可以理解为 Redux 的数据仓库,它把 actions 分发给 reducers,更新状态并触发应用程序中的视图更新。

Redux 的工作原理

Redux 的工作流程如下:

  1. 调用 store.dispatch(action) 向 store 发出 action,一般在组件中触发。

  2. Redux store 调用传入的 reducer 函数,并传入当前的 state 和 action。

  3. reducer 函数处理 state 和 action,返回新的 state。

  4. Redux store 保存了 reducer 返回的新的 state,并且依次通知所有订阅 store 的 listeners。

  5. 监听函数重新渲染应用程序,以显示更新后的 state。

Redux 的入门实践

安装 Redux

可以使用 npm 命令进行安装:

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

创建 Redux Store

创建 Redux 的 Store,需要在应用程序中引入 Redux 的 createStore 方法和自定义的 reducer 函数,即可得到一个 store。以下代码演示了如何创建一个 Store:

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

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

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

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

上述代码中,createStore 函数传入的是 counterReducer 该 reducer 函数,initialState 初始状态设置为 { count: 0 },这里的 count 对应了一个组件内的计数器。如果在组件中调用 store.dispatch({ type: 'INCREMENT' });,store 就会调用 counterReducer 来更新计数器的值。

发布订阅模式

在 Redux 中,store 调用成功后,可以通过 store.subscribe(listener) 来订阅 store 的变化,每次 store 的状态更新后,订阅的 listener 会被调用。下面的代码演示了如何在视图中监听 store 的变化:

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

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

我们首先通过 document.body.innerHTML = store.getState().count; 来更新视图,然后通过 store.subscribe(render); 订阅 store,当 store 发生变化时,这个订阅的 View 方法就会被调用。

调用 action 来更新 store

在应用程序中,调用 action 来更新 store。下面的代码实现了为组件添加减少计数器值的功能(注意,此代码是基于 React 的):

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

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

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

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

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

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

在上述代码中,我们定义了 mapStateToPropsmapDispatchToProps 两个函数。 connect 方法将这两个方法注入到组件中的 props,如:

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

该函数接收一个 state,返回一个对象,这个对象被添加到组件的 props 中。我们可以使用 this.props.count 来访问当前计数器的值。

再看一下,mapDispatchToProps 中的 onClickIncrementonClickDecrement,它们被用来向 store 发送 INCREMENTDECREMENT action,如:

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

我们在组件中通过 this.props.onClickIncrement()this.props.onClickDecrement() 来对 store 发送对应的 action,即可触发 store 更新,视图也会被更新。

总结

本文介绍了 Redux 在单页应用(SPA)中的使用。我们首先了解了 Redux 的设计初衷、核心概念和工作原理,然后通过入门示例展示了如何创建 Redux 的 Store、订阅 store 的变化以及通过调用 action 来更新 store。Redux 的使用方法有很多,本文仅仅是最基础的介绍。读者可以根据自己的需要进行更加深入的学习和使用。

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


猜你喜欢

  • Material Design 中的对话框组件

    Material Design 是 Google 推出的一种设计语言,它标志着一种全新的设计风格。在 Material Design 的设计语言中,对话框组件是一种常用的界面元素,它可以让用户轻松地与...

    1 年前
  • Hapi 插件实现之使用 Elasticsearch 搜索数据

    前言 Elasticsearch 是一个基于 Lucene 的开源搜索引擎,它提供了一个分布式、多租户的全文搜索引擎、实时分析搜索等功能。在 Web 开发过程中,我们经常需要使用 Elasticsea...

    1 年前
  • 如何在 PM2 中设置进程运行的端口号

    如何在 PM2 中设置进程运行的端口号? PM2 是一个流行的进程管理器,可以便捷地管理 Node.js 应用程序的生命周期。在使用 PM2 管理应用程序时,经常需要为进程配置端口号。

    1 年前
  • 细数 JavaScript 的新增方法:Array.flat() 和 Array.flatMap()”

    细数 JavaScript 的新增方法:Array.flat() 和 Array.flatMap() JavaScript 是前端开发中最常用的编程语言之一,它的语法特性不断更新,为开发人员提供了更多...

    1 年前
  • 如何使用 TypeScript 进行 Web 开发

    TypeScript 是一种由 Microsoft 开发的静态类型检查器,逐渐成为前端开发领域的热门技术。它可以让 JavaScript 代码更加规范和安全,提高代码的可读性和可维护性,让团队协作变得...

    1 年前
  • 使用 Oak 和 Deno 开发 API

    在前端领域,开发 API 可以说是非常重要的一项技能。在过去,我们通常会使用 Node.js 来开发我们自己的 API。现在,随着技术的发展,我们也有了其他选择,比如使用 Oak 和 Deno 来开发...

    1 年前
  • ES2020 的 Selector API 规范

    ES2020 引入了一项新的 API 规范,即 Selector API,用于在 DOM 中选取元素。这是一个非常有用的工具,可以帮助开发者更加方便地通过 JavaScript 操纵和选取页面上的元素...

    1 年前
  • 利用 Jest 进行小程序组件测试的实践经验

    在现代前端开发中,测试是代码质量保证不可或缺的一部分。而在小程序中,组件测试更是必须实现的一项。而 Jest 作为一款前端测试框架,同时也能够完美支持小程序组件的测试。

    1 年前
  • 如何使用 ng-template 实现选择面板

    在前端开发中,面板是一个常见的 UI 组件,用户可以通过面板来选择不同的选项。而 ng-template 是 Angular 提供的一个模板机制,可以用来创建可复用的组件模板,非常适合用于构建面板组件...

    1 年前
  • CSS Reset 编写技巧和实现方法详解

    CSS Reset 用于消除浏览器默认的 CSS 样式和不同浏览器之间的差异,以确保不同浏览器显示相同的页面效果。在实际前端开发中,使用 CSS Reset 可以大大提高页面的可重用性和可维护性,极大...

    1 年前
  • 如何使用 ES12 中的 Bigint 类型编写高效的 JavaScript 代码

    在 JavaScript 中,数值类型通常包括整数和浮点数,但是有时候我们需要处理超出正常整数表示范围的数字,例如处理金融交易或使用密码算法等。ES12 新增的 BigInt 类型让 JavaScri...

    1 年前
  • ESLint 配置文件如何兼容不同版本?

    概述 ESLint 是目前前端开发中最为流行的 JavaScript 代码检查工具之一,它可以帮助开发者提高代码质量和规范性。但是,随着 ESLint 版本的不断升级,一些 API 和配置项也随之发生...

    1 年前
  • 原生 JavaScript 实现 Server-sent Events

    介绍 Server-sent Events(简称 SSE)是一种服务器向客户端推送实时数据的协议,相比 WebSocket,它更轻量级,更易于实现,能够提供基于 HTTP 的实时数据更新。

    1 年前
  • Cypress 如何进行可用性测试?

    前言 在当今的互联网时代,对于一个软件产品,用户体验和可用性是非常重要的因素。如果一个产品的用户体验和可用性不好,那么很可能会导致用户不使用或者流失,最终对于公司的业绩会带来不良的影响。

    1 年前
  • JavaScript ES6:如何使用 “类” 的概念

    在 ES6 中,我们可以使用“类”的概念来构建对象和实例化。这为 JavaScript 带来了新的面向对象编程范式,并使代码更具可读性和可扩展性。在本文中,我们将深入了解“类”的概念及其在 JavaS...

    1 年前
  • Redis 优化与监控

    Redis 是一个基于 Key-Value 的内存数据库,它可以支持不同的数据结构,包括字符串、哈希、列表、集合、有序集合等。Redis 有很高的性能和可扩展性,因此被广泛应用于 Web 开发领域。

    1 年前
  • 如何通过 Webpack 实现 SSR?

    前端领域中常常遇到的一个问题是,在应用程序中使用服务端渲染进行一些操作,如何实现这一功能呢?使用 webpack 技术可以帮助我们完成这一任务。 什么是 SSR? 首先,了解一下什么是 SSR。

    1 年前
  • 如何基于 Fastify 构建可扩展的微服务

    引言 微服务架构是目前互联网应用开发的一个重要发展趋势,它能够提高开发效率和系统的可伸缩性。Fastify 是一个快速、低开销、并且可扩展的 Node.js 框架,被广泛用于实现微服务。

    1 年前
  • ## 对比分析 ES6 的 `const`、`let`、`var` 三种声明变量的方式

    对比分析 ES6 的 const、let、var 三种声明变量的方式 随着 ECMAScript 2015 规范(也称为 ES6)的发布,JavaScript 语言的变量声明方式也得到了改善和升级。

    1 年前
  • 使用 Custom Elements 和 IndexedDB 构建自定义本地存储组件

    前言 在前端开发过程中,经常需要使用本地存储技术来实现数据持久化的需求。传统的本地存储方案,如 cookie 和 localStorage,虽然使用简单,但存在一定的安全性问题和存储容量限制。

    1 年前

相关推荐

    暂无文章