TanStack Router предоставляет мощный механизм управления состоянием маршрутов через контексты, которые позволяют передавать данные между разными уровнями маршрутов без необходимости пробрасывать их через пропсы. Контексты особенно полезны для реализации глобальных данных, таких как пользовательская сессия, настройки интерфейса или состояние авторизации.
Контекст в TanStack Router создаётся через функцию
createContext, которая возвращает объект с методами
useContext и Provider. Пример создания:
import { createContext } from '@tanstack/router';
const AuthContext = createContext({
token: null,
setToken: () => {},
});
В данном примере создаётся контекст авторизации с токеном и функцией для его изменения.
Ключевые моменты:
setToken)
рекомендуется инкапсулировать внутри контекста для сохранения
единообразия и предсказуемости.Контекст предоставляется маршрутам через компонент
Provider:
import { RouterProvider, createRouter, createRoute } from '@tanstack/router';
const router = createRouter({
routeTree: createRoute({
path: '/',
component: RootComponent,
context: AuthContext.Provider,
}),
});
Внутри RootComponent все дочерние маршруты могут
использовать контекст через useContext:
import { useContext } from '@tanstack/router';
function Header() {
const { token, setToken } = useContext(AuthContext);
return (
{token ? 'Вы вошли в систему' : 'Гость'}
);
}
Рекомендации:
TanStack Router позволяет интегрировать контексты с загрузкой данных для маршрута, что упрощает работу с асинхронными данными:
const UserContext = createContext({ user: null });
const userRoute = createRoute({
path: '/user',
loader: async () => {
const response = await fetch('/api/user');
return response.json();
},
context: ({ loaderData }) => ({
user: loaderData,
}),
});
context получает loaderData
маршрута, что позволяет сразу передавать загруженные данные в
контекст.Контекст TanStack Router тесно интегрирован с реактивностью
компонентов. Любое изменение состояния внутри контекста автоматически
вызывает перерендеринг дочерних компонентов, использующих
useContext.
Лучшие практики управления состоянием:
useMemo и useCallback для
функций в контексте, чтобы предотвратить пересоздание функций на каждом
рендере.useReducer, что упрощает управление сложными изменениями
данных.В крупных приложениях часто требуется использовать несколько контекстов одновременно. TanStack Router поддерживает вложенные контексты:
Рекомендации:
loaderData совместно с контекстом для
уменьшения количества запросов и централизованного хранения данных.