Настройка React Router
Установка
npm install react-router-dom
BrowserRouter
Оборачивает приложение в корне:
import { BrowserRouter } from 'react-router-dom';
import { createRoot } from 'react-dom/client';
import App from './App';
createRoot(document.getElementById('root')!).render(
<BrowserRouter>
<App />
</BrowserRouter>
);
Routes и Route
import { Routes, Route } from 'react-router-dom';
function App() {
return (
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/posts" element={<Posts />} />
</Routes>
);
}
Routes— контейнер для маршрутовRoute— один маршрут:pathиelement
Динамические параметры
<Route path="/posts/:id" element={<PostDetail />} />
:id — параметр. В компоненте читается через useParams:
import { useParams } from 'react-router-dom';
function PostDetail() {
const { id } = useParams<{ id: string }>();
return <p>Пост {id}</p>;
}
Вложенные маршруты
<Routes>
<Route path="/" element={<Layout />}>
<Route index element={<Home />} />
<Route path="posts" element={<Posts />} />
<Route path="posts/:id" element={<PostDetail />} />
</Route>
</Routes>
index — маршрут по умолчанию для родителя.
Outlet
Родительский компонент рендерит дочерние через Outlet:
import { Outlet } from 'react-router-dom';
function Layout() {
return (
<>
<header>Шапка</header>
<main>
<Outlet />
</main>
<footer>Подвал</footer>
</>
);
}
Маршрут 404
<Route path="*" element={<NotFound />} />
* ловит все несовпавшие пути.
Link и NavLink
Link — клиентская навигация без перезагрузки:
import { Link } from 'react-router-dom';
<Link to="/about">О нас</Link>
<Link to={`/posts/${post.id}`}>{post.title}</Link>
NavLink добавляет класс active для активного маршрута:
<NavLink to="/about" className={({ isActive }) => isActive ? 'active' : ''}>
О нас
</NavLink>
Программная навигация
import { useNavigate } from 'react-router-dom';
function Form() {
const navigate = useNavigate();
function handleSubmit() {
// ...
navigate('/posts');
}
function goBack() {
navigate(-1);
}
}
Итоги
BrowserRouterв корнеRoutes+Routeдля маршрутов:paramдля динамических частейOutletдля вложенныхLinkдля навигацииuseNavigateдля программной навигации