NgRx中shell组件onInit触发dispatch后selector返回undefined 刷新才正常
问题原因
1. Action类型标识重复+拼写错误(核心问题)
你定义的userActions常量存在两处严重错误:
GET_PROFILE、GET_PROFILE_SUCESS的取值和GET_USERS系列的Action完全重复,NgRx是通过Action的type字段区分不同事件,重复的type会导致后续监听、Reducer匹配完全失效- 失败Action的键名
GET_PROFLE_FAILURE拼写错误,缺少字母i,会导致失败回调无法正常匹配
2. 组件内执行顺序问题
你在ngOnInit中先dispatch了Action,再订阅Selector,若接口/状态更新速度快于订阅动作,会出现首次更新漏接的情况
3. 可选问题:组件Output定义不规范
@Output() userProfile$标注的类型是Observable,实际实例化的是EventEmitter,虽然语法上兼容,但不符合Angular输出事件的常规写法
修复方案
第一步:修正Action常量
export const userActions = { GET_USERS: '[users] Get Users', GET_USERS_SUCESS: '[users] Get Users Success', GET_USERS_FAILURE: '[users] Get Users Failure', GET_PROFILE: '[users] Get Profile', // 改为唯一标识 GET_PROFILE_SUCESS: '[users] Get Profile Success', // 改为唯一标识 GET_PROFILE_FAILURE: '[users] Get Profile Failure', // 修正拼写 }
第二步:调整组件内执行顺序
ngOnInit(): void { // 先订阅状态,再触发请求,避免漏接更新 this.store.select(selectProfile).subscribe(data => console.log('data', data)); this.store.dispatch(actionGetProfile()); }
第三步:补充检查逻辑
- 确认你的Effect监听的是
actionGetProfile,请求成功后正确触发actionGetProfileSuccess、失败触发actionGetProfileFailure - 确认Reducer匹配到
actionGetProfileSuccess时,正确将payload的user赋值给状态中的profile字段 - 建议在Reducer的初始状态中给
profile设置默认值null,避免undefined歧义
内容的提问来源于stack exchange,提问作者3gwebtrain
相关产品推荐
相关产品推荐

