Во-первых, вам нужно управлять состоянием во всем приложении, чтобы хранить, является ли пользователь isLoggedIn или isAuthenticated.Попытка сделать это с помощью управления состоянием на самом верхнем компоненте создаст кошмары, если ваше приложение когда-либо станет немного сложнее.Попробуйте Redux, MobX или React Context API.Я предполагаю, что вы создаете какое-то хранилище с объектом auth, проверяющим, является ли пользователь «isAuthenticated».
При этом вам нужен компонент PrivateRoute.
// PrivateRoute.jsx
import React from 'react';
import { Route, Redirect } from 'react-router-dom';
import { connect } from 'react-redux'; // if you're using Redux!
import PropTypes from 'prop-types';
const PrivateRoute = ({component: Component, auth, ...rest }) => (
<Route
{...rest}
render = {props =>
auth.isAuthenticated === true ? (
<Component {...props} />
) : (
<Redirect to="/loggedOutHome" />
)
}
/>
);
PrivateRoute.propTypes = {
auth: PropTypes.object.isRequired,
}
// this would map your auth object to the components props with Redux
const mapStateToProps = state => ({
auth: state.auth,
});
export default connect(mapStateToProps)(PrivateRoute);
Затем вы захотите импортировать этот компонент PrivateRoute в свой компонент приложения и использовать его вместе с Switch-router-dom на любом маршруте, который хотите оставить приватным, и добавить некоторую маршрутизацию:
// App.jsx
import React, { Component } from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import { default as PrivateRoute } from './components/PrivateRoute';
import { Landing } from './components/Landing';
import { LoggedInComponent } from "./components/LoggedInComponent";
import { LoggedOutComponent } from "./components/LoggedOutComponent";
class App extends Component {
render() {
return (
<Router>
<div className="App">
<Route exact path="/" component={Landing} />
<Route exact path="/loggedOutHome" component = {LoggedOutComponent} />
<Switch>
<PrivateRoute exact path="/loggedInHome" component={LoggedInComponent} />
</Switch>
</div>
</Router>
);
}
}
export default App;
Теперь любая маршрутизация ссылки на ваш LoggedInComponent проверит, проверяет ли пользователь аутентификацию, и примет его там, если это так, или, если нет, перенаправит на ваш LoggedOutComponent.
Надеюсь, это поможет.