В TanStack Router валидация параметров маршрута осуществляется на уровне определения маршрута. Это позволяет строго контролировать типы и формат данных, поступающих в компоненты, и предотвращает ошибки на раннем этапе навигации. Валидация осуществляется с использованием схем и проверок типов, что особенно важно при работе с динамическими сегментами URL.
При создании маршрута можно задать параметры, которые будут использоваться в URL. Для каждого параметра можно определить тип и ограничить допустимые значения:
import { createRouter, createRoute } from '@tanstack/router';
const userRoute = createRoute({
path: '/user/:userId',
validate: {
userId: (value) => {
const id = Number(value);
if (Number.isNaN(id) || id <= 0) {
throw new Error('Invalid userId');
}
return id;
}
},
component: UserComponent,
});
Ключевые моменты:
validate принимает объект, где ключи — это имена
параметров маршрута, а значения — функции проверки.Для маршрутов с несколькими динамическими сегментами можно задать независимые проверки для каждого параметра:
const postRoute = createRoute({
path: '/user/:userId/post/:postId',
validate: {
userId: (value) => {
const id = Number(value);
if (Number.isNaN(id) || id <= 0) throw new Error('Invalid userId');
return id;
},
postId: (value) => {
const id = Number(value);
if (Number.isNaN(id) || id <= 0) throw new Error('Invalid postId');
return id;
},
},
component: PostComponent,
});
Функции валидации выполняются при переходе на маршрут, и ошибки автоматически блокируют навигацию, предотвращая рендеринг компонента с некорректными данными.
TanStack Router также поддерживает проверку query-параметров через схему в маршруте:
const searchRoute = createRoute({
path: '/search',
validateSearch: (query) => {
const page = Number(query.page || 1);
if (Number.isNaN(page) || page < 1) throw new Error('Invalid page number');
return { page };
},
component: SearchComponent,
});
Особенности:
validateSearch обрабатывает объект
query-параметров.Для более сложных правил часто используют библиотеки схем, например
zod или yup:
import { z } from 'zod';
const schema = z.object({
userId: z.number().positive(),
postId: z.number().positive(),
});
const postRoute = createRoute({
path: '/user/:userId/post/:postId',
validate: (params) => schema.parse({
userId: Number(params.userId),
postId: Number(params.postId),
}),
component: PostComponent,
});
Преимущества использования схем:
TanStack Router предоставляет механизм глобальной и локальной обработки ошибок, возникающих при валидации:
const router = createRouter({
routes: [userRoute, postRoute],
onError: (error) => {
console.error('Navigation error:', error.message);
// Можно перенаправить на страницу ошибки
router.navigate('/error');
},
});
Рекомендации:
useRouteError.Для вложенных маршрутов валидация параметров распространяется рекурсивно:
const appRoute = createRoute({ path: '/', component: AppLayout });
const userSettingsRoute = createRoute({
path: 'user/:userId/settings',
parent: appRoute,
validate: {
userId: (value) => Number(value),
},
component: UserSettings,
});
zod,
yup) вместо ручного кода.