4.Angular 生态与工具


文档摘要

4.Angular 生态与工具 Angular 生态与工具 4.1 Angular CLI:脚手架与开发利器 Angular CLI (Command Line Interface) 是 Angular 官方提供的命令行工具,它极大地简化了 Angular 项目的创建、开发、构建和部署流程。Angular CLI 不仅仅是一个脚手架,更是贯穿 Angular 项目生命周期的核心工具,是每个 Angular 开发者必须熟练掌握的。 4.1.1 安装 Angular CLI 首先,你需要全局安装 Angular CLI。确保你已经安装了 Node.js 和 npm (或 yarn)。

# 4.Angular 生态与工具 ## 4. Angular 生态与工具 ### 4.1 Angular CLI:脚手架与开发利器 Angular CLI (Command Line Interface) 是 Angular 官方提供的命令行工具,它极大地简化了 Angular 项目的创建、开发、构建和部署流程。Angular CLI 不仅仅是一个脚手架,更是贯穿 Angular 项目生命周期的核心工具,是每个 Angular 开发者必须熟练掌握的。 #### 4.1.1 安装 Angular CLI 首先,你需要全局安装 Angular CLI。确保你已经安装了 Node.js 和 npm (或 yarn)。在命令行终端中执行以下命令: ```bash npm install -g @angular/cli ``` 或者使用 yarn: ```bash yarn global add @angular/cli ``` 安装完成后,你可以通过以下命令验证 Angular CLI 是否安装成功: ```bash ng --version ``` 该命令会显示 Angular CLI 的版本信息以及相关的 Node.js 和操作系统信息。 #### 4.1.2 创建 Angular 项目 使用 Angular CLI 创建一个新的 Angular 项目非常简单,只需要执行 `ng new` 命令。例如,创建一个名为 `my-angular-app` 的项目: ```bash ng new my-angular-app ``` 执行该命令后,Angular CLI 会提示你选择一些配置选项,例如是否添加 Angular Routing 和选择样式表格式(CSS, SCSS, Less 等)。根据你的需求选择即可。 Angular CLI 会自动生成一个包含必要文件和目录结构的 Angular 项目,并自动安装项目依赖。项目结构如下: ``` my-angular-app/ ├── .editorconfig ├── .gitignore ├── angular.json # Angular CLI 配置文件 ├── package.json # npm 配置文件,包含项目依赖和脚本 ├── README.md ├── tsconfig.json # TypeScript 配置文件 ├── src/ │ ├── app/ # 应用核心模块 │ │ ├── app.component.css │ │ ├── app.component.html │ │ ├── app.component.spec.ts │ │ ├── app.component.ts │ │ └── app.module.ts │ ├── assets/ # 静态资源目录 │ ├── environments/ # 环境变量配置 │ ├── index.html # 应用入口 HTML 文件 │ ├── main.ts # 应用启动入口 │ ├── polyfills.ts # 浏览器兼容性补丁 │ ├── styles.css # 全局样式文件 │ ├── test.ts # 测试入口文件 │ └── tsconfig.app.json # 应用 TypeScript 配置文件 ├── e2e/ # 端到端测试目录 └── node_modules/ # 项目依赖包 ``` **代码实践:创建并运行 Angular 项目** 1. 打开命令行终端,导航到你想要创建项目的目录。 2. 执行 `ng new my-angular-app` 命令。 3. 根据提示选择配置选项(例如选择 "Yes" for Angular Routing, and "CSS" for stylesheet format)。 4. 等待项目创建和依赖安装完成。 5. 进入项目目录: `cd my-angular-app` 6. 启动开发服务器: `ng serve` 7. 打开浏览器,访问 `http://localhost:4200`,你将看到 Angular 应用的默认欢迎页面。 #### 4.1.3 代码生成:高效开发的核心 Angular CLI 提供了强大的代码生成功能,可以快速生成组件 (Component)、服务 (Service)、模块 (Module)、管道 (Pipe)、指令 (Directive) 等 Angular 应用的各种构建块。使用 `ng generate` 命令可以快速创建这些代码骨架,极大地提升开发效率。 **常用代码生成命令:** * **生成组件:** `ng generate component ` 或简写 `ng g c ` * **生成服务:** `ng generate service ` 或简写 `ng g s ` * **生成模块:** `ng generate module ` 或简写 `ng g m ` * **生成管道:** `ng generate pipe ` 或简写 `ng g p ` * **生成指令:** `ng generate directive ` 或简写 `ng g d ` * **生成类:** `ng generate class ` 或简写 `ng g cl ` * **生成接口:** `ng generate interface ` 或简写 `ng g i ` * **生成枚举:** `ng generate enum ` 或简写 `ng g en ` **代码实践:生成组件和服务** 1. 在项目根目录下,打开命令行终端。 2. 生成一个名为 `product-list` 的组件: `ng g c product-list` 3. 生成一个名为 `product` 的服务: `ng g s product` Angular CLI 会自动创建组件和服务的文件,并自动在相应的模块中声明和导入组件。 **代码详解:生成的组件文件 (product-list.component.ts)** ```typescript import { Component } from '@angular/core'; @Component({ selector: 'app-product-list', // 组件选择器,用于在 HTML 中使用 standalone: true, // Angular 17+ 独立组件特性 imports: [], // Angular 17+ 独立组件特性 templateUrl: './product-list.component.html', // 组件 HTML 模板文件路径 styleUrl: './product-list.component.css' // 组件 CSS 样式文件路径 }) export class ProductListComponent { } ``` **代码详解:生成的服务文件 (product.service.ts)** ```typescript import { Injectable } from '@angular/core'; @Injectable({ providedIn: 'root' // 将服务注册到根模块,使其在整个应用中可用 }) export class ProductService { constructor() { } } ``` #### 4.1.4 开发服务器与热重载 `ng serve` 命令启动 Angular 开发服务器,它会自动编译你的代码并在浏览器中运行应用。开发服务器还支持**热重载 (Hot Reload)** 功能。当你修改代码并保存时,开发服务器会自动重新编译并刷新浏览器,无需手动刷新页面即可看到修改后的效果,极大地提升了开发效率。 **命令:** `ng serve` **常用选项:** * `--open` 或 `-o`: 启动服务器后自动打开浏览器访问应用。 * `--port <端口号>` 或 `-p <端口号>`: 指定服务器端口号,默认端口号为 4200。 * `--host <主机名>`: 指定服务器主机名,默认主机名为 localhost。 * `--proxy-config `: 配置代理服务器,用于解决跨域请求问题。 **代码实践:启动开发服务器并配置代理** 1. 在项目根目录下,打开命令行终端。 2. 启动开发服务器并自动打开浏览器: `ng serve -o` 3. 创建一个 `proxy.conf.json` 文件在项目根目录下,配置代理规则,例如: ```json { "/api": { "target": "http://localhost:3000", // 后端 API 服务器地址 "secure": false, // 如果后端 API 是 HTTPS,设置为 true "changeOrigin": true } } ``` 4. 启动开发服务器并指定代理配置文件: `ng serve --proxy-config proxy.conf.json` 现在,当你的 Angular 应用发起以 `/api` 开头的请求时,Angular CLI 开发服务器会自动将请求代理到 `http://localhost:3000`。 #### 4.1.5 构建与部署 `ng build` 命令用于构建生产环境可部署的 Angular 应用。它会对代码进行编译、优化、压缩等处理,生成静态资源文件,可以部署到 Web 服务器或 CDN 上。 **命令:** `ng build` **常用选项:** * `--prod` 或 `-c production`: 以生产模式构建,进行更深度的优化和压缩。 * `--output-path <输出目录>` 或 `--op <输出目录>`: 指定构建输出目录,默认输出目录为 `dist/<项目名>`。 * `--base-href <基础路径>`: 指定应用的基础路径,用于部署到非根目录的场景。 **代码实践:构建生产环境应用** 1. 在项目根目录下,打开命令行终端。 2. 构建生产环境应用: `ng build --prod` 构建完成后,会在 `dist/my-angular-app` 目录下生成生产环境的应用文件。你可以将 `dist/my-angular-app` 目录下的文件部署到任何 Web 服务器上。 **部署到 GitHub Pages 示例:** 1. 安装 `angular-cli-ghpages` 包: `npm install -g angular-cli-ghpages` 2. 构建应用并部署到 GitHub Pages: `ng deploy` `ng deploy` 命令会自动构建应用并将其部署到 GitHub Pages (默认分支 `gh-pages`)。你需要确保你的 GitHub 仓库已启用 GitHub Pages 功能。 #### 4.1.6 其他常用 Angular CLI 命令 除了上述命令,Angular CLI 还提供了许多其他实用的命令,例如: * **`ng test`**: 运行单元测试。 * **`ng e2e`**: 运行端到端测试。 * **`ng lint`**: 运行代码静态检查工具 (Linting)。 * **`ng update`**: 更新 Angular 版本和依赖。 * **`ng add <包名>`**: 添加第三方库到 Angular 项目,并自动配置。 * **`ng config`**: 配置 Angular CLI 全局或项目级别的配置。 * **`ng doc <关键词>`**: 打开 Angular 官方文档并搜索关键词。 #### 4.1.7 Angular CLI 的扩展性:Schematics Angular CLI 的强大之处还在于其可扩展性。通过 **Schematics**,你可以自定义 Angular CLI 的行为,例如创建自定义的代码生成器、自动化项目配置、进行代码迁移等。Schematics 本质上是一些代码生成和转换的指令,它们可以读取、修改和生成代码文件。 **mermaid graph TD 图示 Angular CLI 工作流程:** ```mermaid graph TD A[开发者命令: ng new/generate/serve/build...] --> B(Angular CLI); B --> C{Schematics 引擎}; C --> D[内置 Schematics]; C --> E[自定义 Schematics]; D --> F[代码生成/修改]; E --> F; F --> G[项目文件系统]; G --> H[开发服务器 (ng serve)]; G --> I[构建输出 (ng build)]; H --> J[浏览器]; I --> K[部署]; style B fill:#f9f,stroke:#333,stroke-width:2px style C fill:#ccf,stroke:#333,stroke-width:2px ``` **图示详解:** 1. 开发者通过命令行输入 `ng` 开头的命令,例如 `ng new`, `ng generate`, `ng serve`, `ng build` 等。 2. Angular CLI 解析命令并将其传递给 Schematics 引擎。 3. Schematics 引擎根据命令类型选择执行内置 Schematics 或自定义 Schematics。 4. Schematics 执行代码生成或修改操作。 5. 修改后的项目文件系统用于启动开发服务器 (ng serve) 或构建输出 (ng build)。 6. 开发服务器将应用运行在浏览器中,构建输出用于部署。 **总结:** Angular CLI 是 Angular 开发的核心工具,它提供了项目脚手架、代码生成、开发服务器、构建部署等一系列功能,极大地简化了 Angular 开发流程,提高了开发效率。熟练掌握 Angular CLI 是成为高效 Angular 开发者的必要条件。 ### 4.2 Angular 组件库:构建丰富的 UI 界面 Angular 生态系统中拥有众多优秀的组件库,这些组件库提供了各种各样的 UI 组件,例如按钮、表单、表格、导航、对话框等,可以帮助开发者快速构建美观、功能丰富的用户界面,并减少重复造轮子的工作。 #### 4.2.1 Angular Material Angular Material 是 Angular 官方维护的 UI 组件库,它遵循 Material Design 设计规范,提供了一整套高质量、可访问性强的 UI 组件。Angular Material 组件库与 Angular 框架深度集成,性能优异,是构建现代 Web 应用的首选组件库之一。 **主要特点:** * **Material Design 风格:** 遵循 Google 的 Material Design 设计规范,界面美观统一。 * **丰富的组件:** 提供按钮、表单、导航、布局、数据表格、对话框、工具提示等各种常用 UI 组件。 * **可访问性 (Accessibility):** 注重可访问性设计,符合 WCAG 标准,提升用户体验。 * **主题定制 (Theming):** 强大的主题定制功能,可以轻松定制应用的视觉风格。 * **响应式设计 (Responsive Design):** 组件支持响应式布局,适应不同设备屏幕尺寸。 **代码实践:使用 Angular Material 组件** 1. **安装 Angular Material:** 在项目根目录下执行命令: `ng add @angular/material` 该命令会自动安装 Angular Material 组件库、Angular CDK (Component Dev Kit) 和 Angular Animations,并配置项目模块。 2. **导入 Material 组件模块:** 在你的模块 (例如 `app.module.ts` 或特性模块) 中导入需要的 Material 组件模块。例如,导入 `MatButtonModule` 和 `MatInputModule`: ```typescript import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { AppComponent } from './app.component'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; // 引入动画模块 import { MatButtonModule } from '@angular/material/button'; // 导入按钮模块 import { MatInputModule } from '@angular/material/input'; // 导入输入框模块 @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, BrowserAnimationsModule, // 引入动画模块 MatButtonModule, // 导入按钮模块 MatInputModule // 导入输入框模块 ], providers: [], bootstrap: [AppComponent] }) export class AppModule { } ``` 3. **在组件模板中使用 Material 组件:** 在你的组件 HTML 模板中使用 Material 组件,例如: ```html Primary Button Input Field ``` **代码详解:** * `` 使用 `mat-raised-button` 指令将普通 `` 元素转换为 Material Design 风格的凸起按钮,`color="primary"` 设置按钮颜色为主题主色。 * `` 和 `` 组合使用 Material Design 风格的输入框。 **mermaid graph TD 图示 Angular Material 组件库结构:** ```mermaid graph TD A[Angular Material] --> B(组件); A --> C(CDK); A --> D(主题系统); B --> B1[按钮]; B --> B2[表单]; B --> B3[导航]; B --> B4[表格]; B --> B5[对话框]; C --> C1[Overlay]; C --> C2[Portal]; C --> C3[Accessibility]; D --> D1[预置主题]; D --> D2[自定义主题]; style A fill:#f9f,stroke:#333,stroke-width:2px ``` **图示详解:** * **Angular Material 组件库** 核心包含三个部分:组件 (Components)、CDK (Component Dev Kit) 和 主题系统 (Theming System)。 * **组件 (Components)** 是 Angular Material 提供的各种 UI 组件,例如按钮、表单、导航、表格、对话框等。 * **CDK (Component Dev Kit)** 是组件开发工具包,提供了一系列底层工具和服务,用于构建可复用的 UI 组件,Angular Material 组件本身也基于 CDK 构建。CDK 包括 Overlay (浮层管理)、Portal (组件动态渲染)、Accessibility (可访问性工具) 等模块。 * **主题系统 (Theming System)** 用于定制 Angular Material 组件的视觉风格,包括预置主题和自定义主题。 #### 4.2.2 其他流行的 Angular 组件库 除了 Angular Material,Angular 生态系统中还有许多其他优秀的组件库,例如: * **PrimeNG:** 功能非常全面的商业级组件库,拥有丰富的组件和主题,性能优异。 * **NG-Bootstrap:** 基于 Bootstrap CSS 框架的 Angular 组件库,如果你熟悉 Bootstrap,可以快速上手。 * **Clarity:** VMware 开源的企业级 Angular 组件库,注重设计和用户体验。 * **Onsen UI:** 用于构建混合移动应用的组件库,支持 Angular、React 和 Vue.js。 * **Kendo UI for Angular:** Telerik 商业组件库,提供高性能和专业级的 UI 组件。 选择组件库时,需要根据项目需求、团队技术栈、组件库的功能和性能、以及社区活跃度等因素进行综合考虑。 **总结:** Angular 组件库是构建 Angular 应用的重要组成部分,它们提供了丰富的 UI 组件,可以加速开发过程,提高代码质量,并提升用户体验。Angular Material 是官方推荐的首选组件库,而其他组件库也各有特色,可以根据项目需求选择合适的组件库。 ### 4.3 RxJS:响应式编程的基石 RxJS (Reactive Extensions for JavaScript) 是一个使用 Observables 的响应式编程库,用于处理异步数据流和事件流。在 Angular 中,RxJS 扮演着至关重要的角色,Angular 的许多核心功能都基于 RxJS 构建,例如 HTTP 请求、事件处理、表单操作、状态管理等。理解和掌握 RxJS 是深入学习 Angular 的关键。 #### 4.3.1 响应式编程概念 响应式编程 (Reactive Programming) 是一种处理异步数据流的编程范式。它关注数据流的变化和传播,以及对变化的响应。在响应式编程中,数据流被称为 **Observable (可观察对象)**,数据流的消费者被称为 **Observer (观察者)**。Observer 订阅 Observable,当 Observable 发出新的数据时,Observer 会收到通知并做出响应。 **核心概念:** * **Observable (可观察对象):** 表示异步数据流或事件流。可以发出零个、一个或多个数据项,或者发出错误或完成信号。 * **Observer (观察者):** 订阅 Observable,并定义如何处理 Observable 发出的数据、错误和完成信号。 * **Subscription (订阅):** 表示 Observer 对 Observable 的订阅关系。订阅后,Observer 开始接收 Observable 发出的数据。 * **Operator (操作符):** 用于转换、过滤、组合 Observable 发出的数据流。例如 `map`, `filter`, `mergeMap`, `debounceTime` 等。 * **Subject (主题):** 既是 Observable 又是 Observer。可以手动发出数据,也可以订阅其他 Observable。 **mermaid graph TD 图示 RxJS 核心概念:** ```mermaid graph TD A[Observable] -->|发出数据/错误/完成| B(数据流); B --> C{Operators}; C --> D[转换/过滤/组合]; D --> E(新的数据流); E --> F[Observer]; F -->|订阅| A; style A fill:#f9f,stroke:#333,stroke-width:2px style F fill:#ccf,stroke:#333,stroke-width:2px ``` **图示详解:** 1. **Observable** 是数据流的源头,它可以发出数据、错误或完成信号。 2. **数据流** 经过 **Operators** 的处理,例如转换、过滤、组合等。 3. **Operators** 将原始数据流转换为新的数据流。 4. **Observer** 订阅 **Observable**,并接收新的数据流。 5. **Observer** 定义如何处理接收到的数据、错误和完成信号。 #### 4.3.2 Angular 中 RxJS 的应用 Angular 框架深度集成了 RxJS,许多核心功能都基于 RxJS 构建。 **常见应用场景:** * **HTTP 请求:** Angular 的 `HttpClient` 服务返回 Observable,用于处理异步 HTTP 请求。 * **事件处理:** Angular 的事件绑定机制 (例如 `(click)`) 返回 Observable,用于处理 DOM 事件。 * **表单操作:** Angular 的响应式表单 (Reactive Forms) 使用 Observable 来跟踪表单控件的值变化。 * **状态管理:** 状态管理库 (例如 NgRx, Akita) 通常使用 RxJS 来管理应用状态的变化。 * **组件通信:** 使用 Subject 或 BehaviorSubject 等 RxJS 主题进行组件间通信。 **代码实践:使用 RxJS 处理 HTTP 请求** ```typescript import { Component, OnInit } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; interface User { id: number; name: string; email: string; } @Component({ selector: 'app-user-list', standalone: true, imports: [], template: `
  • {{ user.name }} ({{ user.email }})
`, styleUrl: './user-list.component.css' }) export class UserListComponent implements OnInit { users$: Observable | undefined; // 声明 Observable 变量 constructor(private http: HttpClient) { } ngOnInit(): void { this.users$ = this.http.get('https://jsonplaceholder.typicode.com/users'); // 发起 HTTP GET 请求,返回 Observable } } ``` **代码详解:** * `this.http.get('https://jsonplaceholder.typicode.com/users')` 使用 `HttpClient` 的 `get` 方法发起 HTTP GET 请求,并指定响应数据类型为 `User[]`。`get` 方法返回一个 `Observable`。 * `this.users$ = ...` 将返回的 Observable 赋值给组件的 `users$` 属性。 * `*ngFor="let user of users$ | async"` 在模板中使用 `async` 管道订阅 `users$` Observable,当 Observable 发出新的数据时,`*ngFor` 会自动更新列表。 **常用 RxJS Operators:** * **`map`:** 转换 Observable 发出的数据项。 * **`filter`:** 过滤 Observable 发出的数据项。 * **`switchMap`:** 将 Observable 发出的数据项映射到新的 Observable,并取消前一个 Observable 的订阅。常用于处理搜索建议等场景。 * **`mergeMap` (或 `flatMap`):** 将 Observable 发出的数据项映射到新的 Observable,并合并所有 Observable 的结果。 * **`concatMap`:** 类似于 `mergeMap`,但保证 Observable 结果的顺序。 * **`debounceTime`:** 延迟 Observable 发出数据项,在指定时间内如果没有新的数据项发出,则发出最后一个数据项。常用于处理输入框搜索防抖。 * **`catchError`:** 捕获 Observable 的错误,并返回一个新的 Observable 或抛出错误。 * **`tap`:** 在 Observable 数据流中执行副作用操作,例如日志记录。 * **`takeUntil`:** 在另一个 Observable 发出信号时,完成当前 Observable 的订阅。常用于组件销毁时取消订阅,防止内存泄漏。 #### 4.3.3 RxJS Subject 和 BehaviorSubject **Subject** 是一种特殊类型的 Observable,它既是 Observable 又是 Observer。Subject 可以手动发出数据 (通过 `next()` 方法),也可以订阅其他 Observable。Subject 常用于组件间通信和事件总线。 **BehaviorSubject** 是 Subject 的子类,它会存储最近一次发出的值,并且当新的 Observer 订阅时,会立即发出最近一次的值。BehaviorSubject 常用于共享状态和初始化值。 **代码实践:使用 BehaviorSubject 进行组件间通信** **服务 (data.service.ts):** ```typescript import { Injectable } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; @Injectable({ providedIn: 'root' }) export class DataService { private messageSource = new BehaviorSubject("default message"); // 创建 BehaviorSubject,并设置初始值 currentMessage = this.messageSource.asObservable(); // 将 BehaviorSubject 转换为 Observable 供外部订阅 constructor() { } changeMessage(message: string) { this.messageSource.next(message); // 通过 next() 方法发出新的消息 } } ``` **组件 1 (component1.component.ts):** ```typescript import { Component } from '@angular/core'; import { DataService } from '../data.service'; @Component({ selector: 'app-component1', standalone: true, imports: [], template: `

Component 1: {{ message }}

Send New Message `, styleUrl: './component1.component.css' }) export class Component1Component { message: string = ''; constructor(private data: DataService) { this.data.currentMessage.subscribe(message => this.message = message) // 订阅 DataService 中的 currentMessage Observable } newMessage() { this.data.changeMessage("Hello from Component 1") // 通过 DataService 发送新的消息 } } ``` **组件 2 (component2.component.ts):** ```typescript import { Component } from '@angular/core'; import { DataService } from '../data.service'; @Component({ selector: 'app-component2', standalone: true, imports: [], template: `

Component 2: {{ message }}

`, styleUrl: './component2.component.css' }) export class Component2Component { message: string = ''; constructor(private data: DataService) { this.data.currentMessage.subscribe(message => this.message = message) // 订阅 DataService 中的 currentMessage Observable } } ``` **代码详解:** * `DataService` 使用 `BehaviorSubject` 创建了一个消息源 `messageSource`,并提供 `changeMessage` 方法用于更新消息。 * `currentMessage` 将 `messageSource` 转换为 Observable 供外部组件订阅。 * `Component1Component` 和 `Component2Component` 都订阅了 `DataService` 的 `currentMessage` Observable,当 `Component1Component` 通过 `changeMessage` 方法更新消息时,`Component2Component` 也会收到消息更新。 **总结:** RxJS 是 Angular 响应式编程的基石,掌握 RxJS 的核心概念和常用 Operators,可以帮助你更好地处理 Angular 应用中的异步数据流和事件流,构建更健壮、更高效的应用。Subject 和 BehaviorSubject 是 RxJS 中重要的主题类型,常用于组件间通信和状态管理。 ### 4.4 状态管理工具:NgRx 对于大型 Angular 应用,状态管理变得尤为重要。状态管理工具可以帮助你集中管理应用状态,简化状态的更新和共享,提高应用的可维护性和可测试性。NgRx 是 Angular 社区中最流行的状态管理库之一,它基于 Redux 模式和 RxJS 构建。 #### 4.4.1 Redux 模式 Redux 是一种可预测的状态容器,用于 JavaScript 应用的状态管理。Redux 模式的核心思想是: * **单一数据源 (Single Source of Truth):** 整个应用的状态都存储在一个单一的 Store 中。 * **状态只读 (State is Read-only):** Store 中的状态是只读的,只能通过 Actions 来触发状态的改变。 * **纯函数 Reducer (Reducers are pure functions):** Reducer 是纯函数,它接收当前状态和 Action,并返回新的状态。Reducer 不应该有副作用。 **mermaid graph TD 图示 Redux 数据流:** ```mermaid graph TD A[Component] --> B(Dispatch Action); B --> C[Action]; C --> D[Reducer]; D --> E[Store]; E --> F[State]; F --> G[Component]; style D fill:#f9f,stroke:#333,stroke-width:2px style E fill:#ccf,stroke:#333,stroke-width:2px ``` **图示详解:** 1. **Component** 触发一个 **Action** (例如用户点击按钮)。 2. **Action** 是一个描述 "发生了什么" 的普通 JavaScript 对象。 3. **Reducer** 是一个纯函数,它接收当前 **State** 和 **Action**,并根据 Action 类型返回新的 **State**。 4. **Store** 是整个应用状态的容器,它持有当前 **State**,并提供方法来 dispatch Actions 和订阅 State 的变化。 5. **State** 是应用当前的状态数据。 6. **Component** 从 **Store** 中选择需要的 **State** 数据,并在视图中展示。 #### 4.4.2 NgRx 核心概念 NgRx 是基于 Redux 模式和 RxJS 构建的 Angular 状态管理库。NgRx 的核心概念包括: * **Store:** 应用状态的容器,基于 RxJS BehaviorSubject 实现。 * **Actions:** 描述 "发生了什么" 的事件对象。 * **Reducers:** 纯函数,接收当前状态和 Action,返回新的状态。 * **Selectors:** 纯函数,用于从 Store 中选择需要的状态数据。 * **Effects:** 处理副作用 (例如 HTTP 请求、异步操作) 的地方。

发布者: 作者: 转发
评论区 (0)
U