Вот как я справляюсь с моими личными маршрутами, возможно, это поможет и вам.У меня protectedRoutes
как массив с маршрутами.Вы можете подогнать их как хотите.
const routes = [
{
path: '/login', exact: true, name: 'Login', component: Login,
},
];
const protectedRoutes = [
{
path: '/admin', exact: true, name: 'Admin', component: Admin,
},
];
<Switch>
{routes.map((route, idx) => (route.component ? (
<Route
key={idx}
path={route.path}
exact={route.exact}
name={route.name}
render={props => (
<route.component {...props} />
)}
/>
)
: (null)))}
{protectedRoutes.map((route, idx) => (route.component ? (
<Route
key={idx}
path={route.path}
exact={route.exact}
name={route.name}
render={props => (
isAuth
? <route.component {...props} />
: <Redirect to="/login" />
)}
/>
)
: (null)))}
</Switch>
LE: добавлен полный пример на основе исходного кода
import React, { Component } from 'react';
import { Route, Redirect, Switch, BrowserRouter as Router } from 'react-router-dom';
import Dashboard from '../view/Dashboard/Dashboard';
import Login from '../view/Login/Login';
import Admin from '../view/UserManagement/Admin';
import cookie from 'react-cookies';
const routes = [
{
path: '/login', exact: true, name: 'Login', component: Login,
},
];
const protectedRoutes = [
{
path: '/', exact: true, name: 'Dashboard', component: Dashboard,
},
{
path: '/AdminManagement', exact: true, name: 'Admin', component: Admin,
},
];
class MainPanel extends Component {
constructor(props) {
super(props);
this.state = {
isAuthed: cookie.load('token'),
},
};
render() {
const { isAuthed } = this.state;
return (
<div style={{ direction: direction }}>
<Router>
<Switch>
{routes.map((route, idx) => (route.component ? (
<Route
key={idx}
path={route.path}
exact={route.exact}
name={route.name}
render={props => (
<route.component {...props} />
)}
/>
)
: (null)))}
{protectedRoutes.map((route, idx) => (route.component ? (
<Route
key={idx}
path={route.path}
exact={route.exact}
name={route.name}
render={props => (
isAuth
? <route.component {...props} />
: <Redirect to="/login" />
)}
/>
)
: (null)))}
</Switch>
</Router>
</div>
)
}
}
export default withNamespaces('common')(MainPanel);