Каждый ваш макет должен иметь компонент пути, чтобы отличаться от других макетов.
Например
Схемы аутентификации могут находиться в /auth
, например, логин будет /auth/login
, регистрация будет /auth/signup
Макет приложения может быть меньше /app
, например, приборная панель будет /app/dashboard
, дом будет /app/home
Рабочая демоверсия
App.js
import { Switch, BrowserRouter, Route, Redirect } from "react-router-dom";
function App() {
return (
<BrowserRouter>
<Layouts />
</BrowserRouter>
);
}
Layouts.js
const NotFound = () => <h1>Not Found</h1>;
function Layouts() {
return (
<Switch>
<Route path="/auth" component={AuthLayout} />
<Route path="/app" component={AppLayout} />
<Route path="/" component={NotFound} />
</Switch>
);
}
AuthLayout
const Signup = () => <p>Login</p>;
const Login = () => <p>Sign up</p>;
function AuthLayout() {
return (
<div>
<h1>Auth Layout</h1>
<Route path="/auth/signup" exact component={Signup} />
<Route path="/auth/login" exact component={Login} />
<Redirect from="/auth" to="/auth/login" exact />
</div>
);
}
AppLayout
const Home = () => <p>Home</p>;
const Dashboard = () => <p>Dashboard</p>;
function AppLayout() {
return (
<div>
<h1>App Layout</h1>
<Route path="/app/home" exact component={Home} />
<Route path="/app/dashboard" exact component={Dashboard} />
<Redirect from="/app" to="/app/home" exact />
</div>
);
}
Также, если вы хотите защитить определенные маршруты от рендеринга, если они не аутентифицированы, вы можете создать PrivateRoute
компонент, который будет перенаправлять на макет аутентификации, если не аутентифицирован.
PrivateRoute.js
const PrivateRoute = ({ component: Component, ...rest }) => (
<Route
{...rest}
render={props => sessionStorage.token // your auth mechanism goes here
? <Component {...props} />
: <Redirect to={{ pathname: '/auth' }} />}
/>
);
Вы можете использовать этот PrivateRoute
компонент вместо react-router
Route
компонента.
Например:
<PrivateRoute path="/app" component={AppLayout} />