TanStack Router предоставляет гибкую систему маршрутизации в
JavaScript, позволяя управлять URL, состоянием приложения и параметрами
маршрутов. Одной из важных возможностей является работа с
параметрами хеша — фрагментом URL после символа
#. Параметры хеша позволяют хранить состояние интерфейса,
выполнять навигацию без перезагрузки страницы и интегрироваться с
браузерной историей.
В TanStack Router хеш доступен через объект
location или напрямую через хуки
маршрутизатора. Пример стандартного URL с хешем:
https://example.com/dashboard#section=profile&tab=settings
# — начало хеша.&.ключ=значение.Внутри TanStack Router хеш обрабатывается как отдельный источник состояния маршрута. Основное преимущество — возможность управлять интерфейсом без изменения основной части URL, что особенно полезно для одностраничных приложений (SPA).
Для извлечения параметров хеша используется хук
useSearch или прямой доступ через объект
router.state.location.hash. Пример с хуком:
import { useRouter } from '@tanstack/router';
function SectionViewer() {
const router = useRouter();
const hash = router.state.location.hash; // "#section=profile&tab=settings"
const params = Object.fromEntries(
new URLSearchParams(hash.replace(/^#/, ''))
);
console.log(params); // { section: "profile", tab: "settings" }
}
Ключевые моменты:
# удаляется перед обработкой.URLSearchParams позволяет преобразовать строку хеша в
объект с ключами и значениями.Изменение параметров хеша выполняется через методы маршрутизатора:
router.navigate({
hash: '#section=notifications&tab=activity'
});
Важные особенности:
Часто требуется менять только один параметр хеша, сохраняя остальные:
const updateHashParam = (key, value) => {
const hashParams = new URLSearchParams(router.state.location.hash.replace(/^#/, ''));
hashParams.set(key, value);
router.navigate({ hash: `#${hashParams.toString()}` });
};
updateHashParam('tab', 'settings');
Пояснение:
set изменяет или добавляет новый ключ.navigate обновляет URL без перезагрузки
страницы.Для реакции на изменения хеша используется подписка на состояние маршрутизатора:
import { useEffect } from 'react';
import { useRouter } from '@tanstack/router';
function HashWatcher() {
const router = useRouter();
useEffect(() => {
const unsubscribe = router.subscribe(({ location }) => {
const hash = location.hash.replace(/^#/, '');
console.log('Хеш изменён:', hash);
});
return () => unsubscribe();
}, [router]);
}
Хеш-параметры часто применяются для управления вкладками, аккордеонами или фильтрами:
function TabManager() {
const router = useRouter();
const hashParams = Object.fromEntries(
new URLSearchParams(router.state.location.hash.replace(/^#/, ''))
);
const activeTab = hashParams.tab || 'overview';
const setTab = (tab) => {
const params = new URLSearchParams(router.state.location.hash.replace(/^#/, ''));
params.set('tab', tab);
router.navigate({ hash: `#${params.toString()}` });
};
return (
Активная вкладка: {activeTab}
);
}
URLSearchParams для безопасного
парсинга и формирования хеша.router.subscribe для централизованного
слежения за хешем при сложных интерфейсах.