TanStack Router предоставляет мощные возможности для работы с
параметрами URL, включая query-параметры (search params).
Одной из ключевых функций является валидация этих
параметров, что позволяет гарантировать корректность данных до
того, как они будут использоваться в компоненте или логике маршрута.
Search params — это параметры, передаваемые в URL после знака
?. Например, в URL:
/products?category=books&page=2
category и page являются search params.
TanStack Router позволяет их типизировать и валидировать с помощью схем,
что особенно важно при работе с динамическими страницами, где
пользователь может вручную изменять URL.
Для валидации search params используется объект
searchSchema, в котором задаются правила и типы каждого
параметра. Пример:
import { z } from 'zod';
import { createRouter, route } from '@tanstack/router';
const productRoute = route({
path: '/products',
searchSchema: z.object({
category: z.string().optional(),
page: z.string().transform(Number).default('1'),
sort: z.enum(['asc', 'desc']).optional(),
}),
});
В этом примере:
category может быть строкой или отсутствовать.page по умолчанию равен "1", но
автоматически преобразуется в число.sort допускает только два значения: "asc"
или "desc".TanStack Router тесно интегрируется с библиотекой zod,
что позволяет автоматически преобразовывать строки из URL в
нужный тип. В примере выше параметр page из строки
"2" станет числом 2, что исключает
необходимость ручного преобразования в компонентах.
Если search param не соответствует схеме, TanStack Router по умолчанию не пропустит маршрут с некорректными параметрами. Можно задать обработчик ошибок:
const productRoute = route({
path: '/products',
searchSchema: z.object({
category: z.string().optional(),
page: z.string().transform(Number),
}),
onSearchParamError: (error, context) => {
console.error('Ошибка search param:', error);
context.router.navigate({ to: '/error' });
},
});
onSearchParamError получает объект ошибки и контекст
маршрутизатора, позволяя, например, перенаправлять пользователя на
страницу ошибки или показывать уведомление.
Search params могут иметь значения по умолчанию, что предотвращает ошибки при отсутствии параметра в URL:
searchSchema: z.object({
page: z.string().transform(Number).default('1'),
filter: z.string().optional().default('all'),
}),
При отсутствии page или filter в URL,
TanStack Router автоматически подставит указанные значения.
С помощью валидированной схемы легко генерировать корректные ссылки, не боясь ошибочного формата параметров:
router.navigate({
to: productRoute,
search: {
category: 'books',
page: 3,
},
});
Система автоматически проверит значения через
searchSchema и преобразует их, если требуется.
Внутри компонента можно безопасно получать валидированные параметры:
function ProductList() {
const { search } = useRouteLoader(productRoute);
const { category, page } = search;
// page уже число, category — строка или undefined
return (
<div>
<h1>Категория: {category ?? 'Все'}</h1>
<p>Страница: {page}</p>
</div>
);
}
Нет необходимости вручную проверять типы или обрабатывать неправильные значения — вся логика валидации вынесена в схему маршрута.
Можно создавать вложенные объекты и массивы в search params:
searchSchema: z.object({
filters: z.array(z.enum(['books', 'electronics'])).optional(),
range: z.object({
min: z.string().transform(Number).default('0'),
max: z.string().transform(Number).default('100'),
}).optional(),
}),
Это особенно удобно для страниц с многоуровневыми фильтрами, где каждый параметр требует строгой типизации.
Валидация search params в TanStack Router обеспечивает надежность и предсказуемость работы приложения. Схемы позволяют не только проверять значения, но и автоматически преобразовывать их, задавать дефолтные параметры и управлять ошибками без громоздкой ручной логики. Такой подход повышает безопасность маршрутизации и упрощает работу с динамическими URL.