TanStack Router предоставляет гибкий и мощный механизм управления
историей навигации, позволяя точно контролировать переходы между
страницами и состояние приложения. История в TanStack Router основана на
концепции history objects, которые могут быть браузерными,
памятью или кастомными. Основные методы для управления историей включают
navigate, go, back,
forward и replace.
navigateМетод navigate используется для программного перехода на
другой маршрут. Его синтаксис:
router.navigate({
to: '/users/42',
replace: false,
params: { id: 42 },
search: { filter: 'active' }
});
Ключевые моменты:
to — путь маршрута или объект маршрута.replace — если true, переход заменяет
текущую запись в истории, не создавая новую.params — динамические параметры маршрута.search — параметры query string, передаваемые в
URL.back и
forwardback и forward предоставляют доступ к стеку
истории браузера, аналогично стандартным
window.history.back() и
window.history.forward(). Используются для навигации в
пределах истории без явного указания маршрута:
router.back(); // Переход на предыдущую страницу
router.forward(); // Переход на следующую страницу
Эти методы полезны при реализации кнопок “Назад” и “Вперед” в пользовательском интерфейсе.
goМетод go позволяет перемещаться по истории на
определённое количество шагов:
router.history.go(-2); // Возврат на две страницы назад
router.history.go(3); // Переход на три страницы вперёд
Особенности использования:
replaceИспользование replace в navigate позволяет
обновлять URL без добавления новой записи в историю. Это важно для
страниц с динамическими параметрами или фильтрами, когда не нужно
создавать новые шаги в истории при каждом изменении состояния:
router.navigate({
to: '/search',
replace: true,
search: { query: 'javascript' }
});
Это предотвращает накопление избыточных записей в истории и обеспечивает более предсказуемое поведение кнопки “Назад”.
TanStack Router позволяет сохранять произвольное состояние для
каждого шага истории, аналогично history.state в
браузере:
router.navigate({
to: '/profile',
state: { scrollPosition: 300 }
});
Доступ к state осуществляется через объект router.state
или через хуки маршрута:
const state = router.state;
console.log(state.scrollPosition); // 300
Использование состояния полезно для сохранения данных интерфейса, таких как позиции прокрутки или состояние фильтров при возврате на предыдущие страницы.
TanStack Router предоставляет подписку на события изменения истории:
router.subscribe(({ location, action }) => {
console.log(action, location.pathname);
});
Параметры:
location — текущий объект маршрута, включая путь,
параметры и query.action — тип действия: push,
replace, pop.Это позволяет отслеживать все изменения навигации, реализовывать аналитические события и управлять анимацией переходов.
При работе с асинхронными операциями важно корректно синхронизировать изменения истории. Например, после успешной загрузки данных:
async function submitForm(data) {
await api.save(data);
router.navigate({ to: '/success', replace: true });
}
Использование replace предотвращает лишние записи в
истории, если пользователь часто отправляет формы.
Программная навигация легко комбинируется с элементами UI:
<button onCl ick={() => router.back()}>Назад</button>
<button onCl ick={() => router.forward()}>Вперед</button>
<button onCl ick={() => router.navigate({ to: '/dashboard' })}>На главную</button>
Эта гибкость позволяет создавать полноценные интерфейсы навигации, полностью управляемые состоянием маршрутизатора.
TanStack Router поддерживает хуки beforeUnload и
beforeNavigate, которые позволяют предотвратить переход при
определённых условиях:
router.beforeNavigate(({ cancel, next }) => {
if (!formSaved) {
cancel();
}
});
Это особенно полезно для защиты форм и критичных данных от случайного ухода пользователя со страницы.
TanStack Router может работать с любыми объектами истории,
совместимыми с history API. Это позволяет интегрировать
роутер с серверным рендерингом, React Native или Electron, обеспечивая
единое управление навигацией во всех окружениях:
import { createMemoryHistory } from 'history';
const memoryHistory = createMemoryHistory();
const router = new Router({ history: memoryHistory });
Использование памяти вместо браузерной истории позволяет тестировать и управлять навигацией вне стандартного браузера.
Эта архитектура истории делает TanStack Router мощным инструментом для построения приложений с динамическими маршрутами, гибкой навигацией и контролем состояния при переходах.