发布于 2026-01-06 3 阅读
0

NgRx v14 正式发布:新增动作组、ComponentStore 生命周期钩子、ESLint 包、全新 NgRx 组件等功能!

NgRx v14 正式发布:新增动作组、ComponentStore 生命周期钩子、ESLint 包、全新 NgRx 组件等功能!

我们很高兴地宣布 NgRx 框架的最新主要版本发布,其中包含一些令人兴奋的新功能、错误修复和其他更新。


新增创建操作组功能🧙

如果您熟悉 NgRx Store,就会知道操作 (action) 是使用它的应用程序的重要组成部分。有人甚至说操作是 NgRx 的灵魂 😉,不过这又是另一个故事了。在 NgRx 13.2 中,我们引入了一项新功能,该功能最初由Mike RyancreateActionGroup构思,并由Marko Stanimirović实现,旨在让创建操作变得更加轻松。

下面的视频简要概述了如何使用 Good Action Hygiene™ 单独编写操作,并介绍了createActionGroup可最大限度减少要编写的代码量和导出操作组的新功能。

createActionGroup函数利用了 TypeScript 中引入的更高级的功能,因此,如果您对高级 TypeScript 感兴趣,一定要查看源代码,以发现一些新技巧。


组件商店生命周期钩子🎣

NgRx ComponentStore库因其能够更一致、更可预测地在 Angular 应用中响应式管理状态的特性而日益流行。使用 ComponentStore 可以将组件中的业务逻辑抽象出来,从而在更新状态、执行副作用以及提供可观察的状态变化流时,实现自动化。

在某些情况下,您需要在创建 ComponentStore 或首次初始化 ComponentStore 状态时执行某些任务。以前,要实现这一点,您需要在 ComponentStore 上公开一个方法,并从组件的生命周期方法中调用它。为了简化此过程,我们为 ComponentStore 引入了两个接口和生命周期钩子OnStoreInitOnStateInit

OnStoreInit

OnStoreInit接口用于实现ngrxOnStoreInitComponentStore 类中的方法。此生命周期方法在 ComponentStore 类实例化后立即调用。

export interface BooksState {
  collection: Book[];
}

export const initialState: BooksState = {
  collection: []
};

@Injectable()
export class BooksStore extends ComponentStore<BooksState> implements OnStoreInit {

  constructor() {
    super(initialState);
  }

  ngrxOnStoreInit() {
    // called after store has been instantiated
  }
}
Enter fullscreen mode Exit fullscreen mode

并使用该provideComponentStore()函数将 ComponentStore 注册到providers数组中。

@Component({
  // ... other metadata
  providers: [
    provideComponentStore(BooksStore)
  ]
})
export class BooksPageComponent {
  constructor(private booksStore: BooksStore) {}
}
Enter fullscreen mode Exit fullscreen mode

OnStateInit

OnStateInit接口用于实现ComponentStore 类中的方法。此生命周期方法仅在 ComponentStore 状态初始设置后ngrxOnStateInit调用一次。ComponentStore 支持状态的即时初始化和延迟初始化,并且在两种情况下都会相应地调用生命周期钩子。

渴望状态初始化

export interface BooksState {
  collection: Book[];
}

export const initialState: BooksState = {
  collection: []
};

@Injectable()
export class BooksStore extends ComponentStore<BooksState> implements OnStateInit {
  constructor() {
    // eager state initialization
    super(initialState);
  }

  ngrxOnStateInit() {
    // called once after state has been first initialized
  }
}
Enter fullscreen mode Exit fullscreen mode
@Component({
  // ... other metadata
  providers: [
    provideComponentStore(BooksStore)
  ]
})
export class BooksPageComponent {
  constructor(private booksStore: BooksStore) {}
}

### Lazy State Init


export interface BooksState {
  collection: Book[];
}

@Injectable()
export class BooksStore extends ComponentStore<BooksState> implements OnStateInit {
  constructor() {
    super();
  }

  ngrxOnStateInit() {
    // called once after state has been first initialized
  }
}

export const initialState: BooksState = {
  collection: []
};
Enter fullscreen mode Exit fullscreen mode
@Component({
  // ... other metadata
  providers: [
    provideComponentStore(BooksStore)
  ]
})
export class BooksPageComponent implements OnInit {
  constructor(private booksStore: BooksStore) {}

  ngOnInit() {
    // lazy state initialization
    this.booksStore.setState(initialState);
  }
}
Enter fullscreen mode Exit fullscreen mode

如果在 ComponentStore 中实现生命周期钩子,并且在开发模式下providers未使用进行注册provideComponentStore(),则会在浏览器控制台中记录一条警告。


原生 ESLint 包📦

NgRx 团队一直在寻找更好的方法来鼓励开发者在使用 NgRx 库时遵循最佳实践。团队成员Tim Deschryver创建了这个ngrx-eslint-plugin软件包,为使用 NgRx 构建的应用程序提供 ESLint 最佳实践规则。在之前的 NgRx 版本中,我们引入了将该ngrx-eslint-plugin软件包添加到您的项目中package.json,并将 lint 规则添加到 ESLint 配置中的功能。

ng add @ngrx/store
Enter fullscreen mode Exit fullscreen mode

为了提供更完善的集成体验,我们已将该ngrx-eslint-plugin软件包移至主ngrx/platform代码库,并新增了一个@ngrx/eslint-pluginESLint 规则软件包。该软件包已稳定运行一段时间,现在对于使用 NgRx 库的开发者来说将更加容易找到,因为它已有完善的文档页面和持续的支持。


NgRx 组件包已全面更新 ✍

NgRx Component 包一直以来都怀揣着一个雄心勃勃的目标:为 Angular 模板带来更强的响应式,并支持完全无区域划分的 Angular 应用。该包最初由Michael Hladky编写,最终发展成为一个@rx-angular/template成熟的库,@ngrx/component即使它仍处于实验阶段,也广受好评。

NgRx Component 提供了两个主要特性:ngrxPush管道和ngrxLet指令,使在 Angular 组件模板中使用可观察对象更加便捷。在 14 版本中,团队成员Marko Stanimirović从头开始​​完全重写了组件包,旨在提供更一致的方式来处理可观察对象和静态数据,提升 Angular 无区域应用程序的性能等等。

NgRx 组件还引入了两个新模块:LetModulePushModule

要使用新模块,请导入并将其添加LetModulePushModule独立imports组件或 NgModule 的数组中。

import { Component } from '@angular/core';
import { LetModule, PushModule } from '@ngrx/component';

@Component({
  // ... other metadata
  standalone: true,
  imports: [
    // ... other imports
    LetModule,
    PushModule
  ],
})
export class MyStandaloneComponent {}
Enter fullscreen mode Exit fullscreen mode

这些新的 NgModules 允许对ngrxPush管道和ngrxLet指令进行更精细的控制,并为引入这些管道和指令的独立版本铺平了道路,以便更好地利用 Angular v14 中引入的全新独立功能。阅读这篇文章,了解更多关于 v14 中 NgRx 组件更新的信息。


Angular 中 NgRx 的未来🌞

Angular v14 为组件、管道和指令引入了一些令人兴奋的新特性,包括新的“环境注入器”以及inject()无需直接使用构造函数即可使用依赖注入的更新函数。组件、管道和指令的独立特性使得您可以构建 Angular 应用程序,而 NgModules 则基本成为可选组件。

由于大多数 NgRx 库主要由提供程序组成,并不提供 UI 组件,因此我们可以利用这些新的独立 API,在不使用 NgModules 的情况下,在 Angular 应用中注册 NgRx 提供程序。请查看Marko 的最新博文,了解如何在 Angular 中使用 NgRx 的独立功能。该inject()功能已存在一段时间,但现在提供了更强大的功能,可以组合无需构造函数即可注入依赖项的函数,并简化扩展类的组合。

虽然 Angular 的独立功能目前仍处于开发者预览阶段,但我们在最新的 RFC中提出了一些针对 NgRx 的新 API 。如果您想为未来使用 NgRx 构建的 Angular 应用提供一些建议,欢迎查看 RFC 并分享您的想法。


周边商店和Discord服务器!👕

您可以在我们的商店购买官方 NgRx 周边产品!印有 NgRx 标志的 T 恤有多种尺码、材质和颜色可供选择。未来我们还会陆续上架贴纸、磁贴等更多新品。立即访问我们的商店,选购您的 NgRx 周边产品吧!

加入我们的Discord 服务器,即可与 NgRx 社区的新老成员进行交流。


弃用和重大变更💥

此版本包含错误修复、弃用项和重大变更。对于大多数弃用项或重大变更,我们提供了一个迁移脚本,当您将应用程序升级到最新版本时,该脚本会自动运行。

请参阅版本 14 迁移指南,了解有关迁移到最新版本的完整信息。完整的更新日志可在我们的 GitHub 代码库中找到。


升级到 NgRx 14 🗓️

要开始使用 NgRx 14,请确保已安装以下最低版本:

  • Angular 版本 14.x
  • Angular CLI 版本 14.x
  • TypeScript 版本 4.7.x
  • RxJS 版本 ^6.4.x 或 RxJS 版本 ^7.5.x

NgRx 支持使用 Angular CLI 的 `ng update` 命令来更新 NgRx 包。要将包更新到最新版本,请运行以下命令:

ng update @ngrx/store
Enter fullscreen mode Exit fullscreen mode

为 NgRx 做贡献 🥰

我们一直在努力改进文档,并使其保持最新状态,以方便 NgRx 框架的用户使用。为了帮助我们,您可以开始为 NgRx 做贡献。如果您不确定从哪里开始,请查看我们的贡献指南,并观看 Jan-Niklas Wortmann 和 Brandon Roberts 制作的入门视频。

感谢所有贡献者和赞助商。

NgRx 一直是一个社区驱动的项目。设计、开发、文档编写和测试都离不开社区的帮助。我们最近在 NgRx 团队页面新增了一个社区板块,列出了所有为该平台做出贡献的人员。

如果您有兴趣贡献代码,请访问我们的 GitHub 页面,查看我们待解决的问题,其中一些问题专门针对新贡献者。我们还在 GitHub 上设有活跃的讨论区,用于讨论新功能和改进建议。


赞助 NgRx 💲

我们正在寻找下一位黄金赞助商,因此,如果贵公司希望赞助 NgRx 的持续开发,请访问我们的OpenCollective页面了解不同的赞助选项,或直接联系我们讨论其他赞助机会。

我们要衷心感谢我们的银牌赞助商 Narhwal Technologies!Nrwl 长期以来一直推广 NgRx 作为构建大型 Angular 应用程序的工具,并致力于支持他们所依赖的 NgRx 开源项目。

请在Twitter上关注我们,获取有关NgRx平台的最新动态。

文章来源:https://dev.to/ngrx/announcing-ngrx-v14-action-groups-componentstore-lifecycle-hooks-eslint-package-revamped-ngrx-component-and-more-18ck