В TanStack Router обновление данных и состояния маршрутов управляется через стратегии обновления, которые определяют, когда и какие части маршрута должны перерендериваться или повторно загружаться. Эти стратегии позволяют оптимизировать производительность приложения, уменьшить лишние запросы к серверу и повысить отзывчивость интерфейса.
Ключевое различие TanStack Router по сравнению с другими роутерами заключается в том, что каждый маршрут может иметь свои собственные правила обновления, которые задаются при объявлении маршрута или динамически в процессе работы приложения.
always — всегда
обновлятьСтратегия always гарантирует, что при каждом переходе по
маршруту будет выполнено обновление всех связанных данных. Это полезно
для маршрутов, где информация часто изменяется или должна быть свежей
при каждом отображении.
Пример настройки маршрута с этой стратегией:
const userRoute = router.createRoute({
path: '/user/:id',
loader: async ({ params }) => fetch(`/api/users/${params.id}`).then(res => res.json()),
updateStrategy: 'always',
});
Особенности:
loader.never —
никогда не обновлятьСтратегия never предотвращает автоматическое обновление
маршрута при навигации. Данные загружаются только один раз при первой
активации маршрута.
Пример:
const settingsRoute = router.createRoute({
path: '/settings',
loader: async () => fetch('/api/settings').then(res => res.json()),
updateStrategy: 'never',
});
Особенности:
default — обновление при изменении
параметровСтратегия default активирует обновление маршрута только
тогда, когда изменяются параметры маршрута или ключевые
состояния. Это оптимальный вариант для большинства маршрутов,
где данные зависят от params или
searchParams.
Пример:
const postRoute = router.createRoute({
path: '/post/:postId',
loader: async ({ params }) => fetch(`/api/posts/${params.postId}`).then(res => res.json()),
updateStrategy: 'default',
});
Особенности:
postId, повторный loader не вызывается.TanStack Router поддерживает иерархию маршрутов, где каждый маршрут может наследовать стратегию обновления от родителя или иметь собственную. Вложенные маршруты могут перерендериваться независимо, что позволяет точечно обновлять интерфейс без полной перезагрузки страницы.
Пример:
const dashboardRoute = router.createRoute({
path: '/dashboard',
children: [
{
path: 'stats',
loader: async () => fetch('/api/stats').then(res => res.json()),
updateStrategy: 'always',
},
{
path: 'profile',
loader: async () => fetch('/api/profile').then(res => res.json()),
updateStrategy: 'default',
},
],
});
Здесь stats обновляется всегда, независимо от
родительского маршрута, а profile обновляется только при
изменении параметров.
TanStack Router позволяет изменять стратегию обновления во время работы приложения через API маршрута. Это удобно, если нужно временно форсировать загрузку данных или кэшировать информацию на период сессии пользователя.
Пример:
userRoute.setUpdateStrategy('always');
После вызова все последующие переходы по маршруту
userRoute будут использовать стратегию always,
независимо от изначальной конфигурации.
loaderСтратегии обновления напрямую связаны с кэшированием данных в
loader. При стратегии never результат
loader кэшируется и переиспользуется. Стратегия
default вызывает повторный loader только при
изменении зависимостей. always игнорирует кэш и
принудительно перезапрашивает данные.
Особенности реализации:
loader получает контекст с параметрами
маршрута.suspense или
react-query для управления состоянием загрузки и
ошибок.always для страниц с динамическими, часто
обновляющимися данными.never хорошо подходит для статических страниц, настроек
или справочной информации.default — оптимальный выбор для страниц с
параметризованными данными, где не требуется постоянная
перезагрузка.