Redux中单个reducer能否同时修改自身及其他多个reducer的状态
Redux跨reducer状态更新方案
完全可以实现,常用有3种符合Redux设计规范的实现方式:
- 方案1:让reducer1、reducer2主动响应目标action
这个是最推荐的实现方式。Redux中不存在「某个action专属特定reducer」的规则,所有分发的action会传递给所有reducer,你只需要在reducer1、reducer2的逻辑中新增对reducer3对应action类型的处理即可。
示例代码:
// reducer1 新增对应处理分支 const reducer1 = (state = initialState1, action) => { switch(action.type) { // 原有reducer1的业务逻辑 case 'R1_UPDATE_FIELD': return {...state, field1: action.payload} // 新增对reducer3触发的action的处理 case 'R3_TRIGGER_GLOBAL_UPDATE': return {...state, field2: action.payload.r1NewValue} default: return state } } // reducer2 同理新增处理分支 const reducer2 = (state = initialState2, action) => { switch(action.type) { case 'R3_TRIGGER_GLOBAL_UPDATE': return {...state, fieldX: action.payload.r2NewValue} default: return state } } // reducer3的原有逻辑不变,还是正常处理该action修改自身状态 const reducer3 = (state = initialState3, action) => { switch(action.type) { case 'R3_TRIGGER_GLOBAL_UPDATE': return {...state, ownField: action.payload.r3Value} default: return state } }
这种方式完全符合Redux的单向数据流设计,不需要修改整体的reducer组合逻辑,改造成本最低。
- 方案2:自定义根reducer,替代默认的
combineReducers
如果你使用combineReducers来组合各个子reducer,默认每个子reducer只能拿到自己对应的状态切片,无法修改其他切片。你可以自己实现根reducer,拿到完整的全局状态,当识别到reducer3的目标action时,直接修改所有相关的状态切片即可。
示例代码:
const rootReducer = (state = {}, action) => { // 处理需要跨切片更新的action if (action.type === 'R3_TRIGGER_GLOBAL_UPDATE') { return { reducer1: {...state.reducer1, field2: action.payload.r1NewValue}, reducer2: {...state.reducer2, fieldX: action.payload.r2NewValue}, reducer3: {...state.reducer3, ownField: action.payload.r3Value} } } // 其他action还是走原有子reducer的逻辑,和combineReducers效果一致 return { reducer1: reducer1(state.reducer1, action), reducer2: reducer2(state.reducer2, action), reducer3: reducer3(state.reducer3, action) } }
- 方案3:使用Redux Toolkit的监听中间件做联动
如果你使用Redux Toolkit开发,可以引入createListenerMiddleware监听reducer3的目标action,触发后主动分发修改reducer1、reducer2的action。这种方式适合跨切片逻辑比较复杂、需要做额外副作用处理的场景。
示例代码:
import { createListenerMiddleware } from '@reduxjs/toolkit' const listenerMiddleware = createListenerMiddleware() // 添加监听器 listenerMiddleware.startListening({ actionCreator: r3TriggerUpdateAction, // 就是reducer3对应的action创建函数 effect: async (action, listenerApi) => { // 分发修改reducer1和reducer2的action listenerApi.dispatch(updateR1Field(action.payload.r1NewValue)) listenerApi.dispatch(updateR2Field(action.payload.r2NewValue)) } })
内容的提问来源于stack exchange,提问作者Rishabh Jain
相关产品推荐
相关产品推荐

