React-Redux使用combineReducers修改一个reducer导致另一个返回undefined如何修复
问题原因
两个问题都出在reducerTherm的实现逻辑上:
- default分支返回值不符合状态结构要求:
reducerTherm对应的状态是{therm: string}类型的对象,但你在default分支直接返回了state.therm字符串,会直接把该切片的状态从对象改成字符串。当触发ADD_SRC这类不属于reducerTherm处理的action时,所有切片reducer都会执行,reducerTherm走到default分支后,此时state已经是字符串类型,state.therm取值为undefined,触发报错。 - SEARCH_THERM分支返回逻辑错误:你直接返回了
action.payload,如果payload是搜索的字符串值,也会把该切片状态改成字符串,同样会引发后续的undefined问题。
修复方案
修改reducerTherm的实现,保证所有分支返回的都是符合结构要求的状态对象:
interface Props { therm: string; } const initialState: Props = { therm: "", }; export default function reducerTherm(state: Props = initialState, action: any) { switch (action.type) { case "SEARCH_THERM": // 返回新的状态对象,保留结构,只更新therm字段 return { ...state, therm: action.payload }; default: // 不处理的action直接返回完整的当前state对象 return state; } }
额外提示:
reducerSrc的ADD_SRC分支也存在同样的结构风险,如果你传的payload不是{src: xxx}格式的对象,建议也改成return {...state, src: action.payload}的写法,避免后续出现同类结构错误。
内容的提问来源于stack exchange,提问作者Marin
相关产品推荐
相关产品推荐

