11 月 19 - 20 日 Apache Pulsar 社区年度盛会来啦,立即报名! 了解详情
写点什么

NgRx 10 引入组件本地状态管理包

  • 2020-10-24
  • 本文字数:2125 字

    阅读完需:约 7 分钟

NgRx 10引入组件本地状态管理包

NgRx,一个基于 RxJS 的 Angular 反应式扩展平台,发布了它的第 10 个主要迭代版本,包含了一个用于本地状态管理的新组件存储包。新包对用于应用程序状态管理的 NgRx 存储进行了扩展。此外,一个新的实验性 NgRx 组件包为开发人员开发 Angular 无分区应用程序提供支持,它利用了 Angular Ivy 的能力,以此来获得更好的性能。


Brandon Roberts 在 NgRx 的发布说明中解释了新的本地组件存储所带来的价值:


NgRx Store 用于在全局应用程序级别管理来自多个不同来源的复杂状态。在某些情况下,用户希望以统一的方式在本地管理状态,不需要间接的操作、reducer 和 effects。我们设计了一个新的包来处理本地级别的状态,同时提供与 NgRx Store 类似的好处。


NgRx 应用程序的架构围绕着四个关键概念,这些概念让人联想到 Redux 或 Elm 的架构。动作会捕获事件,无论事件是来自用户或来自其他接口系统(例如套接字或 REST 服务器):


import { createAction, props } from '@ngrx/store';export const login = createAction(  '[Login Page] Login',  props<{ username: string; password: string }>()); 
复制代码


事件处理器通常分派用户触发的动作(即上述代码示例中的 login):


onSubmit(username: string, password: string) {  store.dispatch(login({ username: username, password: password }));}
复制代码


应用程序级别的 NgRx Store 通过更新其内容(即应用程序级别的状态)或调度 NgRx effects 来处理分派的操作。这种行为与反应式系统的基本方程是一致的。


顶层状态容器可以帮助开发人员创建可维护的显式应用程序,所有的状态更新都可以追溯到触发事件。这实际上是 Redux 的 promise。


然而,在很多情况下,特别是在具有大量小组件且作用域很小的应用程序中,开发人员使用的组件是读取和更新特定状态的唯一组件。这些状态通常与特定组件的生命周期相关联,并且在组件被销毁时失效。因此,新的 NgRx 组件存储允许开发人员创建在本地处理这些状态片段的组件——本地状态。


发布说明里写道:


ComponentStore 是一个独立的用于管理本地/组件状态的库,是响应式推送的替代方法。


组件存储可以在定义存储时直接初始化:


export interface MoviesState {  movies: Movie[];}@Injectable()export class MoviesStore extends ComponentStore<MoviesState> {  constructor() {    super({movies: []});  }}
复制代码


组件存储也可以在创建组件时使用 setState 方法来初始化:


@Component({  template: `    <li *ngFor="let movie of (movies$ | async)">      {{ movie.name }}    </li>  `,  providers: [ComponentStore],})export class MoviesPageComponent {  readonly movies$ = this.componentStore.state$.pipe(    map(state => state.movies),  );  constructor(    private readonly componentStore: ComponentStore<{movies: Movie[]}>  ) {}  ngOnInit() {    this.componentStore.setState({movies: []});  }}
复制代码


组件存储提供了 select 和 updater 方法来读取本地状态,类似于功能透镜。setState 方法用来更新和替换整个本地状态。最后,effect 方法可以在可观察的管道内运行 effects:


@Injectable()export class MoviesStore extends ComponentStore<MoviesState> {  constructor(private readonly moviesService: MoviesService) {    super({movies: []});  }  // 每次调用getMovie(id)都会将当前ID推送到movieId$流中。  readonly getMovie = this.effect((movieId$: Observable<string>) => {    return movieId$.pipe(      // 处理竞态条件。      switchMap((id) => this.moviesService.fetchMovie(id).pipe(        // 在内部管道处理结果。        tap({          next: (movie) => this.addMovie(movie),          error: (e) => this.logError(e),        }),        // 在内部管道处理潜在的错误。        catchError(() => EMPTY),      ))    );  })  readonly addMovie = this.updater((state, movie: Movie) => ({    movies: [...state.movies, movie],  }));  selectMovie(movieId: string) {    return this.select((state) => state.movies.find(m => m.id === movieId));  }}
复制代码


可以通过 npm 来安装新的组件存储:


npm install @ngrx/component-store --save
复制代码


或者使用 Angular CLI 来安装:


ng add @ngrx/component-store@latest
复制代码


NgRx 10 还提供了一个实验性的 NgRx 组件包。发布说明里写道:


随着 Ivy 的不断发展,我们需要重新思考如何处理 Angular 无分区应用程序中的反应式。async 管道为 Angular 应用程序处理模板中的可观察对象和 promise 设置了一个标准。NgRx 组件进一步帮你构建完全反应式的应用程序,帮你使用模板中的可观察对象进行渲染。NgRx 组件让我们看到了构建反应式 Angular 应用程序的新方法。


实验包提供了两个指令 ngrxLet 和 ngrxPush,文档中分别对它们进行了解释。


Angular 无分区应用程序在处理变化检测时无需依赖 Angular 无分区机制,这样可能会提高运行时性能。Angular Ivy 和提前编译为此提供了新的可能性。


NgRx 采用了 MIT 许可。欢迎开发者参与贡献,并请遵循贡献指南。


原文链接


Reactive Angular Library NgRx v10 Adds Component Local State Management Package


2020-10-24 10:001455

评论

发布
暂无评论
发现更多内容

【深入理解TcaplusDB技术】TcaplusDB运维

TcaplusDB

数据库 nosql TcaplusDB 腾讯游戏

Vue-9-计算属性的属性

Python研究所

6月月更

青藤“基于工业互联网的安全方案”成功入选信通院守卫者计划

青藤云安全

主机安全 互联网安全

【深入理解TcaplusDB技术】TcaplusDB新增机型

TcaplusDB

数据库 nosql TcaplusDB 腾讯游戏

【深入理解TcaplusDB技术】TcaplusDB运维单据

TcaplusDB

数据库 nosql TcaplusDB 腾讯游戏

【深入理解TcaplusDB技术】TcaplusDB常规单据

TcaplusDB

数据库 nosql TcaplusDB 腾讯游戏

【深入理解TcaplusDB技术】单据受理之创建业务指南

TcaplusDB

数据库 nosql TcaplusDB 腾讯游戏

【深入理解TcaplusDB技术】单据受理之建表审批

TcaplusDB

数据库 nosql TcaplusDB 腾讯游戏

【深入理解TcaplusDB技术】单据受理之创建游戏区

TcaplusDB

数据库 nosql TcaplusDB 腾讯游戏

【深入理解TcaplusDB技术】TcaplusDB运维——日常巡检

TcaplusDB

数据库 nosql TcaplusDB 腾讯游戏

小程序容器技术,加速工业互联网平台建设

Geek_99967b

小程序 工业互联网 小程序容器

【深入理解TcaplusDB技术】集群管理操作

TcaplusDB

数据库 nosql TcaplusDB 腾讯游戏

2022,云上开发新纪元

Heighliner

云原生 #k8s 开发者, 远程开发

【深入理解TcaplusDB技术】创建游戏区

TcaplusDB

数据库 nosql TcaplusDB 腾讯游戏

从概念到安全实践:软件供应链基础指南

SEAL软件供应链安全

DevOps 安全 DevSecOps 软件供应链

改变世界的开发者丨以梦为码,华工小哥的致青春

华为云开发者联盟

数据库 华为云

详解MOVE PROTOCOL的测试版,让健康运动如影随形

鳄鱼视界

【深入理解TcaplusDB技术】TcaplusDB机型管理

TcaplusDB

数据库 nosql TcaplusDB 腾讯游戏

【深入理解TcaplusDB技术】TcaplusDB机型

TcaplusDB

数据库 nosql TcaplusDB 腾讯游戏

手慢无!‘’阿里爸爸‘’6月最新开源新版Spring Cloud Alibaba全体系10w字全彩笔记

Java全栈架构师

Java 程序员 面试题 架构师 SpringCloud

详解MOVE PROTOCOL的测试版,让健康运动如影随形

威廉META

【深入理解TcaplusDB技术】TcaplusDB机器如何初始化和上架

TcaplusDB

数据库 nosql TcaplusDB 腾讯游戏

【深入理解TcaplusDB技术】TcaplusDB机器如何下架

TcaplusDB

数据库 nosql TcaplusDB 腾讯游戏

天人合一物我相融,站点升级渐进式Web应用PWA(Progressive Web Apps)实践

刘悦的技术博客

前端 App 应用 Web JS SDK PWA

直播场景音频降噪,传统算法 VS AI 算法对比和实践

融云 RongCloud

Elux-从"微前端"到“微模块”

hiisea

前端框架 微前端 微模块 elux

传统企业数字化转型,到底难在哪里?

SoFlu软件机器人

详解GPU虚拟化技术

Finovy Cloud

人工智能 云渲染 GPU服务器

先睹为快 | 卓越示范中心ETB003云原生安全实验测试床

青藤云安全

容器安全 信通院 云原生安全

主数据管理平台功能模型介绍

agileai

Java 数据治理 数据模型 主数据平台 功能模型

Charles 工具如何做断点测试

伤心的辣条

Python 程序人生 软件测试 自动化测试 接口测试

NgRx 10引入组件本地状态管理包_语言 & 开发_Bruno Couriol_InfoQ精选文章