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
相关产品推荐
相关产品推荐

