无法从组件获取Redux state,AuthReducer未正确识别状态变量问题求助
核心问题原因
- 你在
store.js中没有使用Redux提供的combineReducers方法合并多个reducer,反而直接定义了一个返回reducer对象的普通函数传给createStore,导致Redux没有正确初始化各个子reducer的状态,这就是你看到state里只有两个reducer函数、拿不到实际状态、AuthReducer主逻辑不执行的根本原因。 mapStateToProps里取值路径错误,合并reducer后,AuthReducer的状态会挂载到state.AuthReducer下,你直接取state.isLoggedIn必然返回undefined。
修复步骤
1. 修复store.js代码
替换原store.js中的reducer定义和store创建逻辑:
import { createStore, compose, applyMiddleware, combineReducers } from 'redux' import AuthReducer from './Auth/AuthReducer' import RegisterReducer from './Register/RegisterReducer' import thunk from 'redux-thunk' const composeEnhancers = (typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) || compose // 使用combineReducers合并多个子reducer const rootReducer = combineReducers({ AuthReducer, RegisterReducer }) const store = createStore( rootReducer, composeEnhancers(applyMiddleware(thunk)), ) export default store
2. 修复App.js中mapStateToProps的取值路径
const mapStateToProps = (state) => { console.log(state) // AuthReducer的状态挂载在state.AuthReducer字段下 console.log(state.AuthReducer.isLoggedIn) return { isLoggedIn: state.AuthReducer.isLoggedIn, accessToken: state.AuthReducer.accessToken } }
3. 启用session缓存读取逻辑(可选)
放开AuthReducer中注释的getAuthState逻辑,初始化state时调用即可,应用启动时就会自动从sessionStorage读取历史登录状态同步到Redux。
4. 实现路由重定向逻辑
在对应路由组件中加登录状态判断即可,例如Login组件:
// Login.js import { Redirect } from 'react-router-dom' import { connect } from 'react-redux' const Login = (props) => { // 已登录用户访问登录页直接跳转到/test if (props.isLoggedIn) { return <Redirect to="/test" /> } // 原有登录表单逻辑 } const mapStateToProps = state => ({ isLoggedIn: state.AuthReducer.isLoggedIn }) export default connect(mapStateToProps)(Login)
/test页面同理,判断如果isLoggedIn为false就重定向到/login页面即可。
内容的提问来源于stack exchange,提问作者Imnotapotato
相关产品推荐
相关产品推荐

