TanStack Router предоставляет гибкий способ управления маршрутизацией в приложениях на JavaScript, особенно при необходимости передавать состояние между маршрутами. В этой библиотеке состояние при навигации можно передавать через query parameters, state объект и dynamic params, что позволяет хранить данные без использования глобальных хранилищ или контекста.
state при переходеДля передачи данных между маршрутами можно использовать опцию
state в методах навигации, таких как
navigate:
import { useRouter } from '@tanstack/router';
const router = useRouter();
router.navigate({
to: '/profile',
search: {},
state: { fromDashboard: true, userId: 42 },
});
to – целевой маршрут.search – объект для query-параметров
(опционально).state – объект состояния, который будет доступен на
целевом маршруте.На маршруте /profile доступ к переданному состоянию
осуществляется через useLocation:
import { useLocation } from '@tanstack/router';
const location = useLocation();
console.log(location.state); // { fromDashboard: true, userId: 42 }
Особенности использования state:
state
теряется, поэтому для данных, которые должны
сохраняться между перезагрузками, лучше использовать query-параметры или
глобальное хранилище.Query-параметры позволяют передавать небольшие данные, которые должны оставаться видимыми в URL. TanStack Router обеспечивает их типизацию и автоматическое извлечение.
Пример передачи query-параметров при навигации:
router.navigate({
to: '/search',
search: { q: 'TanStack Router', page: 2 },
});
На целевом маршруте параметры доступны через
useSearch:
import { useSearch } from '@tanstack/router';
const searchParams = useSearch();
console.log(searchParams.q); // 'TanStack Router'
console.log(searchParams.page); // 2
Преимущества использования query-параметров:
Dynamic params – это сегменты пути, которые задаются двоеточием в определении маршрута:
import { createRouteConfig } from '@tanstack/router';
const profileRoute = createRouteConfig({
path: '/profile/:userId',
});
Переход к маршруту с динамическим параметром:
router.navigate({
to: '/profile/42',
state: { fromDashboard: true },
});
На целевом маршруте доступ к userId обеспечивается через
useParams, а к state через
useLocation:
import { useParams, useLocation } from '@tanstack/router';
const params = useParams();
const location = useLocation();
console.log(params.userId); // '42'
console.log(location.state.fromDashboard); // true
Комбинация dynamic params и state позволяет передавать идентификаторы ресурсов в URL и дополнительную мета-информацию в памяти приложения, что особенно удобно при построении SPA с детальными переходами.
TanStack Router автоматически сохраняет историю переходов и позволяет
корректно восстанавливать состояние при возврате на предыдущий маршрут.
Если state был передан при навигации, оно останется
доступным через объект location.state, пока пользователь не
закроет вкладку или не обновит страницу.
Пример проверки при возврате на предыдущую страницу:
import { useLocation } from '@tanstack/router';
import { useEffect } from 'react';
const Dashboard = () => {
const location = useLocation();
useEffect(() => {
if (location.state?.fromProfile) {
console.log('Вернулись с профиля');
}
}, [location]);
return <div>Главная панель</div>;
};
state.state для
хранения мета-данных.state — это может замедлить работу браузера и усложнить
отладку.const router = createRouter({
routes: [
{
path: '/',
component: HomePage,
},
{
path: '/profile/:userId',
component: ProfilePage,
},
{
path: '/search',
component: SearchPage,
},
],
});
Навигация с состоянием и query-параметрами:
router.navigate({
to: '/search',
search: { q: 'router tutorial' },
state: { source: 'homepage' },
});
На странице SearchPage одновременно доступны:
const search = useSearch(); // { q: 'router tutorial' }
const state = useLocation().state; // { source: 'homepage' }
Такое сочетание позволяет строить сложные пользовательские сценарии, сохраняя при этом чистоту маршрутов и контроль над состоянием.