React-Redux中Reducer未更新状态问题求助
问题分析与解决方案
我一眼就发现了两个导致你的React-Redux状态无法更新的关键问题,咱们一步步来解决:
1. Reducer中对象展开顺序错误
这是最核心的问题!你当前在reducer里返回新状态时,把...state放在了最后,这会导致原有state里的属性覆盖你刚设置的新值。
比如你写的:
return { user: action.user, authSuccess: true, ...state };
当展开state时,原state里的user和authSuccess会覆盖你前面定义的新值,相当于白设置了!
正确写法:把...state放在最前面,再定义要更新的属性,这样新属性会覆盖旧的state值:
function Auth(state = initialState , action) { switch(action.type) { case Actions.SIGN_UP_SUCCESS: console.log(action.user); return { ...state, user: action.user, authSuccess: true }; case Actions.AUTHENTICATION_FAILED: console.log(action.error); return { ...state, authError: action.error }; case Actions.LOGIN_SUCCESS: console.log(action.user); return { ...state, user: action.user, authSuccess: true }; default: return state; } }
2. mapStateToProps的状态路径可能错误
如果你的Redux Store是用combineReducers组合的(绝大多数项目都是这么做的),那你的状态结构会是每个reducer对应一个键。比如你把Auth reducer注册为Auth:
// 假设你的rootReducer是这样的 import { combineReducers } from 'redux'; import Auth from './reducers'; const rootReducer = combineReducers({ Auth: Auth });
那你的mapStateToProps就不能直接从state取属性,得从state.Auth里取:
function mapStateToProps(state) { return { user: state.Auth.user, authSuccess: state.Auth.authSuccess, authError: state.Auth.authError, }; }
如果你的reducer注册时用了别的键名,就对应改成那个键名即可。
验证方法
修改完后,你可以在组件的render里打印this.props,或者在Redux DevTools里查看状态变化,就能看到状态已经正确更新了。
内容的提问来源于stack exchange,提问作者Sumanth Jois
相关产品推荐
相关产品推荐

