0Pricing
React Academy · Урок

Управление состоянием в параметрах поиска 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 — локальная установка не требуется.

Все уроки этого курса

  1. Вложенные маршруты и макеты Outlet
  2. Загрузчики и действия (API маршрутизатора данных)
  3. Защищённые маршруты и охрана авторизации
  4. Управление состоянием в параметрах поиска URL
← Назад к React Academy