TanStack Router — это современная библиотека для маршрутизации в приложениях на React, ориентированная на типобезопасность, гибкость и мощную интеграцию с асинхронными данными. Она обеспечивает более строгую и предсказуемую работу с маршрутами, чем традиционные решения, позволяя строить сложные структуры страниц и управлять состоянием навигации на высоком уровне.
Маршруты в TanStack Router создаются с использованием объекта
Route, где каждому маршруту задаются путь
(path) и компонент (element). Простейший
пример определения маршрута выглядит следующим образом:
import { Router, Route } from '@tanstack/react-router';
import HomePage from './pages/HomePage';
import AboutPage from './pages/AboutPage';
const routes = [
new Route({
path: '/',
element: <HomePage />,
}),
new Route({
path: '/about',
element: <AboutPage />,
}),
];
const router = new Router({ routes });
Здесь Router управляет всей логикой маршрутизации, а
массив routes задаёт все доступные маршруты приложения.
Одной из сильных сторон TanStack Router является поддержка вложенных
маршрутов. Для создания вложенной структуры используется свойство
children у маршрута. Это позволяет определить общий layout
и одновременно управлять его вложенными страницами.
const dashboardRoute = new Route({
path: '/dashboard',
element: <DashboardLayout />,
children: [
new Route({ path: 'analytics', element: <AnalyticsPage /> }),
new Route({ path: 'settings', element: <SettingsPage /> }),
],
});
В данном примере DashboardLayout будет отображаться для
всех дочерних маршрутов /dashboard/analytics и
/dashboard/settings. При этом компоненты дочерних маршрутов
рендерятся внутри layout через <Outlet />.
TanStack Router поддерживает динамические сегменты URL через двоеточие. Параметры маршрута можно использовать для передачи данных в компонент:
const userRoute = new Route({
path: '/user/:userId',
element: ({ params }) => <UserProfile userId={params.userId} />,
});
Здесь params.userId автоматически содержит значение
сегмента URL, что позволяет работать с динамическими данными.
Для интеграции с асинхронными данными TanStack Router предоставляет
возможность использовать loader и action
функции. loader выполняется при переходе на маршрут и
позволяет заранее получить данные:
const postRoute = new Route({
path: '/posts/:postId',
element: PostPage,
loader: async ({ params }) => {
const response = await fetch(`/api/posts/${params.postId}`);
return response.json();
},
});
Загруженные данные доступны в компоненте через хук
useLoaderData.
Для навигации между маршрутами используется компонент
<Link> и функция router.navigate.
Link обеспечивает клиентскую навигацию без перезагрузки
страницы:
<Link to="/about">О нас</Link>
Для программной навигации внутри компонентов можно использовать:
import { useRouter } from '@tanstack/react-router';
function goToHome() {
const router = useRouter();
router.navigate('/');
}
TanStack Router позволяет задавать обработку ошибок на уровне
маршрута через errorElement. Это особенно полезно для
отображения страниц 404 или ошибок загрузки данных:
const profileRoute = new Route({
path: '/profile/:id',
element: ProfilePage,
loader: async ({ params }) => {
const user = await fetchUser(params.id);
if (!user) throw new Error('Пользователь не найден');
return user;
},
errorElement: <ErrorPage />,
});
Любые ошибки в loader или action
автоматически передаются в errorElement.
Для реализации защиты маршрутов можно использовать хуки и проверку
данных в loader:
const protectedRoute = new Route({
path: '/dashboard',
element: DashboardPage,
loader: async () => {
const user = await fetchCurrentUser();
if (!user) throw new Error('Не авторизован');
return user;
},
});
Таким образом, пользователь не сможет попасть на защищённый маршрут
без авторизации, а ошибки обрабатываются централизованно через
errorElement.
TanStack Router полностью поддерживает TypeScript, обеспечивая строгую типизацию маршрутов, параметров и данных loader. Это значительно снижает количество ошибок во время разработки и делает навигацию предсказуемой.
interface UserParams {
userId: string;
}
const userRoute = new Route<{ params: UserParams }>({
path: '/user/:userId',
element: UserPage,
});
TypeScript будет проверять наличие обязательного параметра
userId и его тип на этапе компиляции.
Для оптимизации загрузки данных и компонентов TanStack Router
поддерживает Suspense. Асинхронные загрузки маршрутов можно
оборачивать в <Suspense> для отображения индикатора
загрузки:
<Suspense fallback={<Loading />}>
<RouterProvider router={router} />
</Suspense>
Это позволяет создавать плавный UX, особенно при работе с крупными приложениями и тяжелыми компонентами.
TanStack Router предоставляет возможность контролировать поведение
при навигации через хуки onBeforeChange,
onAfterChange и другие. Это позволяет реализовать кастомные
анимации переходов и проверку условий перед сменой маршрута.
router.onBeforeChange((from, to) => {
if (to.path === '/restricted') {
return false; // блокировка перехода
}
});
Такой подход обеспечивает гибкую логику маршрутизации на любом уровне приложения.
Использование TanStack Router в React-приложениях позволяет создавать сложные маршруты с вложенной структурой, динамическими параметрами, асинхронной загрузкой данных и строгой типизацией. Его возможности по управлению состоянием навигации, обработке ошибок и интеграции с Suspense делают библиотеку мощным инструментом для профессиональной разработки современных веб-приложений.