В TanStack Router корневой маршрут является основой всей
маршрутизации приложения. Он задаёт структуру, от которой строятся все
дочерние маршруты, и определяет базовую конфигурацию навигации. Обычно
корневой маршрут не содержит конкретного пути (или задаётся как
'/'), но служит контейнером для вложенных маршрутов и общих
компонентов, таких как layout, контекст или обработчики ошибок.
Корневой маршрут создаётся с помощью функции createRoute
или createRootRoute в зависимости от версии библиотеки.
Важно указать ключевые свойства:
'/'.Пример базового корневого маршрута:
import { createRootRoute } from '@tanstack/router';
import AppLayout from './layouts/AppLayout';
export const rootRoute = createRootRoute({
path: '/',
component: AppLayout,
children: [],
errorComponent: () => <div>Произошла ошибка</div>,
});
Здесь AppLayout обычно содержит общие элементы
интерфейса, такие как шапка, боковое меню или футер.
Все дочерние маршруты корневого маршрута автоматически наследуют свойства родителя, если они явно не переопределены:
Пример вложенных маршрутов:
import { createRoute } from '@tanstack/router';
import HomePage from './pages/HomePage';
import ProfilePage from './pages/ProfilePage';
export const homeRoute = createRoute({
path: '/',
component: HomePage,
});
export const profileRoute = createRoute({
path: '/profile',
component: ProfilePage,
});
rootRoute.children = [homeRoute, profileRoute];
В этом примере HomePage и ProfilePage
рендерятся внутри компонента AppLayout благодаря
наследованию layout.
Корневой маршрут позволяет централизованно загружать данные, которые
нужны на большинстве страниц. Функция loader выполняется до
рендера компонента и может возвращать промис с данными:
export const rootRoute = createRootRoute({
path: '/',
component: AppLayout,
loader: async () => {
const user = await fetch('/api/current-user').then(res => res.json());
return { user };
},
});
Эти данные доступны в дочерних маршрутах через хук
useLoaderData():
import { useLoaderData } from '@tanstack/router';
function ProfilePage() {
const { user } = useLoaderData();
return <div>Привет, {user.name}</div>;
}
Корневой маршрут может содержать глобальный
errorComponent, который перехватывает ошибки всех вложенных
маршрутов. Это особенно важно для предотвращения падения всего
приложения при сбое отдельного компонента или загрузки данных.
Пример использования:
export const rootRoute = createRootRoute({
path: '/',
component: AppLayout,
errorComponent: ({ error }) => (
<div>Ошибка приложения: {error.message}</div>
),
});
Если дочерний маршрут вызовет ошибку, она будет поймана на уровне
корня и отображена через errorComponent.
Корневой маршрут также задаёт базовый путь для построения всех ссылок в приложении. В TanStack Router используется система именованных маршрутов, что позволяет ссылаться на маршруты по ключу, а не по строковому пути. Это повышает стабильность навигации при изменении URL:
import { useNavigate } from '@tanstack/router';
function Header() {
const navigate = useNavigate();
return <button onCl ick={() => navigate({ to: 'homeRoute' })}>Главная</button>;
}
В этом случае homeRoute – это ключ дочернего маршрута
корневого.
Корневой маршрут часто используется для определения layout приложения. В TanStack Router layout может быть вложенным: корневой маршрут задаёт глобальный layout, а дочерние маршруты могут добавлять свои специфические layout-компоненты. При рендеринге компонента маршрута TanStack Router автоматически объединяет все layout-уровни.
function AppLayout({ children }) {
return (
<div>
<Header />
<main>{children}</main>
<Footer />
</div>
);
}
Каждый дочерний маршрут вставляется в {children}, что
создаёт единый визуальный каркас приложения.
loader на корне позволяет делить данные
между всеми страницами.errorComponent обеспечивает централизованную
обработку ошибок.Корневой маршрут является не просто контейнером, а фундаментом, на котором строится маршрутизация, layout и логика данных для всего приложения TanStack Router.