TanStack Router предоставляет мощный и гибкий подход к управлению маршрутами в приложениях на JavaScript и TypeScript. Основной концепцией является программное определение маршрутов, что позволяет создавать иерархические структуры навигации с полным контролем над поведением маршрутов и их состоянием.
Маршруты создаются с помощью функции createRouter,
которая принимает конфигурацию маршрутов в виде массива объектов. Каждый
объект описывает путь, компонент, асинхронные данные и дочерние
маршруты.
import { createRouter, RouterProvider } from '@tanstack/router';
import HomePage from './pages/HomePage';
import ProfilePage from './pages/ProfilePage';
const router = createRouter({
routes: [
{
path: '/',
component: HomePage,
},
{
path: '/profile/:userId',
component: ProfilePage,
},
],
});
<RouterProvider router={router} />;
Ключевые моменты:
path — строка пути маршрута, поддерживает динамические
сегменты через двоеточие (:userId).component — компонент, который рендерится при
совпадении маршрута.children.TanStack Router поддерживает динамические сегменты маршрута и предоставляет API для извлечения параметров:
const ProfilePage = ({ params }) => {
return <div>Профиль пользователя: {params.userId}</div>;
};
params автоматически содержит значения динамических
сегментов пути./posts/:postId/comments/:commentId.Для создания иерархий страниц используется ключ
children:
const router = createRouter({
routes: [
{
path: '/dashboard',
component: DashboardLayout,
children: [
{
path: 'analytics',
component: AnalyticsPage,
},
{
path: 'settings',
component: SettingsPage,
},
],
},
],
});
Особенности вложенных маршрутов:
<Outlet />.Маршруты могут содержать loader-функции, которые выполняются перед рендерингом компонента:
const router = createRouter({
routes: [
{
path: '/posts/:postId',
component: PostPage,
loader: async ({ params }) => {
const response = await fetch(`/api/posts/${params.postId}`);
return response.json();
},
},
],
});
loader получает объект с params,
query, context.Каждый маршрут может иметь собственный ErrorBoundary:
{
path: '/profile/:userId',
component: ProfilePage,
errorComponent: ProfileErrorBoundary,
}
errorComponent.TanStack Router поддерживает навигацию через API маршрутизатора:
import { useRouter } from '@tanstack/router';
const navigateToProfile = () => {
const router = useRouter();
router.navigate({ to: '/profile/123' });
};
Особенности:
navigate позволяет указать путь и опционально состояние
или query-параметры.Можно создавать маршруты динамически, используя функции и массивы данных:
const users = [{ id: 1 }, { id: 2 }];
const userRoutes = users.map(user => ({
path: `/users/${user.id}`,
component: UserPage,
}));
const router = createRouter({
routes: [
{ path: '/', component: HomePage },
...userRoutes,
],
});
Для оптимизации производительности можно загружать компоненты маршрутов лениво:
import { lazy } from 'react';
const DashboardPage = lazy(() => import('./pages/DashboardPage'));
{
path: '/dashboard',
component: DashboardPage,
}
React.Suspense.Маршруты могут использовать context для передачи данных
в дочерние компоненты:
const router = createRouter({
routes: [
{
path: '/app',
component: AppLayout,
context: { theme: 'dark' },
children: [
{ path: 'home', component: HomePage },
],
},
],
});
TanStack Router полностью типизирован:
type RouterParams = {
userId: string;
};
const router = createRouter<RouterParams>({
routes: [
{
path: '/profile/:userId',
component: ProfilePage,
},
],
});
Если требуется, я могу подготовить отдельную секцию с практическими шаблонами программного определения маршрутов для типичных приложений, включая dashboard, e-commerce и блоги, чтобы показать реальное применение всех перечисленных функций. Это будет как раз следующий уровень глубины.