Вот мой код маршрута:
<Switch>{createRoutes()}</Switch>
const createRoutes = () =>
Routes.map(({ component: Component, urls }) =>
urls.map((url) => (
<Route
path = {url}
exact
render = {() => <Component/>}
/>
)),
);
const Routes = [
{
urls: ['/'],
component: Home,
},
{
urls: ['/test'],
component: Test,
},
];
И я хочу, чтобы когда URL-адрес «/test?x=1» соответствовал компоненту Контрольная работа, а когда URL-адрес «/test» соответствовал компоненту Дом. Как я могу это сделать?
react-router-dom
рассматривает только часть URL-адреса пути для сопоставления маршрутов, нет способа использовать queryString для сопоставления маршрутов.
Что вы можете сделать, так это создать компонент, который проверяет свойство location
текущего search
объекта и условно визуализирует соответствующий компонент.
Пример:
const TestWrapper = (props) => {
const { search } = useLocation();
switch (search) {
case "":
return <Home {...props} />;
default:
return <Test {...props} />;
}
};
...
const routes = [
{
paths: ["/"],
component: Home
},
{
paths: ["/test"],
component: TestWrapper
}
];
Кроме того, в react-router-dom@5
компонент Route
может принимать массив путей, поэтому вам не нужно явно сопоставлять маршрут для каждого пути в массиве paths
.
const createRoutes = () =>
routes.map(({ component: Component, paths }) => (
<Route key = {paths.join()} path = {paths} exact component = {Component} />
));