You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NgRx中已废弃的带props的selectors用法有什么替代方案?

NgRx 带props的selectors废弃后替代实现方案

方案1:工厂函数式 Selector(最通用首选方案)

这是官方推荐的主流替代方案,本质是把参数作为工厂函数的入参,返回一个绑定了对应参数的selector实例,完美兼容原有的 memoization 缓存机制。

原废弃写法对比

// 已废弃的带props selector写法
const selectUserById = createSelector(
  selectUsersState,
  (state, props: { id: string }) => state.users[props.id]
);
// 组件调用示例:this.user$ = this.store.select(selectUserById, { id: '123' });

新实现方式

// 工厂函数Selector实现
const selectUserById = (userId: string) => createSelector(
  selectUsersState,
  (state) => state.users[userId]
);
// 组件调用示例:this.user$ = this.store.select(selectUserById('123'));

动态参数场景适配

如果参数是动态变化的Observable类型,搭配switchMap使用即可:

this.user$ = this.userId$.pipe(
  switchMap(userId => this.store.select(selectUserById(userId)))
);

方案2:参数存入全局State(全局通用参数场景首选)

如果props属于全局通用的属性(比如当前选中的主体ID、全局筛选项等),可以直接把参数存入State对应节点,通过组合Selector实现,完全不需要外部传参。

// 先定义取参数的Selector
const selectSelectedUserId = createSelector(
  selectUiState,
  state => state.selectedUserId
);
// 组合两个Selector直接获取目标数据
const selectCurrentUser = createSelector(
  selectUsersState,
  selectSelectedUserId,
  (userState, userId) => userState.users[userId]
);
// 组件直接调用,无需传参:this.user$ = this.store.select(selectCurrentUser);

方案3:Pipe 内直接计算(临时轻量场景首选)

如果是组件内一次性使用、计算逻辑简单的场景,不需要额外定义Selector,直接在select后通过map处理参数即可:

this.user$ = this.store.select(selectUsersState).pipe(
  map(userState => userState.users[this.userId])
);

选型建议

  • 高频复用、需要缓存的业务场景优先选工厂函数式Selector
  • 参数为全局通用属性的场景优先选State存参+组合Selector的方案
  • 临时使用、逻辑简单的轻量场景直接用Pipe内计算即可

内容的提问来源于stack exchange,提问作者walexy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:48:05