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

NGRX技术问题:Reducer未响应Effect派发的Action的原因排查

问题排查与解决方案

看起来你的Reducer没执行的问题主要出在两个关键地方:Action的构造函数未正确初始化属性,以及Reducer没有正确匹配Action的类型。让我一步步帮你梳理:

1. WordListLoadedSuccessAction 未正确初始化 words 属性

你的Action构造函数接收了words参数,但没有把它赋值给类的this.words属性。这会导致即使Effect成功dispatch了这个Action,它的words字段始终是undefined——虽然这不是Reducer没执行的直接原因,但会导致后续状态更新失效,必须先修复。

修正后的Action代码:

export class WordListLoadedSuccessAction implements Action {
  readonly words: Word[];
  static readonly TYPE = 'WORD_LIST_LOADED_SUCCESS';
  readonly type = "WORD_LIST_LOADED_SUCCESS";
  // 在构造函数中完成属性赋值
  constructor(words: Word[]) {
    this.words = words;
  };
}

2. Reducer未正确判断Action类型

你当前的words reducer直接把action参数类型限定为WordListLoadedSuccessAction,但NGRX的reducer会接收所有通过store dispatch的Action。你需要在reducer内部通过action.type来过滤目标Action,否则运行时不会自动识别并执行对应逻辑;另外缺少默认分支的话,非目标Action进来时会返回undefined,破坏状态完整性。

修正后的Reducer代码:

import { Action } from '@ngrx/store';

export const reducers = combineReducers<AppState>({
  words(state = initialAppState.words, action: Action) {
    switch(action.type) {
      case WordListLoadedSuccessAction.TYPE:
        // 通过类型断言转换为具体Action类型
        const loadedAction = action as WordListLoadedSuccessAction;
        console.log(loadedAction); // 现在应该能正常输出了
        return loadedAction.words;
      default:
        // 所有非目标Action都返回当前状态
        return state;
    }
  }
});

额外验证点

从你提供的Effect日志来看,Effect已经正常执行并dispatch了后续Action,所以Effect的注册应该没问题。另外可以确认下AppState中words字段的类型是否和Word[]一致,避免类型不匹配导致的隐性问题。

修复以上两点后,Reducer应该就能正常接收WordListLoadedSuccessAction并更新状态了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:07:35