Logo
Section 1 / 7

NgRx Effects 简介

学习 NgRx Effects 的基础知识。

导入

NgRx Effects 简介

学习 NgRx Effects 的基础知识。

什么是副作用?

通常情况下,Angular 应用程序中的组件通过服务来执行副作用操作。在我们的课程项目中,ProductsComponent 通过 ProductsService 从服务器获取数据,代码如下:

src/app/products/products.component.ts

1import { Component, OnInit } from '@angular/core'; 2import { ProductsService } from '../products.service'; 3import { Store } from '@ngrx/store'; 4import { getProductsAction } from './state/products.actions'; 5import { getProductsSelector } from './state/products.selectors'; 6import { AppState, Product } from '../app.interfaces'; 7 8@Component({ 9 selector: 'app-products', 10 templateUrl: './products.component.html', 11 styleUrls: ['./products.component.scss'], 12}) 13export class ProductsComponent implements OnInit { 14 products$ = this.store.select<Product[]>(getProductsSelector); 15 16 constructor(private store: Store<AppState>, private productsService: ProductsService) {} 17 18 ngOnInit() { 19 this.getProducts(); 20 } 21 22 getProducts() { 23 this.productsService 24 .getProducts() 25 .subscribe((products: Product[]) => this.store.dispatch(getProductsAction({ products }))); 26 } 27}

在大型应用中,一个组件可能需要处理多个服务,随着时间推移,这种逻辑会变得难以维护。为了解决这个问题,@ngrx/effects 库帮助我们将基于服务的逻辑从组件中分离出来。

Effects 如何工作?

让我们回顾一下 NgRx 状态管理的生命周期,以理解 Effects 的工作原理。NgRx Effects 的运作流程如下:

  • 当组件分发一个动作时,NgRx 将其传递给 reducers。
  • Effects 持续监听特定类型的已分发动作。一旦触发了目标动作,Effects 就执行必要的操作,例如与服务进行交互。
  • 当服务返回响应或错误时,Effects 会分发一个新的动作。
  • 新分发的动作被传递给 reducer。
  • Reducer 随后更新状态。
  • Selectors 订阅状态变化。
  • 最终,组件从 selectors 获取数据并显示更新后的数据。

以下是上述步骤的可视化展示:

使用 NgRx Effects 的优势

  • Effects 将副作用与 Angular 组件分离,使组件只需专注于状态更新。
  • 我们可以通过 Effects 在独立的文件中管理副作用,从而让测试副作用变得更加容易。

设置 @ngrx/effects

要将 @ngrx/effects 库添加到项目中,请参考《配置 NgRx Effects》一课。

NgRx:高级概念

将副作用与组件隔离