React Router 4.x - 连接到 Redux 后 PrivateRoute 不工作

作者:编程家 分类: reactjs 时间:2025-08-10

React Router 4.x 连接到 Redux 后 PrivateRoute 不工作

最近,在使用 React Router 4.x 和 Redux 构建一个 React 应用时,我遇到了一个问题。我尝试创建一个私有路由(PrivateRoute),以便只有经过身份验证的用户才能访问某些页面。然而,在将 React Router 连接到 Redux 后,我发现私有路由无法正常工作。在本文中,我将讨论这个问题,并提供一些解决方案。

问题描述

在 React Router 4.x 中,我们可以使用 `` 组件来定义路由。为了创建一个私有路由,我们可以使用一个自定义的组件来包装 ``,并在该组件中进行身份验证。以下是一个简单的示例:

javascript

import React from 'react';

import { Route, Redirect } from 'react-router-dom';

const PrivateRoute = ({ component: Component, isAuthenticated, ...rest }) => (

{...rest}

render={props =>

isAuthenticated ? (

) : (

)

}

/>

);

export default PrivateRoute;

在上面的代码中,`PrivateRoute` 组件接收一个 `component` 属性,该属性是要保护的组件,以及一个 `isAuthenticated` 属性,用于验证用户是否已登录。如果用户已登录,则渲染 `component`,否则重定向到登录页面。

然而,当我们将 React Router 连接到 Redux 后,私有路由就无法正常工作了。即使用户已登录,私有路由也会将用户重定向到登录页面。

解决方案

要解决这个问题,我们需要确保将 Redux 的状态传递给私有路由组件,以便它可以正确地进行身份验证。下面是一种解决方案:

首先,我们需要将 `isAuthenticated` 属性存储在 Redux 的状态中。我们可以使用 Redux 的 `connect` 函数将状态传递给私有路由组件。以下是修改后的代码:

javascript

import 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);

在上面的代码中,我们使用 `connect` 函数将 `isAuthenticated` 属性传递给 `PrivateRoute` 组件。

案例代码

下面是一个简单的案例代码,演示了如何使用 React Router 4.x 和 Redux 创建一个具有私有路由的 React 应用:

javascript

// index.js

import 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.js

import 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.js

import React from 'react';

const Home = () => (

Welcome to the Home Page!

You can only access this page if you are logged in.

);

export default Home;

javascript

// Login.js

import React from 'react';

const Login = () => (

Login Page

Please login to access the Home page.

);

export default Login;

在上面的代码中,`Home` 组件是受保护的私有路由,只有在用户已登录时才能访问。`Login` 组件是登录页面。

通过以上解决方案,我们成功地将 React Router 4.x 和 Redux 连接并使私有路由正常工作。

在使用 React Router 4.x 和 Redux 构建 React 应用时,私有路由可能会遇到问题。然而,通过将 Redux 的状态传递给私有路由组件,我们可以解决这个问题。在这篇文章中,我讨论了这个问题,并提供了一个解决方案和案例代码。希望这对你有所帮助!