useSearch — это хук, предоставляемый TanStack Router, который позволяет удобно работать с параметрами запроса (query parameters) в URL. Он обеспечивает синхронизацию состояния приложения с адресной строкой и упрощает управление динамическими фильтрами, сортировками и другими данными, передаваемыми через URL.
Хук useSearch возвращает объект, содержащий текущие
значения query-параметров, и функции для их обновления. Он
позволяет:
Синтаксис базового использования:
import { useSearch } from '@tanstack/router';
const Component = () => {
const [search, setSearch] = useSearch({ initialValues: { page: 1, sort: 'asc' } });
// чтение параметров
console.log(search.page, search.sort);
// обновление параметров
const goToNextPage = () => setSearch({ page: search.page + 1 });
};
Одним из ключевых преимуществ TanStack Router является возможность строгой типизации query-параметров. Это снижает вероятность ошибок при работе с URL и позволяет TypeScript автоматически подсказывать доступные параметры.
Пример строгой типизации:
type SearchParams = {
page: number;
filter: string;
sort: 'asc' | 'desc';
};
const [search, setSearch] = useSearch<SearchParams>({
initialValues: { page: 1, filter: '', sort: 'asc' },
});
В этом примере TypeScript гарантирует, что:
page всегда число.sort может принимать только 'asc' или
'desc'.useSearch позволяет задавать начальные значения через
объект initialValues. Если URL уже содержит соответствующие
query-параметры, они имеют приоритет над начальными значениями.
const [search, setSearch] = useSearch({
initialValues: { page: 1, filter: 'all', sort: 'asc' },
});
Если пользователь вручную введет в URL
?page=3&sort=desc, search автоматически
отобразит эти значения.
Для изменения query-параметров используется функция
setSearch. Она поддерживает:
setSearch({ page: 2, filter: 'completed', sort: 'desc' });
setSearch(prev => ({ ...prev, page: prev.page + 1 }));
undefined:setSearch({ filter: undefined });
После обновления URL автоматически синхронизируется с состоянием хука без перезагрузки страницы.
useSearch можно использовать совместно с
useEffect для реакции на изменения query-параметров:
import { useEffect } from 'react';
useEffect(() => {
fetchData(search);
}, [search]);
Любое изменение query-параметров запускает эффект, что идеально подходит для динамической подгрузки данных при фильтрации или пагинации.
TanStack Router позволяет использовать массивы и другие сложные типы
в query-параметрах. Для этого их необходимо
сериализовать/десериализовать через initialValues и функции
setSearch.
type SearchParams = {
tags: string[];
};
const [search, setSearch] = useSearch<SearchParams>({
initialValues: { tags: [] },
});
setSearch({ tags: ['react', 'router'] });
URL автоматически преобразует массив в строку
?tags=react,tanstack и обратно при чтении.
initialValues для обеспечения безопасных
дефолтных состояний.setSearch(prev => ...) для сложных обновлений.undefined, чтобы
URL оставался чистым.type SearchParams = {
page: number;
query: string;
tags: string[];
};
const FilterableList = () => {
const [search, setSearch] = useSearch<SearchParams>({
initialValues: { page: 1, query: '', tags: [] },
});
const handleSearchChange = (query: string) => setSearch(prev => ({ ...prev, query, page: 1 }));
const handleTagToggle = (tag: string) => {
setSearch(prev => ({
...prev,
tags: prev.tags.includes(tag)
? prev.tags.filter(t => t !== tag)
: [...prev.tags, tag],
}));
};
const nextPage = () => setSearch(prev => ({ ...prev, page: prev.page + 1 }));
useEffect(() => {
fetchItems(search);
}, [search]);
return (
<div>
{/* UI для ввода query и выбора тегов */}
<button onCl ick={nextPage}>Next Page</button>
</div>
);
};
В этом примере useSearch обеспечивает полный контроль
над query-параметрами, синхронизацию с URL и типобезопасность всех
операций.
useSearch делает работу с query-параметрами в TanStack
Router простой, предсказуемой и безопасной, обеспечивая мощные
возможности для управления состоянием URL и динамических
интерфейсов.