Журнал • знания • практикаПоиск по сайту

Сайты, дизайн и самостоятельная работа

Найти материал →

Пагинация списка в веб-разработке: как сохранять выбранную страницу в Url

6 минут чтения

Пагинация списка в веб-разработке: как сохранять выбранную страницу в Url

Пагинация с сохранением страницы в URL позволяет открыть нужную часть списка по прямой ссылке, обновить страницу без сброса позиции и вернуться к результатам кнопкой браузера "Назад". Для этого считывайте номер страницы из адреса при загрузке, проверяйте его, а при переходах синхронно обновляйте URL и содержимое списка, сохраняя фильтры и сортировку.

Что важно учесть при пагинации через URL

  • Выберите один формат адреса: например, параметр ?page=3 или путь /page/3.
  • Чтение URL при загрузке и обновление URL при переходе - отдельные операции; обе должны обновлять согласованное состояние.
  • Проверяйте, что номер страницы - допустимое целое число в диапазоне доступных результатов.
  • Сохраняйте параметры фильтрации и сортировки при переходе между страницами.
  • Для перехода без полной перезагрузки используйте History API; при этом отдельно настройте обработку события возврата браузера.

Как выбрать формат параметра страницы

Формат ?page=3 обычно удобен для списков, в которых уже есть параметры поиска, фильтров и сортировки: их можно хранить в одной строке запроса. Адрес вида /page/3 может подойти, если номер страницы - часть структуры маршрута и это поддерживает маршрутизация проекта.

Не добавляйте параметр страницы, если список целиком помещается на одной странице или выбор позиции не должен быть доступен по ссылке. В веб-разработке сайта формат важно согласовать с маршрутизацией, серверной обработкой и требованиями к прямому открытию адреса. Если вы планируете заказать разработку сайта, заранее уточните, как будут обрабатываться фильтры, сортировка и устаревшие ссылки.

Синхронизация списка и адресной строки

Перед началом проверьте, что в проекте есть:

  • доступ к месту, где загружаются или фильтруются данные списка;
  • роутер приложения либо возможность работать с адресом через URL и URLSearchParams;
  • согласованный размер страницы и способ определить число доступных страниц;
  • правило обработки некорректного или устаревшего номера страницы;
  • возможность протестировать перезагрузку, прямое открытие ссылки и кнопки браузера.

Если данные загружаются с сервера, он тоже должен принимать номер страницы и остальные параметры запроса. Одного изменения адресной строки недостаточно: список должен отображать именно соответствующую выборку.

Переходы между страницами без потери состояния

Перед настройкой переходов учтите риски и ограничения:

  • Страница может стать недоступной, если после изменения фильтра общее число результатов уменьшилось.
  • Некорректный ввод в URL нельзя без проверки передавать в запрос к серверу.
  • При асинхронной загрузке старый ответ может прийти после нового и показать не ту страницу.
  • history.pushState меняет адрес, но сам по себе не обновляет список и не обрабатывает возврат браузера.
  1. Прочитайте состояние из URL.

    При начальной загрузке извлеките номер страницы, фильтры и сортировку из адреса. Если параметр отсутствует, используйте согласованное значение по умолчанию.

    • Разбирайте адрес через URL и URLSearchParams, а не вручную по символам.
    • Проверьте, что значение страницы целое и положительное.
  2. Нормализуйте параметры.

    Приведите данные к допустимому формату до загрузки списка. При неизвестном фильтре или неверном номере примените заранее выбранное правило: например, показать первую страницу либо перенаправить на корректный адрес.

  3. Загрузите соответствующие результаты.

    Передайте номер страницы вместе с фильтрами и сортировкой в слой данных или серверный запрос. При изменении фильтра обычно следует сбросить страницу на первую, чтобы не остаться за пределами нового диапазона.

  4. Обновите URL при переходе.

    Создайте новый адрес, изменив только параметр страницы и сохранив остальные параметры. Для навигации, которую пользователь должен видеть в истории браузера, используйте маршрутизатор или history.pushState.

    const url = new URL(window.location.href);
    url.searchParams.set("page", String(nextPage));
    history.pushState({}, "", url);
    loadList({
      page: nextPage,
      sort: url.searchParams.get("sort"),
      filter: url.searchParams.get("filter")
    });
  5. Синхронизируйте отображение и адрес.

    После успешного перехода обновите элементы списка, активный номер и доступность кнопок "Назад" и "Вперёд". Если запрос завершился ошибкой, покажите понятное сообщение и не оставляйте интерфейс в состоянии, которое не соответствует адресу.

Проверка номера страницы и обработка некорректных URL

Проверьте результат по списку:

  • Параметр отсутствует - открывается согласованная страница по умолчанию.
  • Значение не является целым числом - применяется выбранное правило нормализации.
  • Переданы ноль, отрицательное число или слишком большое значение - интерфейс не зависает и не отправляет некорректный запрос.
  • Номер больше числа доступных страниц - пользователь получает корректную страницу или понятную обработку ошибки.
  • При смене страницы параметры фильтрации и сортировки остаются в адресе и влияют на список.
  • При изменении фильтра номер страницы сбрасывается, если прежнее значение может выйти за новый диапазон.
  • Прямое открытие сформированного адреса показывает тот же набор результатов, что и переход по ссылке внутри сайта.

Правило для несуществующей страницы должно быть единым на клиенте и сервере. Не полагайтесь только на скрытие ошибки в интерфейсе: некорректный номер нужно проверить до загрузки данных.

История браузера, обновление и прямые ссылки

Типичные ошибки при настройке URL-пагинации:

  • Адрес обновляется, но содержимое списка остаётся прежним.
  • Список меняется, но URL не обновляется; после перезагрузки пользователь видит другой набор результатов.
  • Параметры фильтра или сортировки теряются при переходе на следующую страницу.
  • Каждый технический шаг добавляется в историю, из-за чего кнопка "Назад" требует слишком много нажатий.
  • Событие popstate не обрабатывается, поэтому возврат к предыдущему адресу не восстанавливает список.
  • Обновление страницы на вложенном маршруте возвращает ошибку, потому что сервер не настроен отдавать приложение для этого пути.
  • Два асинхронных запроса завершаются не по порядку, и устаревший ответ перезаписывает актуальный список.
  • Ссылка на страницу открывается без нужного состояния, поскольку параметры не включены в URL.

При использовании History API подпишитесь на popstate, прочитайте новое состояние из адреса и загрузите соответствующий список. Для загрузки страниц при нажатии на ссылки используйте навигацию, совместимую с маршрутизатором проекта.

Тестирование пагинации на граничных сценариях

Выберите подходящий способ реализации с учётом устройства проекта:

  • Параметры запроса и полная перезагрузка. Подходит для простой серверной страницы: ссылка естественно поддерживает прямое открытие и обновление.
  • History API в клиентском приложении. Уместен, когда список обновляется без перезагрузки; потребуется самостоятельно связать изменение адреса, загрузку данных и обработку возврата.
  • Маршрутизатор приложения. Удобен в проекте с несколькими маршрутами, если он уже умеет синхронизировать параметры URL с состоянием интерфейса.

До выпуска проверьте первую и последнюю страницы, отсутствие результатов, переход после изменения фильтра, прямое открытие адреса, обновление вкладки, возврат браузера и некорректные значения. Так проверяется не только пагинация на сайте, но и согласованность списка с URL в реальных пользовательских сценариях.

Практические ситуации при работе с URL-пагинацией

Как сохранить фильтры при переходе на следующую страницу?

Изменяйте в URL только параметр страницы, не пересоздавая строку запроса целиком. Фильтры и сортировка должны участвовать и в загрузке данных.

Что делать, если параметр страницы отсутствует?

Откройте страницу по умолчанию и придерживайтесь одного правила во всём приложении. При необходимости можно привести адрес к каноническому виду.

Как обработать номер страницы вне диапазона?

Определите число доступных страниц и выберите предсказуемое поведение: перенаправление на последнюю допустимую страницу, показ первой страницы или сообщение об отсутствии результатов. Согласуйте это поведение между сервером и клиентом.

Почему кнопка браузера "Назад" не меняет список?

pushState не обновляет интерфейс автоматически. Обрабатывайте событие popstate или используйте маршрутизатор, который восстанавливает состояние при навигации.

Нужно ли менять страницу при изменении сортировки?

Обычно сортировку сохраняют в URL, а страницу сбрасывают на первую: прежний номер может оказаться вне нового диапазона. Если логика проекта требует другого поведения, явно задайте его.

Как избежать отображения результатов от устаревшего запроса?

Отменяйте предыдущий запрос при новом переходе или проверяйте, что ответ соответствует актуальному URL. Не позволяйте позднему ответу перезаписать список для уже выбранной страницы.

Scroll to Top