Pagination

Sivutus

Rivimäärä vasemmalla, sivunvaihto oikealla.

Käyttöpaikat

Suoraan: palvelu tuo osan itse. Välillisesti: osa tulee mukaan toisen paketin osan kautta, ja sen muutos näkyy palvelussa silti. Laskettu julkaisun yhteydessä 23.10.2026.

TP-VASTAANOTTO
TP-MEDIA · DataTablein kautta
TP-PERUSTUS · DataTablein kautta
Esimerkki valitulla teemalla ja sävyllä; vaihda ne yläpalkista.

Käyttö

Paketin README:n luku sellaisenaan.

Pagination — sivunvaihto

<Pagination pagination={data.pagination} onPageChange={setPage} />
1–25 / 776                    ‹ Edellinen  1 2 3 4 5 … 32  Seuraava ›

DataTable renderöi tämän itse kun sille annetaan pagination ja onPageChange; erikseen sitä tarvitaan listoille jotka eivät ole taulukoita.

PropsiMerkitys
pagination · onPageChangepakolliset; komponentti ei sivuta itse
siblingsnaapureita nykyisen sivun kummallakin puolella, oletus 1
hideRangepiilottaa 1–25 / 776 — älä piilota tilan säästämiseksi

> Rivin pituus on vakio. Kun toinen katkaisu jää pois laidan lähellä, > ikkuna kasvaa yhdellä sen tilalle — muuten numerot liikkuisivat hiiren alta > sivua vaihtaessa. Laskenta on pageItemsissä ja testattu.

pageItems(1, 206)    // 1 2 3 4 5 … 206
pageItems(100, 206)  // 1 … 99 100 101 … 206

Ei sivukoon valitsinta. Se vaatisi päätöksen sallituista arvoista, ja se on palvelun rajapinnan asia.

> ⚠️ Sivutus pakottaa lajittelun palvelimelle. Jos sivutettu taulukko > lajitellaan selaimessa sortRowsilla, lajittelu järjestää vain näkyvät > 25 riviä ja näyttää järjestäneen kaikki 6 342. Käyttäjä klikkaa *Hinta*, > saa uskottavan järjestyksen, eikä mikään kerro että kallein on sivulla 47. > > Kun lisäät sivutuksen olemassa olevaan taulukkoon, siirrä lajittelu samaan > kyselyyn: sortStateToParams URLiin, palvelin järjestää, Pagination > viipaloi. > > Varoitus on ollut sortRowsin JSDocissa alusta asti, mutta väärässä > paikassa: sen lukee vasta se joka on jo päättänyt lajitella selaimessa. > Ansaan astutaan toisesta suunnasta — kun toimivaan taulukkoon lisätään > sivutus eikä kukaan kysy mitä lajittelulle tapahtuu. AIMO astui siihen > kolmesti kolmessa eri taulukossa. > > Ja sen toinen puoli: lajittelun vaihto palauttaa sivulle 1. Sivu 7 > uudessa järjestyksessä on mielivaltainen — käyttäjä ei etsi sieltä > mitään, mutta lista näyttää yhtä uskottavalta. > > ``ts > applyPageToParams(applySortToParams(nykyiset, uusiLajittelu), 1) > > > applySortToParams` ei nollaa sivua itse; se on palvelun päätös, koska > vain se tietää mitä muuta tilaa URLissa on. Lue nämä kaksi parina: > ensimmäinen tuottaa väärän järjestyksen, toinen oikean järjestyksen > väärältä sivulta, eikä kumpikaan epäonnistu näkyvästi kertaakaan.

Sivu URL-parametrina

// sivu vaihtuu
router.replace(`?${applyPageToParams(searchParams, sivu)}`);

// suodatin vaihtuu → sivu alkuun
const p = applyPageToParams(searchParams, 1);
p.set("haku", teksti);
router.replace(`?${p}`);

// palvelinkomponentissa
const sivu = pageFromParams(searchParams, { totalPages });

Sama kuvio kuin lajittelussa: paketti muuntaa parametreja, router jää palvelulle. PAGE_PARAM_NAMES on { page: "sivu", pageSize: "koko" }.

pageFromParamsroska ja alle yksi → 1; totalPages rajaa laidan yli menevän
pageSizeFromParamsallowed-lista on turvallisuusasia — ?koko=100000 päätyisi kyselyyn
applyPageToParamssäilyttää muut parametrit, ei mutatoi syötettä

> Sivu 1 jätetään pois osoitteesta. ?sivu=1 on kohinaa. > > Nollaus on sama kutsu sivulla 1. Sivulla 12 tehty haku jättäisi > käyttäjän sivulle 12 tuloksessa jossa on kaksi sivua.

Tuonti ja lähde

import { Pagination } from "@karkkainen/ui";
  • src/components/pagination.tsx