Router в TanStack Router представляет собой центральный элемент управления маршрутизацией в приложении. Он отвечает за сопоставление URL с компонентами, управление историей навигации и передачу параметров между маршрутами. В отличие от классических роутеров, TanStack Router предоставляет более гибкую и декларативную систему, позволяющую создавать вложенные маршруты, динамические сегменты и асинхронные данные для маршрутов.
Router создается с помощью функции createRouter, которая
принимает объект конфигурации маршрутов:
import { createRouter } from '@tanstack/router'
const router = createRouter({
routes: [
{
path: '/',
component: HomePage,
},
{
path: '/about',
component: AboutPage,
},
],
})
Ключевые моменты:
path — строка URL маршрута. Поддерживаются динамические
сегменты (/users/:userId).component — React-компонент, который будет рендериться
при совпадении маршрута.TanStack Router позволяет определять параметры прямо в пути:
{
path: '/users/:userId',
component: UserProfile,
}
Параметры можно получить через хук useParams:
import { useParams } from '@tanstack/router'
function UserProfile() {
const params = useParams()
console.log(params.userId)
return <div>Профиль пользователя {params.userId}</div>
}
Важно: параметры маршрута всегда приводятся к строке. Если нужен числовой тип, необходимо преобразовать значение вручную.
Router поддерживает вложенные маршруты через свойство
children:
{
path: '/dashboard',
component: DashboardLayout,
children: [
{ path: 'stats', component: StatsPage },
{ path: 'settings', component: SettingsPage },
],
}
Для рендеринга дочерних маршрутов используется компонент
Outlet:
function DashboardLayout() {
return (
<div>
<Sidebar />
<Outlet />
</div>
)
}
Особенности:
TanStack Router позволяет асинхронно загружать данные на уровне
маршрута с помощью свойства loader:
{
path: '/posts/:postId',
component: PostPage,
loader: async ({ params }) => {
const response = await fetch(`/api/posts/${params.postId}`)
return response.json()
},
}
Данные, возвращаемые loader, можно получить через хук
useLoaderData:
import { useLoaderData } from '@tanstack/router'
function PostPage() {
const post = useLoaderData()
return <div>{post.title}</div>
}
Преимущества:
Router использует историю браузера для управления навигацией. Поддерживаются два режима:
browserHistory — стандартная история HTML5.memoryHistory — используется для тестов и серверного
рендеринга.Пример создания Router с history:
import { createBrowserHistory } from '@tanstack/router'
const router = createRouter({
history: createBrowserHistory(),
routes: [
{ path: '/', component: HomePage },
],
})
Для программной навигации применяется метод
router.navigate:
router.navigate({ to: '/about' })
Особенности:
loader и
хуками жизненного цикла маршрута.Router поддерживает обработку ошибок на уровне маршрута с помощью
свойства errorComponent:
{
path: '/posts/:postId',
component: PostPage,
loader: async ({ params }) => {
const response = await fetch(`/api/posts/${params.postId}`)
if (!response.ok) throw new Error('Post not found')
return response.json()
},
errorComponent: PostErrorPage,
}
Особенности:
errorComponent.TanStack Router предоставляет несколько хуков, которые позволяют контролировать поведение маршрутов:
onBeforeLoad — вызывается перед загрузкой
маршрута.onLoad — после успешной загрузки данных маршрута.onUnload — перед выходом с маршрута.Пример использования:
{
path: '/profile',
component: ProfilePage,
onBeforeLoad: ({ params }) => {
console.log('Перед загрузкой профиля', params)
},
onLoad: ({ loaderData }) => {
console.log('Профиль загружен', loaderData)
},
}
Эти хуки помогают управлять состоянием приложения, предварительно проверять права доступа и делать логирование навигации.
Компонент Router в TanStack Router — это мощный инструмент для построения современного SPA с полной поддержкой вложенных маршрутов, динамических сегментов, асинхронных данных и сложной навигации. Правильная настройка Router включает:
loader и errorComponent для
асинхронных сценариев.Такой подход делает архитектуру приложения предсказуемой, удобной для тестирования и расширяемой при росте проекта.