@akhatmirzo/ui

Pagination

Ro'yxat va jadvallarni sahifalarga bo'lish: SEO uchun haqiqiy havolalar, Next.js Link va telefonda ixcham ko'rinish.

21–30 / 230 ta

Import

import { Pagination, PaginationInfo } from '@akhatmirzo/ui';

Qachon ishlatish

  • Uzun ro'yxatlar va jadvallar — buyurtmalar, blog maqolalari, qidiruv natijalari. Foydalanuvchi kerakli sahifaga to'g'ridan-to'g'ri o'ta oladi.
  • Sahifa URL'da bo'lishi kerak bo'lsa (/blog?page=3) — getHref bering: tugmalar haqiqiy <a href> bo'ladi, qidiruv tizimlari barcha sahifalarni topadi.
  • Cheksiz lenta uchun emas. Ijtimoiy tarmoq lentasi kabi oqimda "Yana yuklash" tugmasi yoki avtomatik yuklash qulayroq.
  • Kichik ro'yxatda kerak emas. Hammasi bitta sahifaga sig'sa, sahifalashni ko'rsatmang.

Sahifalar hisobi

Sahifalar ro'yxati @akhatmirzo/hooks dagi getPagination bilan hisoblanadi — DataTable bilan bir xil algoritm. Elementlar soni barqaror (siblings * 2 + 5), shuning uchun sahifa almashganda tugmalar "sakramaydi". … bosilmaydi.

total + pageSize (standart 10) yoki to'g'ridan-to'g'ri pageCount bering. Sahifalar 1 dan boshlanadi.

O'lchamlar

size — sm (32px) yoki md (40px, standart) kvadrat tugmalar.

Birinchi / oxirgi sahifa

showFirstLast — ⏮ ⏭ tugmalari. siblings — joriy sahifa yonida nechta raqam ko'rinadi (standart 1).

Ixcham ko'rinish

compact="auto" (standart) — 640px dan tor ekranda ‹ 3 / 24 › ko'rinishiga o'tadi. compact — har doim ixcham, compact={false} — har doim to'liq.

Nega CSS bilan?

auto rejimda ikkala ko'rinish ham render qilinadi va CSS breakpoint bilan bittasi yashiriladi (display: none — ekran o'quvchi ham ko'rmaydi). JavaScript matchMedia ishlatilmagani uchun SSR'da hydration farqi va sahifa yuklanganda "sakrash" bo'lmaydi.

Havolalar (SEO)

getHref berilsa, har bir sahifa — haqiqiy <a href>. Bosilganda brauzer odatdagidek o'tadi; onPageChange ham chaqiriladi. Chekkadagi "Oldingi" / "Keyingi" havola emas, o'chirilgan tugma bo'ladi.

renderLink — o'z havola komponentingiz. Barcha prop'larni havolaga yoying; page — qaysi sahifaga olib borishi.

app/blog/page.tsx
import Link from 'next/link';
import { Pagination } from '@akhatmirzo/ui';

export default async function BlogPage({
  searchParams,
}: {
  searchParams: Promise<{ page?: string }>;
}) {
  const page = Number((await searchParams).page ?? 1);
  const { posts, total } = await getPosts(page);

  return (
    <>
      <PostList posts={posts} />
      <Pagination
        page={page}
        total={total}
        pageSize={10}
        getHref={(p) => `/blog?page=${p}`}
        renderLink={({ page, ...props }) => <Link {...props} />}
      />
    </>
  );
}

DataTable bilan

DataTable'ning o'z sahifalashi bor (pagination prop). Sahifalashni jadvaldan tashqarida — masalan URL bilan boshqarish kerak bo'lsa, pagination ni bermang va Pagination + PaginationInfo ni pastga qo'ying.

№MijozSumma
3001Jasur Karimov120 000 so'm
3002Malika Rahimova434 159 so'm
3003Nodira Saidova748 318 so'm
3004Otabek Qodirov1 062 477 so'm
3005Jasur Karimov1 376 636 so'm

1–5 / 47 ta

Props

Pagination

Qolgan <nav> atributlari ham qabul qilinadi.

PropTipStandartTavsif
pagenumber—Joriy sahifa, 1 dan (boshqariladigan rejim)
defaultPagenumber1Boshlang'ich sahifa
onPageChange(page: number) => void—Sahifa almashganda
totalnumber—Jami yozuvlar soni
pageSizenumber10Bir sahifadagi yozuvlar
pageCountnumber—Sahifalar soni to'g'ridan-to'g'ri (`total` / `pageSize` o'rniga)
siblingsnumber1Joriy sahifaning har ikki tomonidagi raqamlar
getHref(page: number) => string—Berilsa — tugmalar haqiqiy `<a href>` bo'ladi
renderLink(props: PaginationLinkProps) => ReactNode—Next `Link` kabi havola komponenti (`getHref` bilan)
size'sm' | 'md''md'Tugma: 32 / 40px
showFirstLastbooleanfalseBirinchi / oxirgi sahifa tugmalari
compactboolean | 'auto''auto'`‹ 3 / 24 ›` ko'rinishi; `auto` — 640px dan tor ekranda
labels{ nav, previous, next, first, last, page, ellipsis, compact }—Ekran o'quvchi matnlari. Standart: "Sahifalash", "Oldingi sahifa", "Keyingi sahifa", `(n) => "${n}-sahifa"` ...

PaginationInfo

Qolgan <p> atributlari ham qabul qilinadi.

PropTipStandartTavsif
pagemajburiynumber—Joriy sahifa (1 dan)
pageSizemajburiynumber—Bir sahifadagi yozuvlar
totalmajburiynumber—Jami yozuvlar
labels{ template?: (from, to, total) => ReactNode; empty?: ReactNode }—Standart: "21–30 / 230 ta" va "Ma'lumot yo'q"

Data atributlari

AtributQayerdaQiymat
data-sizenav, tugmalarsm · md
data-compactnavauto yoki mavjud (compact)
data-activesahifa tugmasijoriy sahifada mavjud
data-disabledoldingi / keyingichekkada mavjud

Accessibility

  • Tuzilish. <nav aria-label="Sahifalash"> ichida <ul> ro'yxat — ekran o'quvchi navigatsiya hududi va elementlar sonini e'lon qiladi.
  • Joriy sahifa — aria-current="page". Rang yagona signal emas: joriy tugma to'ldirilgan fonda.
  • Nomlar. Har bir tugmada aria-label ("5-sahifa", "Keyingi sahifa"); ikonkalar aria-hidden. … ekran o'quvchiga "Boshqa sahifalar" deb o'qiladi.
  • Klaviatura. Oddiy tugma yoki havolalar: Tab bilan yuriladi, Enter bilan bosiladi. Chekkadagi o'chirilgan tugmalar Tab da o'tkazib yuboriladi.
  • PaginationInfo — aria-live="polite": sahifa almashganda yangi oraliq e'lon qilinadi.

Sahifada