React·100 вопросов

Как реализовать пагинацию и infinite scroll?

Ответ

Реализация постраничного отображения данных и бесконечной прокрутки является стандартной задачей при создании интерфейсов с большими объемами информации в React-приложениях. Выбор конкретного подхода зависит от бизнес-логики и дизайна: классическая пагинация с номерами страниц лучше подходит для таблиц и поисковой выдачи, где пользователю важно быстро перейти к конкретной странице, в то время как infinite scroll идеален для социальных сетей и новостных лент.

Для реализации классической пагинации обычно используют параметры номеров страниц и их размера, которые хранятся прямо в URL-адресе с помощью параметров строки запроса. Это позволяет пользователям делиться ссылками на конкретные страницы и использовать кнопки браузера для навигации назад и вперед. Сервер в таком случае возвращает массив элементов для запрошенной страницы и общее количество записей для отрисовки навигационных элементов.

Бесконечная прокрутка работает по принципу динамического добавления новых порций данных по мере того, как пользователь приближается к концу текущего списка. Для этого отслеживается положение прокрутки с помощью специальных хуков или элементов-маяков, при появлении которых в зоне видимости инициируется новый запрос. Главное здесь — правильно обрабатывать состояния загрузки, предотвращать отправку дублирующих запросов во время ожидания ответа и корректно отображать индикатор окончания списка, когда все данные исчерпаны.

Для качественной реализации таких механизмов в современном React-приложении рекомендуется придерживаться следующего алгоритма.

Выберите подходящий инструмент, например, хук useInfiniteQuery из TanStack Query, который из коробки управляет страницами и кэшированием.
Реализуйте элемент-триггер в конце списка для отслеживания прокрутки с помощью Intersection Observer API.
Настройте дедупликацию запросов, чтобы избежать случайной отправки нескольких запросов при быстром скролле.
Отображайте скелетоны или спиннеры загрузки в нижней части списка во время подгрузки следующей порции.
Интегрируйте виртуализацию списка, если количество элементов исчисляется тысячами, чтобы избежать проблем с производительностью DOM.
Полезен ли этот ответ?

Другие вопросы этой темы

Связанные вопросы из других тем