React Router v6 представляет собой полное переосмысление подхода к маршрутизации в React-приложениях. Основные изменения затрагивают структуру компонентов, работу с маршрутами и их вложенность, управление навигацией и обработку параметров. Важным аспектом является упрощение синтаксиса и устранение неоднозначностей, существовавших в версии 5.
Switch заменён на RoutesВ версии 5 маршруты группировались внутри компонента
Switch, который рендерил первый совпавший маршрут. В v6
Switch удалён и заменён на Routes. Основные
особенности новой структуры:
import { Routes, Route } from 'react-router-dom';
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
component или render используется
element, который принимает JSX.exact)
больше не нужно.В v6 вложенные маршруты стали более интуитивными. Родительский
маршрут может содержать дочерние через элемент Route с
массивом children.
<Routes>
<Route path="/dashboard" element={<Dashboard />}>
<Route path="analytics" element={<Analytics />} />
<Route path="settings" element={<Settings />} />
</Route>
</Routes>
<Outlet />.<Outlet /> заменяет необходимость ручного
вложения props.children.function Dashboard() {
return (
<div>
<h1>Dashboard</h1>
<Outlet />
</div>
);
}
useNavigateХук useHistory из v5 заменён на
useNavigate. Он возвращает функцию для программной
навигации.
import { useNavigate } from 'react-router-dom';
function ProfileButton() {
const navigate = useNavigate();
return (
<button onCl ick={() => navigate('/profile')}>
Перейти в профиль
</button>
);
}
state:
navigate('/profile', { state: { from: 'dashboard' } }).{ replace: true }.Хук useParams сохраняет своё назначение, но теперь чаще
применяется в сочетании с вложенными маршрутами.
<Route path="/users/:id" element={<UserDetail />} />
function UserDetail() {
const { id } = useParams();
return <div>Пользователь: {id}</div>;
}
useParams с useLocation и
useNavigate.Вместо компонента <Redirect> теперь используется
<Navigate>.
<Routes>
<Route path="/" element={<Home />} />
<Route path="/old-path" element={<Navigate to="/new-path" replace />} />
</Routes>
replace предотвращает добавление новой записи в
историю.<Navigate> может использоваться и внутри JSX как
программный редирект через рендер.NavLink и
LinkСтарые компоненты <Link> и
<NavLink> остались, но поведение некоторых пропсов
изменилось:
activeClassName убран, вместо него используется функция
className, принимающая объект isActive.<NavLink
to="/about"
className={({ isActive }) => (isActive ? 'active' : '')}
>
О нас
</NavLink>
exact и
strictexact и
strict удалены.Использование React.lazy и Suspense
остаётся прежним, но синтаксис с v6 более удобен при объединении с
маршрутизацией:
const About = React.lazy(() => import('./About'));
<Routes>
<Route path="/about" element={
<Suspense fallback={<div>Загрузка...</div>}>
<About />
</Suspense>
} />
</Routes>
Routes и
element.children и
<Outlet />.useNavigate, редиректы
через <Navigate>.exact,
strict, activeClassName.Миграция требует тщательной проверки вложенных маршрутов, обработки параметров и редиректов, но в долгосрочной перспективе делает структуру приложения более предсказуемой и читаемой.