Router Context в TanStack Router — это ключевой
элемент, обеспечивающий доступ к состоянию маршрутизатора и его функциям
на любом уровне компонента. Он создаёт единый источник правды для
маршрутов, позволяя компонентам реагировать на изменения URL, управлять
навигацией и работать с параметрами маршрутов. Контекст создаётся
автоматически при инициализации маршрутизатора через
<RouterProvider> и распространяется по всему дереву
React-компонентов.
Чтобы использовать Router Context, необходимо создать экземпляр маршрутизатора:
import { createRouter, RouterProvider } from '@tanstack/router'
const router = createRouter({
// определение маршрутов
})
Далее маршрутизатор оборачивается в провайдер:
<RouterProvider router={router}>
<App />
</RouterProvider>
RouterProvider автоматически создаёт контекст, доступный
через хуки и компонентные API TanStack Router. Это позволяет любому
компоненту внутри <RouterProvider> получать
актуальные данные маршрутизатора, такие как текущий путь, параметры,
состояние загрузки и т.д.
Доступ к текущему маршруту Контекст хранит объект текущего маршрута, который содержит:
pathname — текущий путь URL;params — параметры маршрута, извлечённые из URL;search — строка запроса;hash — хеш URL.Пример использования в компоненте:
import { useRouter } from '@tanstack/router'
function CurrentRouteInfo() {
const router = useRouter()
return (
<div>
<p>Текущий путь: {router.state.location.pathname}</p>
<p>Параметры: {JSON.stringify(router.state.params)}</p>
</div>
)
}
Навигация через контекст Router Context предоставляет методы для программной навигации:
router.navigate('/new-path') — переход на новый
путь;router.history.back() — возврат на предыдущий
маршрут;router.history.forward() — переход вперёд в
истории.Пример программной навигации:
function GoHomeButton() {
const router = useRouter()
return <button onCl ick={() => router.navigate('/')}>На главную</button>
}
loader или
action. Доступ к состоянию позволяет компонентам отображать
индикаторы загрузки или ошибки:const { isLoading, error } = useRouter()
if (isLoading) return <div>Загрузка...</div>
if (error) return <div>Ошибка: {error.message}</div>
Контекст маршрутизатора автоматически распространяется на все дочерние компоненты, что исключает необходимость передавать состояние вручную через пропсы. Любой компонент может подписаться на изменения маршрута, параметры или состояние асинхронных данных:
import { useMatch } from '@tanstack/router'
function UserProfile() {
const match = useMatch('/users/:userId')
return <div>Пользователь: {match.params.userId}</div>
}
Использование useMatch позволяет компоненту реагировать
только на изменения конкретного маршрута, что снижает количество лишних
рендеров и повышает производительность.
TanStack Router допускает расширение Router Context собственными контекстами. Это полезно, если необходимо хранить состояние, связанное с маршрутом, без глобальных стореджей:
import { createContext, useContext } from 'react'
const UserContext = createContext(null)
function UserProvider({ children, user }) {
return <UserContext.Provider value={user}>{children}</UserContext.Provider>
}
function UserInfo() {
const user = useContext(UserContext)
return <div>Имя пользователя: {user.name}</div>
}
Комбинирование собственного контекста с Router Context позволяет создавать сложные маршрутизируемые приложения с минимальной связностью компонентов.
useRouter, useMatch, useParams
обеспечивают удобный доступ к контексту.loader и action напрямую интегрируются в
контекст.Router Context является фундаментальным инструментом TanStack Router, обеспечивая единое и реактивное управление маршрутизацией и асинхронными данными на всём уровне приложения.