Урок 02

Настройка 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 для программной навигации