调用单个LoginAction却触发多个Reducer的问题求助
嘿,这其实是Redux的正常工作机制,并不是你代码出了bug哦!我来给你拆解一下:
Redux的核心逻辑:所有Reducer都会接收每个Action
当你通过dispatch发送一个action时,Redux会把这个action传递给所有被combineReducers合并的reducer,不管这个action的type是不是某个reducer里定义的分支。combineReducers的作用只是帮你拆分管理不同的state片段,而不是过滤action——它会遍历所有注册的reducer,把对应片段的state和当前action传给每个reducer,然后收集每个reducer返回的结果,组合成新的全局state。你的代码表现完全符合预期
看你提供的三个reducer,它们的结构完全一致,每个里面都加了console.log。所以当你触发TEST_ACTION时,三个reducer都会接收到这个action,自然都会打印日志。不过你注意看它们的switch分支,因为TEST_ACTION不匹配任何一个reducer里的case,所以都会走到default分支,返回原来的state——也就是说,虽然它们都被触发了,但并没有修改对应的state片段,这是完全正常的。关于你的预期偏差
你可能误以为action只会触发“对应”的reducer,但Redux本身并没有这个关联逻辑。如果想避免无关reducer打印日志,你可以调整一下:比如只在reducer匹配到对应action类型的时候才打印日志,或者直接用Redux DevTools来查看action的处理情况,这样会更清晰。
举个例子,你可以把LoginReducer里的日志改成这样,就只会在匹配到目标action时打印:
export default (state = INITIAL_STATE, action) => { switch (action.type) { case 'SOME_ACTION': console.log('Login reducer =>', action); return { /* state setting from action */ }; default: return state; } };
内容的提问来源于stack exchange,提问作者Morton

