如何在 Angular SPA 中使用 NgRx 进行全局状态管理

在现代的前端开发中,单页应用(SPA)已成为一种常见的开发方式,因为它可以提高用户体验并提供更流畅的用户交互。然而,SPA 的开发也带来了一些挑战,其中一个挑战就是管理应用程序中的状态。 在这种情况下,一个流行的解决方案是使用状态管理工具,例如 NgRx。

NgRx 是一个基于 Redux 架构的 Angular 状态管理库,它有助于管理应用程序的状态并提供可预测的应用程序状态。 在本文中,我们将探讨如何在 Angular SPA 中使用 NgRx 进行全局状态管理。

安装 NgRx

首先,我们需要安装 @ngrx/store 以及相关的 RxJS 连接操作符以连接与操作 store。可以使用 Angular CLI 的命令 npm install @ngrx/store @ngrx/effects @ngrx/entity @ngrx/store-devtools来直接安装这些依赖项。

创建 Store

我们需要创建一个新的 store,在这个 store 中存储所有应用程序的状态。Store 可以通过创建一个根 reducer 和传递给 StoreModule 来创建。

在根目录下,创建一个新文件夹叫做“store”,然后再创建一个名为“index.ts”的新文件。下面是 index.ts 文件的代码示例:

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

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

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

在上面的代码中,我们将创建一个空的应用程序状态 AppState,并定义一个空的 reducer。

接下来,我们需要将这个 root reducer 注册到应用程序中,以便使用 NgRx 提供的 Store 管理应用程序状态。在 app.module.ts 文件中导入 StoreModule,然后在 imports 数组中注册 StoreModule 和 reducers,示例代码如下:

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

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

在上面的代码中,我们使用 StoreModule.forRoot 接受 reducers 对象并将其传递到 Store。forFeature 方法与主存储库不同,它接受一个特定方面的名称和一组 reducers。专业方面不是必需的,但它确保了我们在合并不同的 store 片段时不会混入状态。

创建 Actions

现在,我们需要定义一些 actions 允许我们改变状态。 action 是一个用来描述我们将要执行的操作(例如添加一个条目或删除一个条目)的对象。 NgRx 提供了一个 createReducer 函数,帮助我们定义操作的 reducer 函数。下面是创建 action 的示例代码:

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

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

在上面的代码中,我们定义了三个 actions:increment、decrement 和 reset。[actionName] 表示 action 的类型。 createAction() 函数返回一个 ActionCreator,它将创建一个 action(一个带有 type 字段的对象)。我们还可以在 createAction() 函数中传递相关的参数,如“payload”,以更改状态。

创建 Reducers

Reducer 是一段纯函数,它根据当前状态和 action 返回一个新的状态。reducers 由 NgRx store 负责执行组合。在这里,我们重写 reducers 对象,将其反映在我们的 state,来管理increment、decrement 和reset actions。下面是示例代码:

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

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

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

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

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

在上面的代码中,我们首先定义 CounterState,然后定义 initialState。最后,我们创建了一个谔谔函数组(counterReducer),并将它传递给我们的 rootReducer。 我们可以看到,我们在 reducer 的 body 中使用了 Reducer utility 函数中的 on() API。此API 用于定义 reducer 的行为,然后将它们与我们定义的 increment、decrement 和 reset actions 关联。

创建 Selectors

为了获得应用程序状态的所有可能部分,您需要创建一个选择器,选择器就是用来将 store 中的数据提取到应用程序中的函数,从而使我们能够在视图中对其进行访问和使用不同的组件数据。下面是一个创建 Counter 选择器的示例代码:

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

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

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

在上面的代码中,我们首先定义一个选择器 selectCounter,它将返回 CounterState 对象的 state,然后再创建 selectCount 选择器,它将 CounterState 对象中的 count 字段返回为一个整数。

派遣 Actions

现在,我们已经定义了所有操作、reducers 和 selectors,我们可以通过派发 action 来改变 state:

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

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

在上面的代码中,我们首先导入 Store,并利用「函数式编程」的方式创建一个名为 count$ 的可观察对象,它将选择 selectCount 选择器并用于返回当前计数器的值。 然后,我们定义三个 action 操作: increment、decrement 和 reset。 当我们调用 increment、decrement 或 reset 操作时,它们持续派发一个 action 到 store 中,然后 store.reducer() 方法返回一个新的 state,这个 state 接着反馈到组件中。

总结

在本文中,我们探讨了如何在 Angular SPA 中使用 NgRx 进行全局状态管理。我们讨论了在根目录和特定 feature 下创建和注册 store、创建 actions、reducers 和 selectors、以及派遣 actions 方法。

虽然 NgRx 为 Angular 应用程序提供了可预测的状态管理解决方案,但它可能会导致一些代码重复。建议在新项目中考虑使用 React 进行状态管理,因为它可以使用更优秀的库,如 Redux 或 MobX,更方便地提供更好的解决方案。

示例代码

完整的示例代码可以在这里找到:https://github.com/ngrx/platform/tree/master/example-app

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


猜你喜欢

  • Express.js 中测试驱动开发的方法和工具推荐

    测试驱动开发(Test-Driven Development,简称 TDD)是一种面向测试的软件开发方法,它可以帮助开发者更加高效地编写代码,减少错误和调试时间。在前端开发中,Express.js 是...

    1 年前
  • ES11: Promise.allSettled 方法使用说明

    Promise.allSettled 方法是 ES11 新加入的 Promise 方法,它可以接受一个 Promise 数组作为参数,返回一个新的 Promise 实例,该实例在所有的 Promise...

    1 年前
  • Fastify 中的 Schema 教程

    Fastify 是一个快速且低开销的 Node.js Web 框架,它非常适合用于构建高效、可伸缩的 Web 应用程序。在 Fastify 中,Schema 是一个核心功能,用于验证请求和响应负载,它...

    1 年前
  • Angular 中如何使用 @Output 装饰器及 EventEmitter 发送事件

    Angular 中的 @Output 装饰器和 EventEmitter 提供了一种方便的机制来实现组件间的通信。在这篇文章中,我们将深入学习如何使用它们来发送事件。

    1 年前
  • # Sequelize 中如何实现完整性约束

    Sequelize 中如何实现完整性约束 在关系型数据库中,完整性约束是一种保证数据不被破坏、不失真的重要手段。Sequelize 作为一种 Node.js 的 ORM 框架,也提供了完整性约束功能。

    1 年前
  • 国内外 Web Components 标准化进程及其相关规范

    随着 Web 技术的日益发展,Web Components 技术逐渐成为前端开发者的热门话题。Web Components 技术是指一系列关于 web 应用组件化的规范和工具,帮助开发者将整个应用分为...

    1 年前
  • ESLint+VSCode 自动格式化代码

    ESLint+VSCode 自动格式化代码 在前端开发中,代码的格式化是一项非常重要的工作。良好的代码格式不仅可以使代码更加易读,还有助于代码的维护和开发。但是,手动格式化代码往往是一项非常繁琐且浪费...

    1 年前
  • Enzyme:React Native 测试工具的完美伴侣

    前言 React Native 是一个让前端开发者能够轻松创建原生应用的框架,但是随着代码规模的增大,测试变得越来越重要。而 Enzyme 就是一个非常优秀的测试工具,它可以帮助我们方便地进行 Rea...

    1 年前
  • 使用 ES9 中的 Object.fromEntries 方法来转换键值对为对象

    在 JavaScript 编程中,我们经常需要在键值对之间转换。这种需求在前端开发领域中尤其常见,涉及到许多与用户输入、API 响应等交互相关的场景。在 ES9 中,新增了一个称为 Object.fr...

    1 年前
  • 对比 Koa.js 和 Express.js:哪一个更适合你的下一个项目?

    随着 Node.js 技术的发展和广泛应用,前端界的框架也越来越多。其中 Express.js 及 Koa.js 都是非常受欢迎的 Node.js 框架。本文将从多个方面对比两者的异同,帮助读者选择更...

    1 年前
  • Redis 集群环境下数据同步异常的解决方法

    在 Redis 集群环境下,数据同步异常是一个十分常见的现象。这种异常会导致 Redis 集群中的数据不一致,进而影响应用程序的正确性和性能。本文将介绍 Redis 集群环境下数据同步异常的解决方法。

    1 年前
  • CSS Reset 对于网页排版的优化

    CSS Reset 是一种优化网页排版的技术。在开发网页时,每个浏览器都有自己的默认样式表,这会导致不同的浏览器展示相同的 HTML 后效果不同,甚至可能完全不同。

    1 年前
  • CSS Flexbox 实现的实验性联动布局

    在前端开发中,布局是一个非常重要的部分。随着 Web 应用的复杂性不断增加,传统的布局方式逐渐显得不够灵活和强大。CSS3 的 Flexbox 能够提供更为强大的布局管理能力,本篇文章将介绍 Flex...

    1 年前
  • MongoDB 中的批量写入操作实现

    介绍 在 MongoDB 中,批量写入操作是一个非常常见的操作,它可以大大提高数据的写入效率。在实际的开发中,我们可能需要对多个文档进行插入、更新或删除操作,这时候使用批量操作可以让我们的代码更加简洁...

    1 年前
  • Socket.io实现聊天功能详解

    本文将介绍如何使用Socket.io实现一个基于web的聊天应用。Socket.io是一个websocket库,它可以在客户端和服务器之间建立实时的双向通信连接,使得页面可以及时地接收到来自服务器的消...

    1 年前
  • LESS 中使用父元素的技巧

    LESS 中使用父元素的技巧 在前端开发中,CSS 是必不可少的一部分。而 LESS 作为一款预处理器,可以帮助我们更方便、更高效地编写 CSS。在 LESS 中,使用父元素的技巧可以让我们更轻松地管...

    1 年前
  • 如何在 Node.js 中使用 Sequelize 进行 ORM 操作

    在开发 Web 应用程序的过程中,我们通常需要使用数据库来存储和管理数据。而 ORM(Object-Relational Mapping)则可以将数据库中的数据映射到应用程序中的对象上,以便更方便地操...

    1 年前
  • SASS 中 @if/@else 规则使用详解

    SASS(Syntactically Awesome Style Sheets)是一种样式表语言,它扩展了 CSS,为前端开发者提供了更加强大和灵活的样式表编写方式。

    1 年前
  • 文件路径不正确导致 Webpack 打包失败的解决办法

    前言 在开发前端应用时,Webpack 是一个极为重要的工具。它可以将多个 JavaScript、CSS、图片等文件打包成一个或多个文件,优化应用的性能和加载速度。

    1 年前
  • 基于 HTTP 协议的 RESTful API 遗留系统接口优化实践

    RESTful API 是一种设计风格,通常基于 HTTP 协议,用于构建可伸缩的 Web 应用程序。在实际开发中,我们可能需要优化遗留系统的接口,以便更好地使用 RESTful API 的优势。

    1 年前

相关推荐

    暂无文章