TanStackIntermediate
Pagination — Server-side
page/pageSize state, queryKey-তে page ও pagination UI — বাংলায়।
7টি অংশবাংলা ভাষায়
ডেটা বড় হলে পুরো list fetch করা উচিত নয় — server-side pagination। আমরা page ও pageSize-কে state-এ রাখব; বদলালে queryKey বদলে নতুন page আসে।
Dashboard page-এ statetsx
tsx
"use client";
import { useState } from "react";
import { ProductList } from "@/components/products/product-list";
import { ProductPagination } from "@/components/products/product-pagination";
export default function ProductsPage() {
const [page, setPage] = useState(1);
const [pageSize, setPageSize] = useState(10);
return (
<main>
<ProductList params={{ page, pageSize }} />
<ProductPagination
page={page}
pageSize={pageSize}
onPageChange={setPage}
onPageSizeChange={(size) => {
setPageSize(size);
setPage(1); // size বদলালে ১ম পেজে
}}
/>
</main>
);
}Pagination component
product-pagination.tsxtsx
tsx
"use client";
import { Button } from "@/components/ui/button";
import { useProducts } from "@/lib/hooks/use-products";
export function ProductPagination({ page, pageSize, onPageChange }) {
// totalPages জানতে একই query-র total-needed
const { data } = useProducts({ page, pageSize });
const totalPages = data?.totalPages ?? 1;
return (
<div className="flex items-center justify-between">
<span className="text-sm text-muted-foreground">
{data ? `মোট ${data.total}টি product` : "..."}
</span>
<div className="flex gap-2">
<Button
variant="outline"
disabled={page <= 1}
onClick={() => onPageChange(page - 1)}
>
আগের
</Button>
<span className="px-2 text-sm">
{page} / {totalPages}
</span>
<Button
variant="outline"
disabled={page >= totalPages}
onClick={() => onPageChange(page + 1)}
>
পরের
</Button>
</div>
</div>
);
}কেন queryKey-তে page
প্রতিটি page-র নিজস্ব cache — user page ৩-তে গিয়ে page ১-এ ফিরে আসলে fetch ছাড়াই instant। keepPreviousData-য় পেজ-বদলের মুহূর্তেও পুরনো টেবিল blush করে না।
সাইজ-বদল বা rowCount
pageSize (row per page) পরিবর্তনে page-কে ১-এ reset করা best practice — নাহলে বড় pageSize-তে page ৫-এ কোনো ডেটাই না-ও থাকতে পারে।
শেষ প্যারায় নিজে practice করুন — কোড কপি করে নিজের এডিটরে চালিয়ে দেখুন।