Redux store多reducer如何匹配对应正确的action creator
Redux中action与reducer的匹配逻辑
Redux从设计上就不存在“主动判定action该分配给哪个reducer”的机制,核心运行逻辑非常直白:
- 每次你调用
dispatch派发一个action时,当前store里注册的所有reducer都会收到这个完整的action对象,相当于给所有reducer发了一次全员广播 - 每个reducer自己判断要不要处理当前收到的action,和自己无关的action直接按规则返回原状态即可,不会做任何修改
combineReducers的实际作用
这个API本身没有任何“路由分配action”的魔法,它做的事只是把你传入的多个拆分后的reducer,组装成一个统一的根reducer,核心逻辑可以用几行伪代码还原:
// 假设你拆分了两个业务reducer:负责待办项的todosReducer、负责筛选状态的filterReducer const rootReducer = (globalState = {}, action) => { return { // 每次action过来,两个子reducer都会被调用,都能拿到同一个action todos: todosReducer(globalState.todos, action), filter: filterReducer(globalState.filter, action) } }
你可以看到,不管你派发的是什么action,这两个子reducer每次都会执行,不存在Redux提前帮你筛掉无关reducer的环节。
为什么不会出现action错配问题
错配不会发生,完全是靠reducer的约定和action type的唯一命名规则保证的:
- 每个reducer只处理自己认识的action:标准reducer内部都会通过
action.type做判断,一般是switch语句或者条件判断,只对自己负责的action type做状态更新,碰到不认识的type,必须走default分支原样返回传入的当前state,不做任何改动。
举个最常见的reducer例子:const initialState = [] function todosReducer(state = initialState, action) { switch (action.type) { case 'todos/add': return [...state, action.payload] case 'todos/delete': return state.filter(item => item.id !== action.payload) // 所有不认识的action,直接返回原state default: return state } } - action type全局唯一:只要你在写action的时候保证type字符串不重复,就不会出现A业务的action被B业务的reducer误识别的情况。现在官方推荐的Redux Toolkit会自动按照
slice名称/action名称的格式生成唯一type,从工具层面帮你避免了重名冲突的问题。
补充一个新手常见误区:不要觉得“所有reducer都执行一遍会有性能问题”,reducer本身就是纯函数,执行速度极快,未命中的reducer只是直接返回原state引用,不会触发组件的无效重渲染,性能开销可以忽略不计。
内容的提问来源于stack exchange,提问作者Samiul Islam Shibly
相关产品推荐
相关产品推荐

