Глобальный контекст приложения в TanStack Router играет ключевую роль в организации состояния и логики, доступной на уровне всего маршрутизатора. Он обеспечивает централизованное хранение данных и методов, которые могут понадобиться различным маршрутам и компонентам, без необходимости их передачи через пропсы на каждом уровне.
В TanStack Router глобальный контекст определяется с помощью объекта
createRouterContext или через опцию context
при инициализации маршрутизатора. Он позволяет передавать произвольные
данные, функции и состояния, которые будут доступны всем маршрутам.
Пример создания глобального контекста:
import { createRouter, RouterProvider } from '@tanstack/router';
import { createContext, useContext } from 'react';
const AppContext = createContext();
const router = createRouter({
context: AppContext,
routes: [
{
path: '/',
component: HomePage,
},
{
path: '/profile',
component: ProfilePage,
},
],
});
function App() {
const globalState = {
user: { name: 'Alice', role: 'admin' },
isAuthenticated: true,
logout: () => { /* реализация выхода */ },
};
return (
<AppContext.Provider value={globalState}>
<RouterProvider router={router} />
</AppContext.Provider>
);
}
В этом примере создаётся контекст AppContext, который
содержит глобальные данные user,
isAuthenticated и функцию logout. Любой
компонент маршрута может получить доступ к этим данным через
useContext(AppContext).
TanStack Router интегрируется с React-контекстами, что позволяет легко использовать глобальный контекст внутри компонентов маршрутов:
import { useContext } from 'react';
function ProfilePage() {
const { user, logout } = useContext(AppContext);
return (
<div>
<h1>Профиль: {user.name}</h1>
<button onCl ick={logout}>Выйти</button>
</div>
);
}
Здесь ProfilePage напрямую использует данные из
глобального контекста, без необходимости получать их через пропсы от
родительских компонентов. Это позволяет уменьшить связность компонентов
и упростить поддержку приложения.
Глобальный контекст может содержать состояния, которые обновляются
динамически с помощью хуков, например useState или
useReducer. Это позволяет маршрутам автоматически
реагировать на изменения состояния.
function App() {
const [user, setUser] = useState({ name: 'Alice', role: 'admin' });
const globalState = {
user,
updateUser: setUser,
};
return (
<AppContext.Provider value={globalState}>
<RouterProvider router={router} />
</AppContext.Provider>
);
}
function HomePage() {
const { user, updateUser } = useContext(AppContext);
const changeName = () => {
updateUser({ ...user, name: 'Bob' });
};
return (
<div>
<h1>Добро пожаловать, {user.name}</h1>
<button onCl ick={changeName}>Сменить имя</button>
</div>
);
}
Любые изменения состояния user будут автоматически
доступны всем компонентам, использующим этот контекст, что обеспечивает
согласованность данных по всему приложению.
TanStack Router предоставляет специальные хуки, такие как
useRouterContext или useRouteContext, которые
упрощают доступ к контексту маршрутизатора и его глобальным данным. Эти
хуки позволяют не импортировать контекст напрямую, сохраняя гибкость
архитектуры.
import { useRouterContext } from '@tanstack/router';
function Dashboard() {
const routerContext = useRouterContext();
const { user } = routerContext;
return <div>Панель пользователя: {user.name}</div>;
}
Использование встроенных хуков делает код более декларативным и интегрированным с самим маршрутизатором, упрощая управление состоянием приложения и маршрутов одновременно.
Глобальный контекст TanStack Router обеспечивает мощный механизм для централизованного управления состоянием, интегрированного с маршрутизатором, что упрощает архитектуру больших приложений и делает код более поддерживаемым.