Loader API — это механизм асинхронной загрузки данных для маршрутов, встроенный в TanStack Router. Он позволяет заранее получать данные до того, как компонент маршрута будет отрендерен, что обеспечивает более предсказуемое поведение приложений и упрощает управление состоянием загрузки.
Loader — это функция, привязанная к маршруту, которая выполняется при переходе на этот маршрут. Она может возвращать данные напрямую или промис, что делает её полностью совместимой с асинхронными операциями:
const route = {
path: '/user/:id',
loader: async ({ params }) => {
const response = await fetch(`/api/users/${params.id}`);
if (!response.ok) throw new Error('User not found');
return response.json();
},
component: UserComponent
};
Ключевые моменты:
params) и другими данными маршрута.ErrorBoundary или
глобальные обработчики маршрутов.useLoaderData.useLoaderDataПосле того как loader возвращает данные, компонент маршрута может получить их через хук:
import { useLoaderData } from '@tanstack/router';
function UserComponent() {
const user = useLoaderData();
return (
<div>
<h1>{user.name}</h1>
<p>Email: {user.email}</p>
</div>
);
}
Особенности:
Loader может получать дополнительный контекст через объект
context при конфигурации маршрутизатора. Это удобно для
передачи глобальных сервисов, таких как API-клиенты:
const router = createRouter({
context: {
apiClient: new ApiClient()
},
routes: [
{
path: '/posts/:id',
loader: async ({ params, context }) => {
return await context.apiClient.fetchPost(params.id);
},
component: PostComponent
}
]
});
context позволяет разделять логику
загрузки данных и конфигурацию API.Loader API тесно интегрирован с системой маршрутов для управления ошибками и состоянием загрузки:
Пример использования ErrorBoundary:
const route = {
path: '/user/:id',
loader: async ({ params }) => {
const res = await fetch(`/api/users/${params.id}`);
if (!res.ok) throw new Error('User not found');
return res.json();
},
component: UserComponent,
errorComponent: UserErrorComponent
};
Loader API особенно полезен для вложенных маршрутов. Каждый маршрут может иметь свой loader, и TanStack Router обеспечивает правильную последовательность загрузки данных:
const routes = [
{
path: '/dashboard',
loader: fetchDashboard,
children: [
{
path: 'stats',
loader: fetchStats,
component: StatsComponent
},
{
path: 'reports',
loader: fetchReports,
component: ReportsComponent
}
]
}
];
Loader API можно использовать совместно с Suspense и TanStack Query для более продвинутой работы с данными:
const route = {
path: '/todos',
loader: async () => {
return queryClient.fetchQuery(['todos'], fetchTodos);
},
component: TodosComponent
};
Loader API позволяет работать с query-параметрами:
const route = {
path: '/search',
loader: async ({ search }) => {
const query = search.get('q') || '';
return fetch(`/api/search?q=${query}`).then(res => res.json());
},
component: SearchComponent
};
search — объект URLSearchParams,
предоставляемый TanStack Router.Loader API в TanStack Router обеспечивает мощный и гибкий инструмент для управления асинхронными данными в маршрутах, минимизируя необходимость ручного управления состояниями загрузки, ошибок и кэширования. Это делает архитектуру приложения более чистой, предсказуемой и легко масштабируемой.