React Router 4.x 连接到 Redux 后 PrivateRoute 不工作
最近,在使用 React Router 4.x 和 Redux 构建一个 React 应用时,我遇到了一个问题。我尝试创建一个私有路由(PrivateRoute),以便只有经过身份验证的用户才能访问某些页面。然而,在将 React Router 连接到 Redux 后,我发现私有路由无法正常工作。在本文中,我将讨论这个问题,并提供一些解决方案。问题描述在 React Router 4.x 中,我们可以使用 `javascriptimport React from 'react';import { Route, Redirect } from 'react-router-dom';const PrivateRoute = ({ component: Component, isAuthenticated, ...rest }) => (在上面的代码中,`PrivateRoute` 组件接收一个 `component` 属性,该属性是要保护的组件,以及一个 `isAuthenticated` 属性,用于验证用户是否已登录。如果用户已登录,则渲染 `component`,否则重定向到登录页面。然而,当我们将 React Router 连接到 Redux 后,私有路由就无法正常工作了。即使用户已登录,私有路由也会将用户重定向到登录页面。解决方案要解决这个问题,我们需要确保将 Redux 的状态传递给私有路由组件,以便它可以正确地进行身份验证。下面是一种解决方案:首先,我们需要将 `isAuthenticated` 属性存储在 Redux 的状态中。我们可以使用 Redux 的 `connect` 函数将状态传递给私有路由组件。以下是修改后的代码:{...rest} render={props => isAuthenticated ? ( ) : ( ) } />);export default PrivateRoute;
javascriptimport React from 'react';import { connect } from 'react-redux';import { Route, Redirect } from 'react-router-dom';const PrivateRoute = ({ component: Component, isAuthenticated, ...rest }) => (在上面的代码中,我们使用 `connect` 函数将 `isAuthenticated` 属性传递给 `PrivateRoute` 组件。案例代码下面是一个简单的案例代码,演示了如何使用 React Router 4.x 和 Redux 创建一个具有私有路由的 React 应用:{...rest} render={props => isAuthenticated ? ( ) : ( ) } />);const mapStateToProps = state => ({ isAuthenticated: state.auth.isAuthenticated,});export default connect(mapStateToProps)(PrivateRoute);
javascript// index.jsimport React from 'react';import ReactDOM from 'react-dom';import { BrowserRouter as Router, Route } from 'react-router-dom';import { createStore } from 'redux';import { Provider } from 'react-redux';import PrivateRoute from './PrivateRoute';import Home from './Home';import Login from './Login';import rootReducer from './reducers';const store = createStore(rootReducer);ReactDOM.render(, document.getElementById('root'));
javascript// PrivateRoute.jsimport React from 'react';import { connect } from 'react-redux';import { Route, Redirect } from 'react-router-dom';const PrivateRoute = ({ component: Component, isAuthenticated, ...rest }) => ({...rest} render={props => isAuthenticated ? ( ) : ( ) } />);const mapStateToProps = state => ({ isAuthenticated: state.auth.isAuthenticated,});export default connect(mapStateToProps)(PrivateRoute);
javascript// Home.jsimport React from 'react';const Home = () => ();export default Home;Welcome to the Home Page!
You can only access this page if you are logged in.
javascript// Login.jsimport React from 'react';const Login = () => (在上面的代码中,`Home` 组件是受保护的私有路由,只有在用户已登录时才能访问。`Login` 组件是登录页面。通过以上解决方案,我们成功地将 React Router 4.x 和 Redux 连接并使私有路由正常工作。在使用 React Router 4.x 和 Redux 构建 React 应用时,私有路由可能会遇到问题。然而,通过将 Redux 的状态传递给私有路由组件,我们可以解决这个问题。在这篇文章中,我讨论了这个问题,并提供了一个解决方案和案例代码。希望这对你有所帮助!);export default Login;Login Page
Please login to access the Home page.