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

NgRx状态返回undefined,懒加载后用户列表无法显示

问题描述

路由改为懒加载后,用户列表无法显示。Redux DevTools中能看到正确的状态和用户列表,但组件中的loaded$和users$始终为undefined。


核心问题与修复方案

1. 重复定义Action类型

Actions文件中存在重复的Action类型字符串,导致Reducer无法正确处理状态更新:

// 第一个正确的批量加载成功Action
export const loadUsersSuccess = createAction(
  '[User] Load Users Success',
  props<{ users: User[] }>()
);

// 重复的类型字符串,覆盖了上面的定义
export const loadUserSuccess = createAction(
  '[User] Load Users Success',
  props<{ user: User }>()
);

修复:修改第二个Action的类型标识,确保唯一:

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

2. 根模块Store配置错误

AppModule中StoreModule.forRoot(userReducers)的配置有误,懒加载的feature状态不需要在根模块注册对应的reducer:

// AppModule中的错误配置
StoreModule.forRoot(userReducers),

// 修复为:如果没有根级自定义reducer,传入空对象
StoreModule.forRoot({}),

3. 模板逻辑反转

HTML模板中错误的判断逻辑导致用户列表无法渲染:

<!-- 错误逻辑:error为true时显示错误,否则显示错误模板 -->
<ng-container *ngIf="error$ | async; else usersListError">
  <div>An error occurred while loading users.</div>
</ng-container>
<ng-container *ngIf="!(error$ | async)">
  <!-- 用户列表 -->
</ng-container>

修复:调整逻辑,正常状态下显示用户列表,错误时显示错误模板:

<ng-container *ngIf="loaded$ | async; else loading">
  <!-- 错误状态显示错误提示 -->
  <ng-container *ngIf="error$ | async; else usersList">
    <div>An error occurred while loading users.</div>
  </ng-container>
  <!-- 正常状态显示用户列表 -->
  <ng-template #usersList>
    <mat-list role="list">
      <mat-list-item *ngFor="let user of users$ | async" [routerLink]="['detail', user.id]">
        {{user.name}}
      </mat-list-item>
    </mat-list>
  </ng-template>
</ng-container>

<ng-template #loading>
  <mat-progress-bar mode="indeterminate"></mat-progress-bar>
</ng-template>

<ng-template #usersListError>
  <div>Unable to load users. Please try again later.</div>
</ng-template>

4. 验证Feature状态路径一致性

确保StoreModule.forFeature('user', reducers)中的'user'与Selector中selectUserState的路径完全匹配:

// Selector中的状态路径
export const selectUserState = (state: AppState) => state.user;

// UsersModule中的Feature注册
StoreModule.forFeature('user', reducers),

两者的'user'必须完全一致,否则Selector无法正确获取feature状态。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:00:43