Я пытаюсь настроить Router
для использования пользовательских PrivateRoute
компонентов, которые эквивалентны примеру , приведенному в официальных документах react-router
.Подвох в том, что я также хочу использовать универсальный маршрут 404, поэтому я думаю, что мне нужно также использовать компонент Switch
, как показано в этом примере из документов.
Здесь есть конфликт, потому что документы для Switch
указывают, что дочерние элементы Switch
компонента должны быть Route
компонентами, а в этой проблеме команда заявляет, чтоиспользование компонентов вне маршрута внутри Switch
не поддерживается, даже если это работает.
Я создал маршруты более высокого порядка и в настоящее время использую их внутри Switch
, и, похоже, он работает, но это не пройдет проверку кода в моей компании, поскольку она использует неподдерживаемый API, который может сломаться в любое время.Я хочу знать, есть ли полностью поддерживаемый способ использовать маршруты более высокого порядка вместе с универсальным маршрутом.
Я пытаюсь создать маршрут 404 без необходимости использовать Switch
или использовать обычные Route
компоненты, но вместо этого обернуть компонент, переданный Route
в логику аутентификации.
import { Router, Route, Switch } from 'react-router-dom';
// Array of authorization functions to be tested by private routes
const authCriteria = [
// The next route must have been referred by a previous route
props => defined(props.location.state.from),
];
// Seems to work as expected, but violates the supported use
// of the Switch component
const AppRouter = () => {
return (
<Router>
<Switch>
<Route exact path='/' component={Store} />
<PrivateRoute
exact
path='/account'
component={Account}
authCriteria={authCriteria}
/>
<PrivateRoute
exact
path='/shipping'
component={Shipping}
authCriteria={authCriteria}
/>
<PrivateRoute
exact
path='/checkout'
component={Checkout}
authCriteria={authCriteria}
/>
// Catch-all route means we need to use a Switch
<Route render={() => (<h2>Not Found</h2>)} />
</Switch>
</Router>
);
};
export default AppRouter;