Приведи пример использования пагинации в своих проектах

Ответ

В React с использованием useState и простой пагинации:

const [currentPage, setCurrentPage] = useState(1);
const itemsPerPage = 10;

// Данные для отображения
const indexOfLastItem = currentPage * itemsPerPage;
const indexOfFirstItem = indexOfLastItem - itemsPerPage;
const currentItems = data.slice(indexOfFirstItem, indexOfLastItem);

// Рендер пагинации
const paginate = (pageNumber) => setCurrentPage(pageNumber);

return (
  <div>
    {currentItems.map(item => (
      <div key={item.id}>{item.name}</div>
    ))}
    <div className="pagination">
      {[...Array(Math.ceil(data.length / itemsPerPage)).keys()].map(number => (
        <button key={number} onClick={() => paginate(number + 1)}>
          {number + 1}
        </button>
      ))}
    </div>
  </div>
);

Для сложных случаев можно использовать библиотеки типа react-paginate или API с пагинацией (limit/offset).

Ответ 18+ 🔞

Да ты посмотри, какой народ изобретательный! Сидят, блядь, и думают: "Как бы мне эту простыню данных на куски порезать, чтобы пользователь не охуел от её размера?". Ну и придумали пагинацию, ёпта!

Вот смотри, в Реакте это делается проще пареной репы, если, конечно, твоя репа не гнилая. Берёшь useState и заводишь себе переменную для текущей страницы.

const [currentPage, setCurrentPage] = useState(1);
const itemsPerPage = 10;

Вот currentPage — это как номер текущей кассеты в магнитофоне, а itemsPerPage — песен на одной кассете. Допустим, десять.

Дальше, блядь, начинается магия арифметики, от которой у меня в школе мозг вытекал.

// Данные для отображения
const indexOfLastItem = currentPage * itemsPerPage; // Последний элемент на странице
const indexOfFirstItem = indexOfLastItem - itemsPerPage; // Первый элемент на странице
const currentItems = data.slice(indexOfFirstItem, indexOfLastItem); // А вот и наш кусок!

Представь: у тебя массив data — это целый батон колбасы. slice — это острый нож. indexOfFirstItem и indexOfLastItem — это метки, где резать. И вот ты отрезал себе ровно десять кусочков (itemsPerPage) для текущей страницы. Красота, блядь!

Рендеришь эти кусочки, как обычно:

return (
  <div>
    {currentItems.map(item => (
      <div key={item.id}>{item.name}</div>
    ))}

А теперь, внимание, самый сок — кнопочки для перелистывания! Надо же дать пользователю возможность не только первую десятку смотреть.

    <div className="pagination">
      {[...Array(Math.ceil(data.length / itemsPerPage)).keys()].map(number => (
        <button key={number} onClick={() => paginate(number + 1)}>
          {number + 1}
        </button>
      ))}
    </div>

Смотри, что тут происходит, это же ебушки-воробушки! Math.ceil(data.length / itemsPerPage) — это мы считаем, сколько всего страниц получится. Если 48 элементов делить на 10, будет 4.8, а ceil округляет вверх, до 5. Потому что последняя, пятая страница, будет неполная, всего с 8 элементами, но она нам нужна!

[...Array(N).keys()] — это такая хитрая жопа, чтобы быстро получить массив типа [0, 1, 2, 3, 4]. И из каждого числа делаем кнопку, которая при клике вызывает paginate, то есть просто ставит новую текущую страницу.

Ну и функция paginate — проще некуда:

const paginate = (pageNumber) => setCurrentPage(pageNumber);

Всё, пиздец, готово! Пользователь тыкает на кнопку "3" — currentPage становится тройкой, компонент перерисовывается, формулы вверху пересчитываются, slice отрезает уже элементы с 20-го по 29-й, и рендерится новая десятка. Волшебство, блядь!

А если тебе лень эту всю хуйню с нуля писать, или данные с бэка приходят уже с пагинацией, то можно, конечно, взять какую-нибудь библиотеку, типа react-paginate. Но суть-то, блядь, от этого не меняется — всё равно под капотом примерно то же самое происходит. Главное — понять принцип, а там уже хоть в рот меня чих-пых, хоть об стенку!