Управление состоянием в параметрах поиска URL
Синхронизируйте фильтры, сортировку и разбиение на страницы с URL с помощью useSearchParams.
«Управление состоянием в параметрах поиска URL» — бесплатный урок React Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Зачем хранить состояние в URL
Фильтры, поисковые запросы, порядок сортировки и пагинация должны находиться в URL, чтобы пользователи могли добавлять страницы в закладки, делиться ими и возвращаться к тому же представлению без потери состояния.
Хук useSearchParams
useSearchParams() возвращает текущий экземпляр URLSearchParams и функцию установки, подобно useState, но с хранением данных в строке запроса URL.
import { useSearchParams } from 'react-router-dom';
function ProductList() {
const [searchParams, setSearchParams] = useSearchParams();
const query = searchParams.get('q') || '';
const page = Number(searchParams.get('page') || 1);
// ...
}Чтение одного параметра
Используйте searchParams.get('key'), чтобы прочитать значение. Если параметр отсутствует, возвращается null, поэтому укажите запасной вариант.
const sort = searchParams.get('sort') ?? 'name';
const order = searchParams.get('order') ?? 'asc';Изменение параметров без навигации
Вызовите setSearchParams() с новым объектом или функцией обновления, чтобы изменить параметры. React Router обновит URL и повторно отобразит компонент без полной навигации.
function SortButton({ field }) {
const [searchParams, setSearchParams] = useSearchParams();
const handleClick = () => {
setSearchParams(prev => {
prev.set('sort', field);
prev.set('page', '1');
return prev;
});
};
return <button onClick={handleClick}>Sort by {field}</button>;
}Сохранение остальных параметров при обновлении
Используйте вариант setSearchParams с функцией обновления, чтобы изменять только нужные параметры и сохранять все остальные без изменений.
setSearchParams(prev => {
prev.set('q', newQuery);
// 'sort' and 'page' are unchanged
return prev;
});Синхронизация поля ввода с параметрами поиска
Управляйте значением поля ввода через параметр URL и обновляйте URL при изменении, чтобы поддерживать их синхронизацию.
function SearchBar() {
const [params, setParams] = useSearchParams();
const q = params.get('q') || '';
return (
<input
value={q}
onChange={e => setParams(prev => {
prev.set('q', e.target.value);
prev.set('page', '1');
return prev;
})}
/>
);
}Логические флаги в параметрах поиска
Используйте наличие или отсутствие параметра либо строку «1»/«0», чтобы представлять логическое состояние интерфейса, например открытость панели или активность фильтров.
const showFilters = searchParams.has('filters');
const toggleFilters = () => {
setSearchParams(prev => {
if (prev.has('filters')) prev.delete('filters');
else prev.set('filters', '1');
return prev;
});
};Массивы в параметрах поиска
URLSearchParams поддерживает несколько значений одного ключа. Используйте getAll('key'), чтобы прочитать их как массив.
// URL: /products?tag=react&tag=typescript
const tags = searchParams.getAll('tag'); // ['react', 'typescript']
// Setting multiple values:
const newParams = new URLSearchParams();
selectedTags.forEach(t => newParams.append('tag', t));
setSearchParams(newParams);Замена и добавление записей в историю
Передайте { replace: true } вторым аргументом в setSearchParams, чтобы изменения фильтров не заполняли историю браузера лишними записями.
setSearchParams(prev => { prev.set('q', val); return prev; }, { replace: true });Получение состояния из параметров
Вычисляйте производные значения, например разобранные целые числа или проверенные перечисления, из исходных строковых параметров в начале компонента, чтобы безопасно использовать их далее.
const rawPage = searchParams.get('page');
const page = Math.max(1, parseInt(rawPage || '1', 10));
const rawSort = searchParams.get('sort');
const sort = ['name', 'price', 'date'].includes(rawSort) ? rawSort : 'name';Ссылки с параметрами поиска
Используйте свойство search элемента Link или объекта to, чтобы перейти к URL с заданными параметрами запроса.
<Link to={{ pathname: '/products', search: '?sort=price&order=asc' }}>
Sort by Price
</Link>Быстрая проверка
Какой метод URLSearchParams считывает все значения повторяющегося ключа, например ?tag=react&tag=ts?
Итоги
useSearchParams() синхронизирует состояние компонента со строкой запроса URL. Используйте вариант с функцией обновления, чтобы сохранить остальные параметры, { replace: true }, чтобы не раздувать историю, и getAll() для параметров со значениями-массивами.
Часто задаваемые вопросы
Урок «Управление состоянием в параметрах поиска URL» бесплатный?
Да — полный текст урока «Управление состоянием в параметрах поиска URL» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «Управление состоянием в параметрах поиска URL»?
Синхронизируйте фильтры, сортировку и разбиение на страницы с URL с помощью useSearchParams. Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Управление состоянием в параметрах поиска URL»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Вложенные маршруты и макеты Outlet
- Загрузчики и действия (API маршрутизатора данных)
- Защищённые маршруты и охрана авторизации
- Управление состоянием в параметрах поиска URL