Используется библиотека react-router
.
Маршруты описываются компонентным стилем в jsx в разметке контейнеров /app
.
Применяется вложенность контейнеров — маршрутизация подраздела внутри контейнера подраздела.
Названия поддиректорий в /app
соответствуют путям в маршрутах.
Вне директории /app
маршрутизация не допускается.
Все контейнеры в директории /app
прикреплены к какому-либо маршруту. За исключением модальных окон, для которых
свой механизм навигации.
Для программной навигации используется объект navigation
— это прокси-объект к history api.
import navigation from "@src/app/navigation"
.history
, который нужно доставать из контекста компонента.navigation
. Например: .goLogin()
для перехода к форме входа вместо navigation.push('/login')
.Не использовать хук useParams()
(и вообще все хуки роутера),
props.match.params
в привязанном к маршруту контейнере-странице.useParams
заставляет перерисовываться, даже если изменился не нужный контейнеру параметр. Аналогично негативно
влияют на рендер все хуки роутера - useHistory()
, useLocation()
. Хук подписывает компонент на контекст роутера,
а он меняется при любых действиях с навигацией.search параметры адреса не рассматривать как параметры роутера. Логику работы с ними лучше перенести в экшены редакса,
там где могла бы быть логика работы с localStorage
.
Для получения и изменения search параметров использовать функции объекта navigation
: .getSearchParams()
, .setSearchParams()
.
Маршруты приложения в JSX
function App() {
//...
return (
<Fragment>
<Helmet>
<title>Example</title>
</Helmet>
<Switch>
<Route path="/" exact={true} component={Main} />
<Route path="/catalog/:categoryId?" component={Catalog} />
<Route path="/about" component={About} />
<Route path="/login" component={Login} />
<RoutePrivate path="/private" failpath="/login" component={Private} />
<Route component={NotFound} />
</Switch>
<Modals />
</Fragment>
);
}