首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用NgRX实体标准化Api响应

基础概念

NgRX 是一个用于 Angular 应用的状态管理库,它基于 Redux 模式。NgRX 实体(Entities)是一种优化 Redux 状态管理的方式,特别适用于处理大量相似的对象,如列表数据。

实体标准化是将 API 响应转换为一种标准化的格式,以便更容易地在应用中管理和查询这些数据。标准化的格式通常包括两个部分:

  1. ids: 一个包含所有实体 ID 的数组。
  2. entities: 一个对象,键是实体 ID,值是实体的详细信息。

优势

  1. 性能优化:通过标准化数据,可以减少不必要的渲染,因为只有变化的部分会被更新。
  2. 简化查询:可以直接通过 ID 快速访问任何实体,而不需要遍历整个列表。
  3. 更好的可维护性:状态结构更清晰,易于理解和调试。

类型

NgRX 实体库提供了几种主要的操作类型:

  • loadSuccess: 成功加载实体数据。
  • addSuccess: 成功添加新实体。
  • updateSuccess: 成功更新现有实体。
  • deleteSuccess: 成功删除实体。

应用场景

  • 列表管理:适用于需要展示和管理大量相似对象的场景,如用户列表、产品列表等。
  • 复杂状态管理:当应用的状态结构较为复杂时,使用实体可以帮助更好地组织和管理状态。

示例代码

假设我们有一个 API 响应如下:

代码语言:txt
复制
{
  "users": [
    { "id": 1, "name": "Alice", "email": "alice@example.com" },
    { "id": 2, "name": "Bob", "email": "bob@example.com" }
  ]
}

我们可以使用 NgRX 实体来标准化这个响应:

定义实体

首先,定义一个实体适配器:

代码语言:txt
复制
import { createEntityAdapter, EntityAdapter, EntityState } from '@ngrx/entity';

export interface User {
  id: number;
  name: string;
  email: string;
}

export interface UsersState extends EntityState<User> {}

export const usersAdapter: EntityAdapter<User> = createEntityAdapter<User>();

创建 Reducer

然后,创建一个 reducer 来处理 API 响应:

代码语言:txt
复制
import { createReducer, on } from '@ngrx/store';
import { usersAdapter } from './users.adapter';
import { loadUsersSuccess } from './users.actions';

export const initialState: UsersState = usersAdapter.getInitialState();

const usersReducer = createReducer(
  initialState,
  on(loadUsersSuccess, (state, { users }) => usersAdapter.setAll(users, state))
);

export function reducer(state: UsersState | undefined, action: Action) {
  return usersReducer(state, action);
}

处理 Actions

定义相应的 actions:

代码语言:txt
复制
import { createAction, props } from '@ngrx/store';

export const loadUsersSuccess = createAction(
  '[User] Load Users Success',
  props<{ users: User[] }>()
);

在组件中使用

最后,在组件中使用这些状态:

代码语言:txt
复制
import { Component, OnInit } from '@angular/core';
import { Store } from '@ngrx/store';
import { Observable } from 'rxjs';
import { selectAllUsers } from './users.selectors';

@Component({
  selector: 'app-user-list',
  template: `
    <ul>
      <li *ngFor="let user of users$ | async">{{ user.name }} - {{ user.email }}</li>
    </ul>
  `
})
export class UserListComponent implements OnInit {
  users$: Observable<User[]>;

  constructor(private store: Store) {}

  ngOnInit() {
    this.users$ = this.store.select(selectAllUsers);
  }
}

常见问题及解决方法

问题:为什么标准化后的数据在某些情况下没有更新?

原因:可能是由于选择器(Selectors)没有正确地检测到状态的变化。

解决方法:确保使用 createSelector 来创建记忆化的选择器,并且在 reducer 中正确地更新状态。

代码语言:txt
复制
import { createSelector } from '@ngrx/store';
import { UsersState } from './users.reducer';

export const selectUsersState = (state: any) => state.users;

export const selectAllUsers = createSelector(
  selectUsersState,
  (state: UsersState) => state.ids.map(id => state.entities[id])
);

通过这种方式,可以确保只有当相关实体发生变化时,选择器才会返回新的值。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

ASP.NET Core使用Elasticsearch记录API请求响应日志实战演练

如何在 ASP.NET Core 使用 Elasticsearch 和 Kibana 来存储和展示我们应用程序的请求详细日志。 ElasticSearch 和 Kibana 改变了这一切。...如果对本次分享课程《ASP.NET Core使用Elasticsearch记录请求响应日志实战演练》感兴趣的话,那么请跟着阿笨一起学习吧。...三、使用 Docker 快速安装 Elasticsearch 和 Kibana • 为什么我需要 ElasticSearch 和 Kibana ? 如果您曾经构建过应用程序,那么你一定记录过日志。...如果您还没有使用 ElasticSearch 进行日志记录,我强烈建议您开始使用它。 ? ? ? 四、ASP.NET Core WebApi 如何友好的检索和实时展示日志?...可以将 ElasticSearch 视为数据库,将 Kibana 视为 Web 用户界面,您可以使用它在 ElasticSearch 中构建图表和查询数据

1.7K20
  • 脱离vue项目竟然也可以使用响应式API

    平时大家都是在vue-cli或者vite创建的vue项目里面使用的这些响应式API,今天欧阳给大家带来一些不一样的。脱离vue项目,在node.js项目中使用vue的响应式API。...前面的那个例子是一个node.js项目,项目中我们并没有像vue项目那样去创建一个vue组件,然后在组件里面去使用响应式API。...如下图: 得益于模块化的设计,响应式相关的API和vue组件并没有强关联的关系,所以我们可以在node.js应用中去直接使用响应式API。...这里使用到了三个响应式API,分别是:ref、watch和watchEffect。...搞清楚响应式原理后,我们发现响应式完全不依赖vue组件,所以我们可以在node.js项目中使用vue的响应式API,这也是vue的设计奇妙之处。

    17510

    数字防线:使用台风信息API来加强气象监测和应急响应

    台风信息API:数字时代的防线随着数字技术的进步,我们现在可以访问实时的、准确的台风信息,这是加强气象监测和应急响应的关键。...1.即时台风追踪使用台风信息API,我们可以获取有关当前台风位置、强度、预计路径和风暴半径的即时信息。这使得气象学家能够更准确地预测风暴的走向和强度,有助于发出更及时的警报。...:台风应急响应平台为了更好地理解台风信息API的实际应用,让我们考虑一个使用案例:台风应急响应平台。...实时监测:平台使用台风信息API获取最新的台风数据,并将其可视化在地图上,以便监测台风路径和预计影响区域。...资源协调:应急响应团队可以使用平台来协调救援和恢复工作,确保资源被有效地分配到最需要的地方。

    26970

    9 个超实用的 JavaScript 原生插件工具

    Rollup是一个模块打包器,它使用标准化的 ES 模块格式进行代码,而不是以前的解决方案,例如CommonJS & AMD。...由于支持tree shaking,它是一个很棒的模块打包器,虽然不像Parcel或Webpack那样出名,但它仍然随着响应式更新而增长。...在JavaScript 中,你最有可能使用日期和时间库构建应用程序,而days.js是Moment.js的绝佳替代品。因为它更轻巧并且具有所有相同的 API。...如果你正在使用 Angular 应用程序,建议使用 Akita,因为与ngrx和ngxs相比,它更容易。...这个库使代码在处理 cookie 时更加清晰和可用,你可以使用一个简单的 API 来管理 cookie,其中包括开发人员需要的一切。

    1.2K20

    一个Angular 5教程:一步一步指导实现你的第一个Angular 5应用程序

    使用后端 由于我们没有在这里构建服务器端,因此我们将使用Firebase作为我们的API。如果您确实拥有自己的API后端,那么让我们在开发服务器中配置我们的后端。...我们如何使用Angular的API?Angular给了我们HttpClient。...我们可以使用诸如ngrx-store-localstorage之类的东西来存储我们的数据到浏览器的localStore,但是如何使用API​​呢?...Angular的主要优势在于获得一个完全集成的Web框架,该框架为构建组件,路由和使用远程API提供了自己的框内解决方案。 使用Angular有什么好处?...使用Angular的主要优点是获得一个完全集成的Web框架,该框架提供了自己的内置解决方案,用于构建组件,路由和使用远程API。 Angular模块如何工作? 模块将声明的范围分开。

    42.7K10

    2019 前端框架对比及评测

    标准化 项目遵循特定规则。提供后端 API、静态标记语言、风格、API 规范。 专业人士编写、审阅 理想情况下,会是高一致性、高真实度的项目,由使用该技术的专业人士编写或审阅。...所有应用使用同样的 CSS 样式文件,CSS 文件加载自 CDN。所有应用使用的 HTML 也是一样的。...尺寸 传输尺寸根据 Chrome 开发者工具的网络标签页统计,包括服务器送达的响应头和响应体(经过 GZIP 压缩)。 这取决于框架的尺寸以及额外依赖的尺寸,还有构建工具精简未使用代码的效率。...Angular+ngrx 只计算了 libs 目录中的 .ts 和 .html 文件,如果你认为这么算不对,请告诉我正确的数字及其计算方法。...结论 就代码行数而言,使用 ClojureScript 的 re-frame 给出了炸裂的结果。Clojure 以异常高的表达力而闻名。

    1.3K00

    写在 2021: 值得关注学习的前端框架和工具库

    XState[4],不止适用于React,可以和Vue/Svelte/Ember这样的框架一起,也可以和RxJS这样的响应式库一起用。...很新颖的使用方式(我是真的第一次见),TS支持非常好,Schema定义的方式也比传统ORM各个实体定义分开的方式清晰很多,有兴趣的可以瞅瞅我写的这个demo:Prisma-Article-Example...还提供了中间件(注意和服务端框架的中间件区分)、鉴权(推荐GraphQL API的鉴权只使用它提供的)、扩展、指令、联合类型等。作者也很厉害,提供了和NestJS以及Prisma各自的集成包。...秉承了Angular的思想,提供了一整套的集成:和Angular Router的集成:@ngrx/router-store;对于集合类型的适配:@ngrx/entity;副作用管理:@ngrx/effects...LowDB[100],demo中常用的JSON数据库,亮点在使用Lodash的API来操作数据库。

    4.2K10

    Supergraph:API编排和组合的解决方案

    这种能力的基础是,来自任何来源(数据库、API 等)的每条数据和业务逻辑代码中的类型都在 SUPERGRAPH 的语义层上标准化。...API 组合 API 组合可以被认为是 API 集成和编排的特殊情况(或演变),它指的是将多个 API 响应组合成单个统一响应的技术,该响应包含来自不同调用的分层信息。...获取这些信息涉及按顺序向三个不同的域发出请求,在每一步使用上一步的响应,最后将整个结果集组合成一个单一的层次化响应,该响应表示三个实体(订单、餐厅和支付)之间的关系。...API 组合面临的挑战以及如何解决 Supergraph(QL) 架构主张了解底层来源或域,并在异构来源集中进行标准化。...1.3 标准化 supergraph 平台是否提供或强制执行标准化的域 API 设计(分页、过滤、排序等)? 2.

    18310

    写在2021: 值得关注学习的前端框架和工具库

    XState,不止适用于React,可以和Vue/Svelte/Ember这样的框架一起,也可以和RxJS这样的响应式库一起用。...很新颖的使用方式(我是真的第一次见),TS支持非常好,Schema定义的方式也比传统ORM各个实体定义分开的方式清晰很多,有兴趣的可以瞅瞅我写的这个demo:Prisma-Article-Example...还提供了中间件(注意和服务端框架的中间件区分)、鉴权(推荐GraphQL API的鉴权只使用它提供的)、扩展、指令、联合类型等。作者也很厉害,提供了和NestJS以及Prisma各自的集成包。...秉承了Angular的思想,提供了一整套的集成:和Angular Router的集成:@ngrx/router-store;对于集合类型的适配:@ngrx/entity;副作用管理:@ngrx/effects...LowDB,demo中常用的JSON数据库,亮点在使用Lodash的API来操作数据库。

    2.9K10

    在同一基准下对前端框架进行比较

    标准化 一个符合某些规则的项目。提供后端API、静态标记、样式和规范。 由专家撰写或审核 一个一致的、真正的项目,在理想情况下,由相关技术的专家建立或审查。 我们比较哪些库和框架?...GZIPped 响应头加上服务器提供的响应主体。这取决于框架的大小和你添加的额外依赖项,以及构建工具如何消除捆绑包中未使用的代码。 简述 文件越小,下载越快,解析越少。 ?...注意 Angular + ngrx:在 /libs 文件夹内完成的代码行数计算,仅包括*.ts 和 *.html 文件。如果你觉得这是错的,请告诉我正确的值是多少,以及你是如何计算的。...结论 使用 ClojureScript 的 re-frame 为你提供了最佳效果。Clojure 以其异常丰富的表现力而著称。...答:关注使用 ClojureScript 的 re-frame、AppRun 和 Svelte 。 ---- 问:想学习新东西吗? 答:选择一个你不知道的库或框架!

    96020

    同样做前端,为何差距越来越大?

    庆幸的是除了 React 社区,Vue 社区有类似的 Vuex,Angular 社区有 NgRx 也提供了几乎同样的能力,甚至 NgRx 还可以无缝使用 redux-devtools 来调试状态变化。...代码和工具全面拥抱 TS 后,实现了从后端 API 接口到 View 组件的全链路静态分析,具有了完善的代码提示和校验能力。 ?...对接的后端 API 使用 Java Swagger,Swagger 能提供所有 API 的元信息,包括请求和响应的类型格式。...Pont 解析 API 元信息生成 TS 的取数函数,这些取数函数类型完美,并挂载到 API 模块下。最终代码中取数效果是这样的: ?...另外 iron-redux 能接收到 Pont 接口响应数据格式,并推导出整个 Redux 状态树的静态类型定义,Store 中的数据完美的类型提示。效果如下: ?

    1.2K20

    【译】我是如何学习任意前端框架的

    现在,所有框架都提供API来管理你的状态(例如Angular有一个Service,React现在有Context API)以及当你的数据规模变大之后,你可以考虑使用像redux这样的库。...1.查找 & 显示 (模仿) 常用的首个应用是使用其公共的API来模仿任何已知站点,尝试构建一个带下拉列表的搜索栏,来保存来自端点API的结果,检查其返回的数据,然后再显示它,就像有张图像一样(显示)或不显示...端点API示例: Github API OMDb API Spotify Web API wunderground API reddit API 你将学到: 使用HTTP客户端向端点API发起请求 使用键盘事件监听器...但在本节中,我们尝试使用web sockets来构建聊天应用程序,它是双向的,我们不能(总是)等待响应来更新视图,我们需要另一种方法来管理我们的客户端状态。...你将学到: 学习如何使用管理状态解决方案,如redux for react, ngrx for angular 2+ 或 vuex for vuejs以及如何将其与客户端应用程序集成 使你的应用更灵活

    3.6K10

    给2019前端开发的你5个进阶建议~

    庆幸的是除了 React 社区,Vue 社区有类似的 Vuex,Angular 社区有 NgRx 也提供了几乎同样的能力,甚至 NgRx 还可以无缝使用 redux-devtools 来调试状态变化。...代码和工具全面拥抱 TS 后,实现了从后端 API 接口到 View 组件的全链路静态分析,具有了完善的代码提示和校验能力。 ?...对接的后端 API 使用 Java Swagger,Swagger 能提供所有 API 的元信息,包括请求和响应的类型格式。...Pont 解析 API 元信息生成 TS 的取数函数,这些取数函数类型完美,并挂载到 API 模块下。最终代码中取数效果是这样的: ?...再也不需要前后端接口约定文档,使用代码保证前端取数和后端接口定义完全一致 另外 iron-redux 能接收到 Pont 接口响应数据格式,并推导出整个 Redux 状态树的静态类型定义,Store

    1K10

    Angular 2 + 折腾记 :(3)初步了解服务及使用

    前言 不探究高深理论,只探究实际使用,有更好的写法或者经验请指出; 有些暂时没涉及到的知识我可能会顺着例子解释; ---- 什么是服务 简言之:就是资源获取,以及通讯逻辑处理的地方; Angular2...angular/common'; // 路由模块 -- 内置 import { RouterModule } from '@angular/router'; // 表单模块,及响应式表单模块...VehicleFaultService}] // 这是一种别名的写法 }) export class VehicleFaultModule { }复制代码 // 引入一些生命周期的控制,组件值传递响应接口等...fadeIn], providers: [vehicleFaultService, EventsService] })复制代码 ---- 总结 服务若是结合@Inpu(),@Output()..感觉不需要ngrx...还是多查阅官方的API,然后动手实践,才能让你上手快起来。。。

    1.6K20

    数据服务基础能力之元数据管理

    服务API生成:在数据服务中,直接通过配置,生成API服务能力,并控制参数的响应结构,这种情况通常会以实时查询的方式处理。...这里是简述相对单一的应用服务,如果把这里的流程分段放大,在整个数据服务体系下,就是围绕元数据管理的复杂的基础系统:围绕数据结构映射,进行元数据标准化管理,在此基础上二次组织数据,快速响应业务需求。...围绕核心业务:通常在项目初期的时候,只围绕一些核心业务主体,使其在使用的时候灵活高效,后续在持续扩展其他能力。...;补充说一句,在数据平台中,都会存在类型服务系统,以提供相应的识别能力和规范不同场景下的转换; 实体与关系:数据业务中两个核心概念,实体必然由属性构成这是常说的,实体之间维护的关系:关联、、绑定、输出、...输入等,是构建血缘关系和数据链路的核心标识; 数据抽取:基于对元数据的组织和实体的定义,生成数据抽取规则,进而完成数据的快速获取,后续就是对接具体的业务,例如数据存储方式,搬运方式,最终落地业务线使用;

    83420

    服务设计原则

    标准化服务合约 1.1 服务合约 建立了与服务交互有关的术语 提供了技术限制和需求,及服务的拥有者希望对外公布的所有语义信息 image.png 1.2 标准化服务合约 使用形式化或者标准化的合约 服务功能描述的标准化...服务数据表示的标准化 提倡尽量保持不同服务之间、在数据总体模型和特定数据类型之间的一致性 非标准化的服务数据表示将导致频繁的数据转换 Schema 被单独设计和实现,与使用它的服务操作分离 采用“Schema...RPC 技术以支持面向服务 Web Service 平台以及它的非专用通信框架 操作性系统层的技术性变化导致服务合约变化 开发工具缺陷 使用开发工具自动生成合约可能产生非标准化的服务合约 2....耦合与服务模型:实体服务、应用服务、任务服务、编排服务 实体服务 解耦的服务合约 与业务实体本身高度耦合 应用服务 往往是高度耦合的(实现耦合) 通过标准化服务合约,避免“消费者-实现”的间接耦合 任务服务...:描述服务的行为、限制和交互需求 服务质量数据被用来描述一个服务的行为性的、基于规则的、和可靠性等相关的元信息 比如: 确保服务及时响应的并发访问阈值 可用性限制 决定服务对不同类型输入数据的处理和响应的业务规则

    71810

    都9102年了,还需要用到 jQuery 吗?

    随着现代库和框架的出现,浏览器 API 的标准化以及需要 jQuery 技能的职位减少,开发人员仍然需要继续学习 jQuery 吗。...它通过易于使用的API在大量浏览器中运行,使得 HTML 文档遍历和操作、事件处理、动画和 Ajax 变得更加简单。...替换,该 API 允许你发出异步请求。...DOM 直接更新 DOM 使用与真实 DOM 连接的虚拟 DOM 数据绑定 带插件的数据绑定方法实现双向数据流 单向数据流 用 ngModel 可以实现双向数据绑定 响应式数据绑定系统可以使用 V-model...实现双向数据 状态管理 可以使用专门的库来实现 Context API,Redux 第三方库,如NGRX,NGXS等 Vuex 模板 JavaScript JavaScript(JSX) TypeScript

    2.2K40
    领券