Splat routes в React Router — это механизм, позволяющий создавать
маршруты с динамическими или «захватывающими» сегментами URL. В отличие
от стандартных параметров пути (:param), которые
соответствуют только одному сегменту, splat (*) позволяет
«поймать» несколько сегментов сразу, что особенно полезно для вложенных
маршрутов и маршрутов с произвольной глубиной.
*
в путиСинтаксис splat-route выглядит следующим образом:
<Route path="/files/*" element={<Files />} />
Здесь * в конце пути означает, что компонент
Files будет рендериться для всех URL, начинающихся с
/files/, включая вложенные пути:
/files/documents/files/images/icons/files/documents/2026/reportsПри этом все «захваченные» сегменты становятся доступными через хук
useParams:
import { useParams } from 'react-router-dom';
function Files() {
const params = useParams();
console.log(params['*']); // 'documents/2026/reports'
return <div>Путь: {params['*']}</div>;
}
Ключевой момент: splat захватывает всё, что остаётся после базового пути, включая слеши.
Splat routes можно комбинировать с обычными параметрами:
<Route path="/users/:userId/*" element={<UserProfile />} />
/users/42/settings/privacy/users/42/posts/2026/marchВ компоненте UserProfile доступны оба значения:
const { userId, '*' : rest } = useParams();
console.log(userId); // '42'
console.log(rest); // 'settings/privacy' или 'posts/2026/march'
Это позволяет строить универсальные маршруты для страниц с вложенной навигацией.
Splat идеально подходит для динамических вложенных маршрутов без необходимости заранее определять все уровни:
<Route path="/dashboard/*" element={<Dashboard />}>
<Route path="analytics/*" element={<Analytics />} />
<Route path="reports/*" element={<Reports />} />
</Route>
В этом примере любой путь, начинающийся с /dashboard,
будет сначала обрабатываться компонентом Dashboard, а затем
можно использовать вложенные splat для дальнейшей маршрутизации внутри
него.
Splat позволяет эффективно внедрять ленивую загрузку (lazy loading) компонентов для больших приложений:
const Reports = React.lazy(() => import('./Reports'));
<Route path="/dashboard/reports/*" element={
<React.Suspense fallback={<div>Загрузка...</div>}>
<Reports />
</React.Suspense>
} />
Все вложенные пути /dashboard/reports/* будут загружать
компонент Reports только при необходимости, что уменьшает
размер основного бандла.
При использовании useNavigate можно перенаправлять
пользователей внутри splat-пути:
import { useNavigate } from 'react-router-dom';
function Files() {
const navigate = useNavigate();
function goToSubfolder(subfolder) {
navigate(subfolder);
}
return (
<button onCl ick={() => goToSubfolder('documents/2026')}>Документы 2026</button>
);
}
navigate работает относительно текущего маршрута, что
делает его удобным для вложенных и динамических маршрутов.
<Routes>. Иначе splat может
«захватить» слишком много URL и блокировать другие маршруты.index-маршрут для обработки базового пути без
дополнительных сегментов./files/* позволяет
отобразить любую глубину вложенных папок./admin/* с
динамической подгрузкой компонентов для каждой секции./docs/*
позволяет рендерить статьи с многоуровневой иерархией URL.Splat routes значительно упрощают работу с динамическими и многоуровневыми маршрутами, позволяя создавать гибкую архитектуру приложений без необходимости вручную прописывать все варианты URL.