TanStack Router предоставляет мощные механизмы для работы с параметрами маршрутов, позволяя создавать динамические интерфейсы и управлять состоянием приложения через URL. Понимание параметров и их использования критически важно для построения гибкой навигации в современных веб-приложениях на JavaScript.
Динамические сегменты маршрута обозначаются с помощью двоеточия
: в пути. Например:
const router = createRouter({
routes: [
{
path: '/user/:userId',
component: UserPage,
},
],
});
:userId — это динамический параметр, который можно
извлечь и использовать внутри компонента./user/42, userId
автоматически получает значение "42".Доступ к параметрам осуществляется через хук
useParams:
import { useParams } from '@tanstack/router';
function UserPage() {
const params = useParams();
console.log(params.userId); // "42"
return <div>Пользователь: {params.userId}</div>;
}
Ключевые моменты:
TanStack Router поддерживает как обязательные, так и необязательные
параметры. Обязательные параметры указываются стандартным образом
(:param), а необязательные параметры можно описывать через
вопросительный знак в схеме маршрута:
{
path: '/search/:query?',
component: SearchPage,
}
/search/ — query будет
undefined./search/javascript — query будет
"javascript".Необязательные параметры полезны для фильтров, поиска и других динамических условий, которые не всегда присутствуют в URL.
Помимо сегментов пути, TanStack Router позволяет работать с query-параметрами. Они автоматически парсятся и передаются в компонент:
const router = createRouter({
routes: [
{
path: '/products',
component: ProductsPage,
},
],
});
Для навигации с query-параметрами используется метод
router.navigate:
router.navigate({ to: '/products', search: { category: 'books', sort: 'price' } });
/products?category=books&sort=price.useSearch:import { useSearch } from '@tanstack/router';
function ProductsPage() {
const search = useSearch();
console.log(search.category); // "books"
console.log(search.sort); // "price"
}
Особенности query-параметров:
TanStack Router позволяет создавать вложенные маршруты с передачей параметров от родительского к дочернему. Например:
const router = createRouter({
routes: [
{
path: '/dashboard/:userId',
component: DashboardLayout,
children: [
{
path: 'settings',
component: SettingsPage,
},
],
},
],
});
userId доступен как в
DashboardLayout, так и в SettingsPage.useParams, которая
объединяет параметры всех уровней вложенности.Программная навигация позволяет передавать параметры прямо при вызове
router.navigate:
router.navigate({
to: '/user/:userId',
params: { userId: '42' },
});
:userId на
значение из params.router.navigate({
to: '/user/:userId',
params: { userId: '42' },
search: { tab: 'profile' },
});
/user/42?tab=profile.TanStack Router позволяет задавать схемы валидации для параметров с
помощью библиотеки zod или собственного механизма:
import { z } from 'zod';
const userRoute = {
path: '/user/:userId',
component: UserPage,
paramsSchema: z.object({
userId: z.string().regex(/^\d+$/),
}),
};
userId должен быть числом в виде строки.Часто параметры маршрутов напрямую связывают с запросами к API:
function UserPage() {
const { userId } = useParams();
const { data, isLoading } = useQuery(['user', userId], () =>
fetch(`/api/users/${userId}`).then(res => res.json())
);
if (isLoading) return <div>Загрузка...</div>;
return <div>Имя пользователя: {data.name}</div>;
}
/:param.?key=value.router.navigate({ to, params, search }).Использование этих возможностей делает TanStack Router гибким инструментом для построения сложных SPA с управляемой и предсказуемой навигацией.