Reducer未通过解构属性更新state问题求助
SET_GROUP action无法更新state中的group值? 看起来你的SET_GROUP action明明携带了group:68,但reducer就是没把这个值更新到state里,我帮你梳理几个最可能的原因:
先排查
checkEmptyArray函数的影响
你在计算showStudent时调用了checkEmptyArray(action),如果这个函数内部做了一些意想不到的操作——比如直接修改了action对象的属性,或者执行时抛出了未捕获的错误,都可能打断后续的state更新逻辑。你可以先临时把showStudent的计算注释掉,只返回{ ...state, group },看看group能不能正常更新,这样就能快速确认是不是这个函数搞的鬼。验证action是否真的到达了目标reducer分支
有可能这个SET_GROUPaction被dispatch到了其他reducer,根本没进入你写的这个case。你可以在case "SET_GROUP"里加一行console.log('Received group:', action.group),然后触发action,看看控制台有没有输出Received group:68。如果没输出,那就要检查你的store配置、action dispatch的路径是不是对应上了。检查其他action是否不小心覆盖了
group值
你提到还有SET_YEAR的case,看看那个case的处理逻辑是不是写错了——比如有没有在返回新state时,没保留原有的group值?比如如果SET_YEAR的代码是return { year: action.year }而不是return { ...state, year: action.year },那每次触发SET_YEAR都会把group重置回初始值0。确认action在dispatch前没被修改
虽然你定义的action是{type: "SET_GROUP", group: 68, ...},但如果有中间件(比如日志中间件、自定义中间件)在处理时不小心修改了action的结构,导致group值丢失了,那reducer自然拿不到正确的值。你可以在dispatch这个action之前,先console.log一下action对象,确认group确实是68。排查状态不可变的潜在问题
如果你给initialState或者之前的state做了冻结(比如用Object.freeze),那尝试修改group值会静默失败,因为冻结后的对象无法被修改。检查一下有没有代码做了类似的操作。
内容的提问来源于stack exchange,提问作者Bomber

