В TanStack Router loader-функции предназначены для предзагрузки данных перед рендерингом маршрута. Они позволяют получить данные асинхронно и передать их компоненту маршрута, обеспечивая согласованное управление состоянием загрузки и данных. Понимание параметров, которые передаются в loader-функции, критично для правильной работы маршрутизатора.
Каждый вызов loader-функции получает один объект context, который содержит набор ключевых свойств, предоставляющих доступ к параметрам маршрута, навигации и текущему состоянию роутера:
type LoaderContext = {
params: Record<string, string>;
search: URLSearchParams;
location: Location;
navigate: (to: string, options?: { replace?: boolean }) => void;
router: Router;
preload: (to: string) => void;
};
paramsparams — объект с динамическими параметрами маршрута.
Эти параметры задаются в пути маршрута через двоеточие (:)
и автоматически извлекаются из URL.
Пример:
const userLoader: LoaderFunction = ({ params }) => {
const { userId } = params;
return fetch(`/api/users/${userId}`).then(res => res.json());
};
searchsearch предоставляет объект
URLSearchParams, который позволяет работать с
query-параметрами.
const productsLoader: LoaderFunction = ({ search }) => {
const category = search.get('category') ?? 'all';
return fetch(`/api/products?category=${category}`).then(res => res.json());
};
get возвращает значение параметра или
null, если он отсутствует.has, entries, keys и
values помогают обрабатывать несколько параметров.locationlocation — объект, описывающий текущий URL, аналогичный
объекту window.location, но в более безопасной форме для
реактивного роутинга.
const loader: LoaderFunction = ({ location }) => {
console.log(location.pathname, location.search);
};
pathname — путь URL без query и хеша.search — строка query-параметров, включая знак
?.hash — часть URL после #.navigatenavigate — функция для программной навигации внутри
loader. Она полезна, если загрузка данных выявляет необходимость
редиректа.
const loader: LoaderFunction = async ({ navigate, params }) => {
const response = await fetch(`/api/items/${params.id}`);
if (!response.ok) {
navigate('/error', { replace: true });
return null;
}
return response.json();
};
replace: true предотвращает создание новой записи в
истории браузера, заменяя текущую.routerrouter предоставляет полный доступ к экземпляру
роутера:
preload.const loader: LoaderFunction = ({ router }) => {
router.preload('/dashboard');
};
preloadpreload используется для оптимизации пользовательского
опыта: заранее загружает данные маршрута, не меняя URL.
const loader: LoaderFunction = ({ preload }) => {
preload('/notifications');
};
Loader-функции могут быть асинхронными. Если запрос данных завершается ошибкой, роутер предоставляет механизмы её обработки:
const loader: LoaderFunction = async ({ params }) => {
try {
const response = await fetch(`/api/users/${params.userId}`);
if (!response.ok) throw new Error('Пользователь не найден');
return response.json();
} catch (error) {
throw new Response('Ошибка загрузки данных', { status: 500 });
}
};
errorElement
маршрута.Response.params и результата loader, чтобы избежать ошибок на этапе
компиляции.preload для загрузки данных для будущих переходов, снижая
задержки рендеринга.Понимание и корректное использование всех параметров loader-функций позволяет создавать приложения на TanStack Router с надежной загрузкой данных, точной навигацией и предсказуемым поведением компонентов.