在 Angular 应用开发中,随着业务复杂度提升,组件间的状态共享、数据流转管理会变得越来越棘手。NgRx 作为基于 Redux 模式的 Angular 状态管理库,能帮助我们构建可预测、可维护、可扩展的应用。本文将从核心概念入手,带你入门 NgRx,理解 Store、Action、Reducer 的核心逻辑。
一、为什么需要 NgRx?
在小型 Angular 应用中,我们可以通过 @Input()/@Output()、服务单例等方式管理状态,但在中大型应用中,这些方式会暴露明显问题:
- 状态分散在各个组件 / 服务中,追踪数据变化变得困难;
- 组件间通信链路复杂,容易出现 "回调地狱";
- 状态修改无统一规范,难以定位 Bug;
- 缺乏状态变更的可追溯性,调试成本高。
NgRx 借鉴 Redux 的核心思想,通过单一数据源、状态只读、纯函数修改三大原则,解决上述问题,让应用状态管理更清晰。
二、NgRx 核心概念:Store、Action、Reducer
1. 核心思想铺垫
NgRx 的核心流程可以总结为:
简单来说:组件触发 Action,Reducer 根据 Action 类型修改状态,Store 存储最终状态,组件订阅 Store 获取最新状态。
2. 环境准备
首先需要安装 NgRx 核心依赖(以 Angular 17 为例):
npm install @ngrx/store @ngrx/effects --save
npm install @ngrx/store-devtools --save-dev
3. Action:状态变更的 "指令"
Action 是描述发生了什么的纯对象,是修改状态的唯一入口。它必须包含 type 属性(唯一标识),可选包含 payload(携带的数据)。
定义 Action
使用 NgRx 提供的 createAction 函数创建 Action,更简洁且类型安全:
// src/app/store/counter.actions.ts
import { createAction, props } from '@ngrx/store';
// 增加计数
export const increment = createAction('[Counter] Increment');
// 减少计数
export const decrement = createAction('[Counter] Decrement');
// 设置计数(携带 payload)
export const setCount = createAction(
'[Counter] Set Count',
props<{ count: number }>()
);


