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

Angular ngrx:访问存储的相邻切片

基础概念

Angular 是一个用于构建单页客户端应用的开源框架,而 NgRx 是基于 Redux 架构的状态管理库,专为 Angular 应用设计。NgRx 通过一系列操作(actions)、缩减器(reducers)、效果(effects)和选择器(selectors)来管理和维护应用的状态。

相关优势

  1. 可预测性:NgRx 采用 Redux 架构,使得状态变化变得可预测和可追踪。
  2. 单一数据源:整个应用的状态存储在一个单一的存储(store)中,便于管理和调试。
  3. 解耦:通过 actions 和 reducers 的分离,组件与状态管理逻辑解耦,提高了代码的可维护性。
  4. 效果:NgRx Effects 可以处理副作用,如异步操作,使得代码更加清晰。

类型

  • Actions:描述发生了什么。
  • Reducers:处理 actions 并更新状态。
  • Selectors:从状态中提取数据。
  • Effects:处理副作用。

应用场景

NgRx 适用于大型复杂的前端应用,特别是那些需要严格管理状态的应用,如电子商务网站、社交媒体平台等。

访问存储的相邻切片

在 NgRx 中,如果你想访问存储(store)中的相邻切片,你可以使用选择器(selectors)。选择器允许你从 store 中提取特定的数据片段,并且可以组合多个选择器来创建更复杂的数据结构。

示例代码

假设我们有一个存储,其中包含一个用户列表,我们想要访问当前选中用户的相邻用户。

代码语言:txt
复制
// actions.ts
export const SELECT_USER = 'SELECT_USER';
export const UPDATE_USER_LIST = 'UPDATE_USER_LIST';

export const selectUser = (userId: string) => ({
  type: SELECT_USER,
  payload: userId
});

export const updateUserList = (users: User[]) => ({
  type: UPDATE_USER_LIST,
  payload: users
});

// reducers.ts
import { createReducer, on } from '@ngrx/store';
import { SELECT_USER, UPDATE_USER_LIST } from './actions';

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

export interface State {
  users: User[];
  selectedUserId: string | null;
}

export const initialState: State = {
  users: [],
  selectedUserId: null
};

const _userReducer = createReducer(
  initialState,
  on(UPDATE_USER_LIST, (state, { payload }) => ({
    ...state,
    users: payload
  })),
  on(SELECT_USER, (state, { payload }) => ({
    ...state,
    selectedUserId: payload
  }))
);

export function userReducer(state, action) {
  return _userReducer(state, action);
}

// selectors.ts
import { createSelector } from '@ngrx/store';
import { State } from './reducers';
import { User } from './actions';

export const selectUsers = (state: State) => state.users;
export const selectSelectedUserId = (state: State) => state.selectedUserId;

export const selectSelectedUser = createSelector(
  selectUsers,
  selectSelectedUserId,
  (users, selectedUserId) => users.find(user => user.id === selectedUserId)
);

export const selectAdjacentUsers = createSelector(
  selectSelectedUser,
  selectUsers,
  (selectedUser, users) => {
    const index = users.findIndex(user => user.id === selectedUser.id);
    return {
      prevUser: users[index - 1],
      nextUser: users[index + 1]
    };
  }
);

遇到的问题及解决方法

问题:访问相邻切片时出现数组越界错误

原因:当当前选中的用户是列表中的第一个或最后一个时,尝试访问前一个或后一个用户会导致数组越界。

解决方法:在选择器中添加边界检查。

代码语言:txt
复制
export const selectAdjacentUsers = createSelector(
  selectSelectedUser,
  selectUsers,
  (selectedUser, users) => {
    const index = users.findIndex(user => user.id === selectedUser.id);
    const prevUser = index > 0 ? users[index - 1] : null;
    const nextUser = index < users.length - 1 ? users[index + 1] : null;
    return {
      prevUser,
      nextUser
    };
  }
);

参考链接

通过上述方法,你可以有效地访问和管理 NgRx 存储中的相邻切片,并解决可能遇到的问题。

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

相关·内容

Angular 接入 NGRX 状态管理

注:图片来自ngrx.io/guide/store NGRXAngular 实现响应式状态管理应用框架。...NGRX 状态管理生命周期图中包含了以下元素: Store:集中状态存储; Action:根据用户所触不同事件执行不同 Action ; Reducer:根据不同 Action 对 Store...中存储状态做出相应改变; Selector:用于获取存储状态切片纯函数; Effects:基于流实现副作用处理,以减少基于外部交互状态。...ng new angular-ngrx --standalone=false 安装 NGRX 核心模块: @ngrx/store:状态管理核心模块,包含了状态存储、Actions、Reducers、Selectors..."schematicCollections": ["@ngrx/schematics"] } } 创建存储 State Store: ng generate store State --root

23810

angular4实战(4)ngrx

https://blog.csdn.net/j_bleach/article/details/78161765 ngrx ngrxangular状态管理库,与..., ngrx/store-devtools 本次实例用ngrx 4.x版本,因为没有跟路由关联,也没有复杂行为,只用到了ngrx/store。...比如{name:j_bleach}=>{name:bleach} 或者输入属性为一个数组时候[1,2,3]=>[1,2,3].push(4) 以上这两种方式都不会引发angular检查策略...ps:这里边个人理解是因为每一个简单类型值,都会在新开栈上来存储,而对象不同,对象存在同一个指针引用(是否可以类似深浅拷贝,这里打个问号); 一篇国外文章帮助理解:https://blog.thoughtram.io.../angular/2016/02/22/angular-2-change-detection-explained.html#observables 不知道是否需要访问外国网站,再贴一篇sf上

1.1K30
  • Angular 项目路径添加指定访问前缀

    前言 开发多个项目的时候,我们希望能通过指定前缀路径去访问不同项目。比如,通过前缀 /projectA/ 去访问项目 A;通过前缀 /projectB/ 去访问项目 B。我们应该怎么设置呢?...这里使用框架是 Angular,"@angular/core": "~12.1.0" 更改项目前缀 假设我们添加前缀为 /jimmy/ 1....更改路由前缀 在 app.module.ts 文件中添加 APP_BASE_HREF: import { APP_BASE_HREF } from '@angular/common'; @NgModule...更改打包文件 这一步非必需,我们这里只是统一一下名称为 jimmy 而已 更改 angular.json 输出文件: { "projects": { ......至此,我们已经更改完了访问项目前缀,那么我们要部署到服务器上进行访问,是要怎么做呢? 部署项目 这里假设我已经将打包后 jimmy 资源上传到了服务器,并且用 nginx 作为代理。

    1.2K20

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

    哈希#form是一个模板引用变量,我们可以用它来访问我们代码中表单。...State是一个单一,不可变数据结构 - 至少Ngrx为我们实现它方式。Ngrx是由Redux提供灵感“RxJS支持Angular应用程序状态管理库”。 Ngrx灵感来自Redux。...让我们看看这是如何实现。我们讨论了State它不变性,这意味着我们在创建它之后不能改变它任何属性。这使得我们应用程序状态存储在我们系统中几乎不可能State。...请记住,我们正好将Firebase集成到我们应用程序中。现在它由于高度可维护Ngrx商店而丢失了。也就是说,它存储在任何地方。...我们可以使用诸如ngrx-store-localstorage之类东西来存储我们数据到浏览器localStore,但是如何使用API​​呢?

    42.6K10

    Angular 面试题汇总2-ComponentService (Angular v8+)

    样式作用域、Shadow DOM 关于Angular Service 单例服务(singleton) forRoot() 模式 关于Angular Component css样式作用域、Shadow...这是 Angular 默认设置。 ViewEncapsulation.Native – 使用原生 Shadow DOM 特性。但需要考虑浏览器是否支持。...ViewEncapsulation.None – 无 Shadow DOM,并且也无样式包装 关于Angular Service 服务(Service)充当着数据访问,逻辑处理功能。...对于复杂全局变量,推荐使用状态管理组件(state management – Ngrx)。...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    945140

    【Android 文件管理】应用可访问存储空间 ( 存储空间分类 | 存储空间访问权限 | 分区存储 )

    , 内部存储空间 外部存储空间 内部存储空间可靠性高于外部存储空间 ; 在 Android 10( API 级别 29 ) 及以上版本中 , 应用只能访问应用 专属存储空间 和 共享存储文件..., 包括媒体 , 文档 , 下载 等目录 ; 二、存储空间访问权限 ---- 内部存储空间访问不需要权限 ; 在 Android 9( API 级别28 ) 及以下版本中 访问外部存储需要使用 READ_EXTERNAL_STORAGE..., 其它外置存储空间目录 , 无法访问 ; 三、分区存储 ---- 在 Android 9( API 级别 28 ) 及以下版本中 , 开发者可以任意在外置存储目录中创建文件 , 进行任何读写操作 ,...Android 10( API 级别 29 ) 及以上版本 , 会自动开启分区存储 , 这时候需要进行兼容开发 ; 一旦启用了分区存储 , 就无法访问 SD 卡中创建目录或文件 , 只能访问外部存储空间应用专属目录...---- Android 文件处理参考文档 : 数据和文件存储概览 访问应用专属文件 保存到共享存储空间 管理存储设备上所有文件 分享文件 应用安装位置 Android 存储用例和最佳做法 FileProvider

    2.4K30

    随机访问存储动态原理

    随机访问存储器(Random-Access Memory,RAM)分为两类:静态RAM (SRAM)和动态RAM(DRAM)。SRAM比DRAM更快,但也贵得多。...SRAM用来作为高速缓存存储器,一般只有几兆。DRAM用来作为主存以及图形系统帧缓冲区(显存),一般有几G。   静态存储器SRAM将每个位存储在一个双稳态存储器单元里。...动态存储器DRAM将每个位存储为对一个电容充电。这个电容非常小,通常只有30*10^-15法拉。 DRAM存储器可以造十分密集。 每个单元由一个电容和一个访问晶体管组成。...幸运是,计算机时钟周期以纳秒衡量,这个保持时间也相当长。存储器系统必须周期性地读出,然后重写来刷新存储每一位。...固态硬盘(Solid State Disk,SSD)也是基于闪存磁盘驱动器。 访问主存   数据流通过称为总线(bus)共享电子电路在处理器和DRAM主存之间来来回回。

    98420

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

    NodeJS NestJS[24],一个大而全Node框架,就像NodeJS里Angular,实际上作者也是受到了Angular影响,很多装饰器都和Ng中同名。...如果你打算Angular和Nest都学,我建议是先学Nest,这样入门Angular学习路线会更平滑一点。...NgRx[93],很好用Angular状态管理方案,写法和Redux非常像,也是action >>> reducer >>> state,所以几乎可以没有什么成本上手。...秉承了Angular思想,提供了一整套集成:和Angular Router集成:@ngrx/router-store;对于集合类型适配:@ngrx/entity;副作用管理:@ngrx/effects...,以及必不可少schematics:@ngrx/schematics等,最大优势是和RxJS深度集成。

    4.2K10

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

    现在,所有框架都提供API来管理你状态(例如Angular有一个Service,React现在有Context API)以及当你数据规模变大之后,你可以考虑使用像redux这样库。...如果用户登陆了,则将他/她重定向到用户主页,并阻止访客用户访问(主页),因为这需要用户登陆。...你将学到: 路由守卫:某些页面只允许通过身份验证用户(访问) 如何发送并保存JWT(JSON Web令牌)以发出需要经过身份验证用户请求 3.CRUD App 增删查改应用程序是本节中最受欢迎前端应用程序...,你可以使用本地存储或者使用在线服务(如Firebase)来构建此应用程序,甚至将它与后端框架集成在一起。...你将学到: 学习如何使用管理状态解决方案,如redux for react, ngrx for angular 2+ 或 vuex for vuejs以及如何将其与客户端应用程序集成 使你应用更灵活

    3.6K10

    随时随地访问家里搭建私有存储(tfcenter)

    ​ 1、组网如下: 2、准备工具: (1)家里存储盒子、笔记本或台式机 (2)tfcenter软件 (3)手机(android、IOS) (4)公有云主机(可选,tfcenter中有共享云IP,也可使用自己搭建...IP服务) 3、操作方法: 3.1 运行tfcenter软件 在存储盒子、笔记本或台式机安装运行tfcenter软件: 下载安装包(绿色免安装) tfcenter安装包 https://share.weiyun.com...效果图如下:(支持手机端访问) 详情可参考 [基础]tfcenter开启本地文件功能_tfcenter博客-CSDN博客 方式二: 通过开启Webdav管理服务 详情可参考 [基础]tfcenter...博客-CSDN博客 tfcenter功能介绍: 支持端口映射、本地文件管理、Webdav文件服务、http代理和socks5代理服务 四大功能 端口映射:将内网服务映射到外网访问,实现远程访问内网...本地文件管理:随时访问本地磁盘文件,并进行收藏和分享;也可在线播放图片和视频 Webdav文件服务:可以通过访问C盘、D盘方式远程访问家里电脑,不再担心磁盘空间不够 代理服务:可以在可以在外网随时通过代理访问内部服务器或者代理上网

    3.5K30

    浏览器中存储访问令牌最佳实践

    出于可用性原因,JavaScript应用程序通常不会按需请求访问令牌,而是存储它。 问题是,如何在JavaScript中获取这样访问令牌?...(从技术上讲,这个定义还有细微差别,但这个简化说法有助于解释这个概念)。 本地存储 本地存储是通过Web存储API中全局localStorage对象以JavaScript访问。...请注意,本地存储数据会永久存储,这意味着存储在其中任何令牌会驻留在用户设备(笔记本电脑、电脑、手机或其他设备)文件系统上,即使浏览器关闭后也可以被其他应用程序访问。...与迄今为止讨论其他客户端存储机制一样,使用索引数据库API存储数据访问受到同源策略限制。只有相同来源资源和服务工作者才能访问数据。...被盗访问令牌可能会造成严重损害,XSS仍然是Web应用程序主要问题。因此,避免在客户端代码可以访问地方存储访问令牌。相反,将访问令牌存储在cookie中。

    23410

    2019 简易Web开发指南

    Bootstrap Materialize Bulma JS框架 React:目前最流行 Vue:简单易用,越来越多人用 Angular:曾经很流行,现在有点衰退 状态管理(state management...) Redux VueX NgRx Apollo (GraphQL Client) 后端渲染(server side rendering) Next.js (React) Nuxt.js (Vue) Angular...Universal (Angular) 开发工具 依赖管理:NPM,Yarn 应用打包:Webpack,Parcel 任务管理:Gulp,Grunt 编辑器扩展:ESLint,Live Server...,Flask C#:ASP.NET PHP:Laravel,Symfony 数据库 关系型:MySQL,PostgreSQL,MS SQL NoSQL:MongoDB,Couchbase 云存储...TypeScript TypeScript诞生已经有好几年了,近两年变得很火,很多框架和工具都是typescript写,比如vscode,angular,ant-design,更多请参考 github

    2.3K41

    前端框架选择指南:React vs Vue vs Angular

    模板语法: 自己模板系统,支持双向数据绑定。状态管理: 提供NgRx等库进行状态管理。适合: 大型企业级项目,需要严格结构和规范团队。...Vue: 社区活跃,有许多优秀UI库,如Element UI、Vuetify等。Angular: 社区相对较小,但由Google支持,有Angular Material等官方UI库。...Angular: 严格架构和模块化,适合大型项目,但过度复杂可能导致学习成本增加。企业支持React: Facebook开源项目,广泛应用于各种公司。...Angular: 由于其全栈性质,Angular项目通常更难迁移到其他框架,但Angular Elements可以创建Web Components,提供一定程度跨框架兼容性。...如果需要一个完整解决方案,包括路由、状态管理和服务,Angular可能更合适。总结选择React、Vue还是Angular没有绝对“最好”,每个框架都有其独特优点和适用场景。

    14600

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

    由于历史原因,开发框架同时基于 React 和 Angular,考虑到产品复杂性、人员短缺和技术背景各异,我们尝试了各种方法打磨工具体系来提升开发效率,以下分享五点。 ?...一、基于 Redux 状态管理 从2013年React发布至今已近6个年头,前端框架逐渐形成 React/Vue/Angular 三足鼎立之势。...庆幸是除了 React 社区,Vue 社区有类似的 Vuex,Angular 社区有 NgRx 也提供了几乎同样能力,甚至 NgRx 还可以无缝使用 redux-devtools 来调试状态变化。...最终我们得到如下扁平状态树。虽庞大但有序,你可以快速而明确访问任何数据。 ? 如何减少样板代码? 使用原生 Redux,一个常见请求处理如下。...曾经 React 和 Angular 是两个很难调和框架,开发中浪费了我们大量的人力。

    1.2K20

    Angular vs React 最全面深入对比

    Angular Angular除了提供一些需要最新浏览器支持功能外,同时提供以下标准功能: 依赖注入 模板 路由(@angular/router) AJAX(@angular/http) 表单(@angular...Angular Angular CLI 现代框架流行趋势是使用CLI工具,可以帮助您引导项目,而无需自行配置构建。AngularAngular CLI。它允许您仅使用几个命令来生成和运行项目。...@ngrx/store @ngrx/store是由Redux启发Angular状态管理库,基于由pure reducer进行突变状态。...不像Redux那样将状态保存在一个不可变存储中,它鼓励您仅存储最低限度必需状态,并从其中获取剩余数据。它提供了一组装饰器来定义可观察和观察者,并将反应逻辑引入到你状态管理代码中。...前景 Angular 就在2017年3月,Angular已经发布了4.0版本(兼容2.x版本),关于为什么是4.0,官方解释是因为Router这个主要核心组件版本已经是4.0.0,如果Angular

    3.8K70
    领券