Таким образом, вам нужно решить 2 вещи: показать компонент NoMatch
, когда URL не найден, и защитить некоторые маршруты от незарегистрированных пользователей.
Для первого вы должны поместить <Route component={NoMatch} />
непосредственно перед закрывающим тегом <Switch>
, думайте об этом как о переключателе в простом javascript, последний случай всегда - это случай default
, если нет другого соответствия default
будет выполнен так же, как здесь.
Вторая проблема требует немного дополнительного кода, вы должны создать компонент, который перенаправляет пользователя, если он не вошел в систему, что-то вроде этого (это из документации по response-router документации):
function PrivateRoute({ component: Component, isLoggedIn,...rest }) {
return (
<Route
{...rest}
render={props =>
isLoggedIn ? (
<Component {...props} />
) : (
<Redirect
to={{
pathname: "/login",
state: { from: props.location }
}}
/>
)
}
/>
);
}
Затем используйте этот компонент для защищенных маршрутов:
<Switch>
<Route exact path="/" render={() => {
if(!store.getState().login.isAvailable) {
return <Redirect to="/login"/>
} else {
return <Redirect to="/dashboard" />
}
}}
/>
<Route exact path="/login" component={Login} />
{Routes.map((prop, key) => {
return <PrivateRoute path={prop.path} key={key} component={prop.component} isLoggedIn={isUserLoggedIn}
/>;
})}
<Route component={NoMatch} />
</Switch>
isUserLoggedIn
является составной переменной, вы должны заменить ее, если вы вошли в методы проверки
Edit:
Путь должен быть /dashboard
:
import Dashboard from "Dashboard/Dashboard.jsx";
var Routes = [{ path: "/dashboard", name: "Dashboard", component: Dashboard }];
export default Routes;
если вы хотите сохранить /
в качестве пути, вы должны вернуть компонент панели мониторинга внутри компонента Route
вместо перенаправления:
<Route exact path="/" render={() => {
if(!store.getState().login.isAvailable) {
return <Redirect to="/login"/>
} else {
return <Dashboard/>
}
}}
/>