Изменение query params с useRouter, usePathname и useSearchParams
Автор конспекта: Стогниева Виктория
Введение: Что такое параметры запроса и зачем они нужны? 🎯
Представьте, что URL-адрес страницы — это название книги, а параметры запроса (query-параметры)
— это заметки на полях, которые вы оставляете. Основное название книги не меняется, но заметки
помогают вам уточнить, на что именно обратить внимание: ?страница=42&глава=3. В вебе они работают
точно так же.
Ключевая задача: передача дополнительной информации (сортировка, фильтры, поисковые запросы)
через URL без изменения основного адреса страницы.
Пример: mysite.com/products?category=laptops&sort=price_desc
В современной разработке на Next.js (с App Router) для работы с URL используются три основных
инструмента (хука):
Экспертная заметка: В старом Pages Router информация о текущем пути была частью единого хука
useRouter. В App Router эту логику намеренно разделили на специализированные хуки для
повышения производительности и улучшения code splitting. Теперь компоненты перерисовываются
только при изменении той части URL, от которой они напрямую зависят.
1. Читаем URL: Знакомство с usePathname и useSearchParams 📖
Хук usePathname — Где мы находимся?
У этого хука одна простая задача: получить текущий путь в адресной строке без домена и без
query-параметров.
Пример: Если полный URL — https://example.com/profile/123?active=true, то usePathname
вернет только /profile/123.
Хук useSearchParams — Что написано в "заметках на полях"?
Этот хук предназначен исключительно для чтения query-параметров. Он позволяет проверить, есть ли
в URL определенный параметр, или получить его значение
Важное ограничение: Объект, возвращаемый useSearchParams, предназначен только для
чтения. У него нет методов для изменения, добавления или удаления параметров.
Но как же изменять параметры? Прямо — никак. Потребуется другой подход.🤔
2. Главный секрет: изменение URL через навигацию🧩
Основная идея: изменение query-параметров — это не модификация текущего URL, а перенаправление
на новый адрес. Даже если адрес отличается одним символом в параметрах, для Next.js это переход на
"другую" страницу.
Два способа выполнения перехода:
3. Собираем всё вместе: практический рецепт 🍳
Это официально рекомендованный подход из документации Next.js для управления состоянием URL в
App Router.
-
Шаг 1: Получаем "ингредиенты". Внутри вашего компонента импортируем и вызываем все три хука:
useRouter,usePathnameиuseSearchParams. -
Шаг 2: Готовим новые параметры. С помощью встроенного в браузер конструктора
URLSearchParamsмы создаем новый, изменяемый набор параметров.
- Почему
new URLSearchParams(searchParams.toString())? ХукuseSearchParamsвозвращаетread-only(только для чтения) объект. Чтобы создать его изменяемую копию, мы сначала превращаем текущие параметры в строку (searchParams.toString()), а затем передаем эту строку в конструкторnew URLSearchParams(). В результате мы получаем новый, полностью управляемый объект.
-
Шаг 3: Собираем новый URL. Мы объединяем
pathname(изusePathname) с новой строкой параметров, чтобы получить полный целевой адрес. -
Шаг 4: Выполняем переход. Используем полученный URL в
<Link>или передаем его вrouter.push.
Пример 1: Изменение URL с помощью кнопки и router.push
Представим, что мы хотим добавить параметр title=book к текущему URL по нажатию на кнопку.
Следуя лучшим практикам, вынесем логику создания URL в отдельную функцию.
При нажатии на кнопку произойдет редирект на тот же путь, но с добавленным ?title=book.
Пример 2: Изменение URL с помощью ссылки <Link>
Результат будет абсолютно идентичным, но реализация будет декларативной. Мы заранее готовим URL
для ссылки, используя ту же логику.
Этот подход более предпочтителен для простой навигации, так как он семантически верный и не требует
JavaScript для обработки клика.
4. Ключевые выводы 🎓
Давайте подведем итоги и закрепим материал.
- 📖 Хук
useSearchParamsтолько читает параметры изURL. Он не предназначен для их изменения. - ✏️ Изменение query-параметров всегда происходит через перенаправление с помощью компонента
<Link>или методаrouter.push. - 🧩 Связка хуков
useRouter,usePathnameиuseSearchParamsявляется стандартным и рекомендуемым способом для динамического управленияURLв современных приложениях наNext.js.



