当前位置: 首页 > article >正文

ngrx store中createSelector的用法?

在ngrx的store中,createSelector用于从状态树中选择和派生数据。它允许创建高效的选择器,在状态变化时,仅当相关数据发生变化时才重新计算。这能有效避免不必要的渲染,提高性能。下面是createSelector的基本用法示例:

  1. 定义状态接口
    首先,定义应用的状态结构:
interface AppState {
  users: UserState;
}

interface UserState {
  allUsers: User[];
  selectedUserId: number | null;
}
  1. 定义初始状态和Reducers
    创建userReducer来管理UserState的状态:
const initialState: UserState = {
  allUsers: [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }],
  selectedUserId: null,
};

function userReducer(state = initialState, action): UserState {
  // 根据action处理状态更新逻辑
  return state;
}
  1. 使用createSelector创建选择器
    选择器用于从状态树中提取数据。假设你想要从AppState中获取allUsers和selectedUserId的派生状态。
import { createSelector } from '@ngrx/store';

// 基础选择器:获取 UserState
const selectUserState = (state: AppState) => state.users;

// 选择器1:获取所有用户
const selectAllUsers = createSelector(
  selectUserState,
  (userState) => userState.allUsers
);

// 选择器2:获取选中的用户ID
const selectSelectedUserId = createSelector(
  selectUserState,
  (userState) => userState.selectedUserId
);

// 派生选择器:根据 selectedUserId 获取选中的用户信息
const selectSelectedUser = createSelector(
  selectAllUsers,
  selectSelectedUserId,
  (allUsers, selectedUserId) => allUsers.find(user => user.id === selectedUserId)
);
  1. 在组件中使用选择器
    在组件中通过Store来调用这些选择器,并订阅选中的数据:
import { Store, select } from '@ngrx/store';
import { Observable } from 'rxjs';

@Component({
  // ...
})
export class UserComponent {
  allUsers$: Observable<User[]>;
  selectedUser$: Observable<User | undefined>;

  constructor(private store: Store<AppState>) {
    this.allUsers$ = this.store.pipe(select(selectAllUsers));
    this.selectedUser$ = this.store.pipe(select(selectSelectedUser));
  }
}

总结
createSelector支持组合和派生数据,减少不必要的计算。
选择器可以是单个状态字段的简单选择器,也可以组合多个选择器生成复杂数据。
在组件中通过Store调用选择器,可以自动管理订阅和状态更新。
这种方式在ngrx状态管理中高效、灵活,特别适合大型应用的复杂状态选择需求。


http://www.kler.cn/a/370378.html

相关文章:

  • 【神经网络基础】
  • 什么是SSL及SSL的工作流程
  • 51c嵌入式~单片机~合集6
  • 【大数据】机器学习------支持向量机(SVM)
  • 数据库服务体系结构
  • 【深入解析】 RNN 算法:原理、应用与实现
  • Spring Boot技术在厨艺交流平台中的创新应用
  • 成品气楼参考图集有哪些?盘点5本实用图集,你都知道哪几本
  • android studio编译错误提示无法下载仓库
  • Vue.js(2) 基础:指令与功能概览
  • 第三十二篇:TCP协议粘包和滑动窗口,TCP系列七
  • 智能工厂的设计软件 谓述词(遗传/继承)的前述谓经验: 认知系统架构和灵活模块化框架的实现原理 之1
  • 人工智能的发展前景如何?
  • OpenStack 新版本 Dalmatian 发布,为人工智能工作负载、安全性和用户体验提供增强功能
  • 什么是云原生后端
  • Docker搭建开源Web云桌面操作系统Puter和DaedalOS
  • LeetCode每日一题3211---生成不含相邻零的二进制字符串
  • Javascript数据结构——哈希表常见应用
  • Ubuntu 安装php7.3 nginx mysql
  • AVI格式怎么转MP4?码住这5个视频格式转换方法就足够了!
  • 深入解析HTTP与HTTPS的区别及实现原理
  • 【PyCharm配置Conda的虚拟环境】
  • 流媒体协议.之(RTP,RTCP,RTSP,RTMP,HTTP)(一)
  • ffmpeg视频滤镜: 裁剪-crop
  • RabbitMQ 消息处理问题全解
  • 穷举法的本质和特点