Redux store更新成功但组件未触发重渲染问题求助
1. 优先级最高:修正selector取值路径
从你mapStateToProps中读取state.options、state.oidc的写法可以判断,你使用了combineReducers拆分多模块状态,loadPlanningReducer对应的状态实际挂载在根state的某个子键下(比如combineReducers配置时对应的键名为loadPlanning)。
你当前的selector直接从根state读取loadPlanning、pending、error字段,但这些字段实际存放在子状态节点下,因此永远无法读取到更新后的值,自然不会触发组件重渲染。
请按你的combineReducers配置修正selector取值路径,示例:
// 假设combineReducers中loadPlanningReducer对应的键名为loadPlanning export const getLoadPlanning = (state) => state.loadPlanning.loadPlanning; export const getLoadPlanningPending = (state) => state.loadPlanning.pending; export const getLoadPlanningError = (state) => state.loadPlanning.error;
你观察到的pending变化时触发组件更新,大概率是其他模块的reducer也定义了pending字段,更新的是其他模块的状态,而非loadPlanningReducer内的pending。
2. 检查action payload字段匹配性
你dispatch成功回调时传入的是initialiseLoadPlanningSuccess(res.data),需要确认对应的action creator返回的action对象中,是否存在loadPlanning字段:
// 正确示例,和reducer取值逻辑匹配 const initialiseLoadPlanningSuccess = (data) => ({ type: INITIALISE_LOAD_PLANNING_SUCCESS, loadPlanning: data })
如果你的action creator将参数挂载到了payload等其他字段下,reducer中读取action.loadPlanning.items时会抛出异常,导致reducer无法返回新状态,store不会更新。你可以选择修改reducer取值逻辑为action.payload.items,或者调整action creator的字段命名。
3. 冗余写法优化(非强制,降低后续出错概率)
你reducer中SUCCESS分支的写法存在冗余,可以直接用对象扩展运算符替代Object.assign,去掉多余的状态展开:
if (action.type === INITIALISE_LOAD_PLANNING_SUCCESS) { console.log('updating state'); return { ...state, pending: false, loadPlanning: state.loadPlanning.concat(action.loadPlanning.items) }; }
原写法中Object.assign({}, state, { ...state, xxx })的...state属于重复操作,无实际作用且可能带来意外的字段覆盖风险。
内容的提问来源于stack exchange,提问作者LeightonHolmes

