Реагирующий маршрутизатор с двумя параметрами URL и более

#reactjs #react-router #react-router-dom #react-router-v4

#reactjs #реагирующий маршрутизатор #react-router-dom #react-router-v4

Вопрос:

Я использую react-router-dom, и в настоящее время это выглядит так:

 <Switch>
        <Route path={"/layouts/:layoutID"} component={Layouts} />
        <Route
          path={"/dashboard/:dashboardID"}
          component={Dashboards}
        />
</Switch>
  

Когда пользователь переходит к «/ dashboard /: dashboardID» внутри этого компонента, он может выбрать подстраницу onClick, и я хочу, чтобы структура URL была «/ dashboard /: dashboardID /: pageID», pageID перейдет к «PageIdComponent», этот компонент получит реквизит «match» и будетпоказать идентификатор страницы

Пожалуйста, посмотрите прикрепленный файл, который показывает необходимую структуру.

Каков наилучший способ его реализации?введите описание изображения здесь

Комментарии:

1. Если вы используете управление состоянием, например redux, вы можете динамически обновлять маршруты с помощью выбранного идентификатора панели мониторинга.

2. Вы должны поместить другой маршрутизатор с дочерним маршрутизатором внутри вашего Dashboard компонента

Ответ №1:

Если у вас есть дочерний маршрут внутри вашего компонента панели мониторинга, вы можете использовать это match.path значение для создания дополнительного маршрута:

 <Route path={`${props.match.path}/:dashboardId`}>} component={SubDashboard} />
  

чтобы путь соответствовал тому, что было у родительского, а затем добавьте новую переменную поверх этого.

Затем вы можете перейти к нему, используя match.url , чтобы создать ссылку на текущий URL-адрес и добавить к нему подстраницу:

 <Link to={`${props.match.url}/pageFour`}>Page four</Link>
  

Вместо того, чтобы использовать prop driling, React Router предлагает способы получения соответствующих реквизитов для любых компонентов, которые вы хотите, с помощью withRouter HOC или различных перехватов. Перехваты были введены в версии 5.1

Чтобы получить совпадение с помощью перехвата, вы можете использовать const match = useRouteMatch()

Чтобы получить соответствующие реквизиты через HOC:

 const Example = useRouteMatch(function Example({ match, location, history }) {
  return <div>{match.url}</div>;
});
  

Для маршрутизатора react версии 6 (это скоро):

https://reacttraining.com/blog/react-router-v6-pre/#nested-routes-and-layouts

Комментарии:

1. Что делать, если дочерний элемент вложен в компонент панели мониторинга, но не напрямую (на два уровня ниже), и я не хочу полностью передавать реквизит «совпадение». Есть ли какое-либо решение для этого?

2. @Shira, я добавил некоторую информацию о withRouter HOC и соответствующий хук для получения информации о совпадении. Это позволит вам использовать их из произвольных местоположений в проекте, если они находятся в пределах поставщика маршрутизатора.