To make dynamic pagination in the frontend, you can implement logic that adjusts based on:
- The total number of items,
- The current page,
- The items per page, and
- A sliding window of visible page numbers (for better UX).
✅ Step-by-step: Dynamic Pagination in Frontend (React + Tailwind Example)
🔹 1. Define States
const [currentPage, setCurrentPage] = useState(1);
const itemsPerPage = 10;
const totalItems = 100; // Example
const totalPages = Math.ceil(totalItems / itemsPerPage);🔹 2. Create a function for dynamic page numbers
function getPageNumbers() {
const maxVisiblePages = 5;
let start = Math.max(currentPage - Math.floor(maxVisiblePages / 2), 1);
let end = start + maxVisiblePages - 1;
if (end > totalPages) {
end = totalPages;
start = Math.max(end - maxVisiblePages + 1, 1);
}
const pages = [];
for (let i = start; i <= end; i++) {
pages.push(i);
}
return pages;
}🔹 3. Render Buttons Dynamically
<div className="flex gap-2 items-center justify-center mt-4">
<button
disabled={currentPage === 1}
onClick={() => setCurrentPage(currentPage - 1)}
className="px-3 py-1 bg-gray-200 rounded disabled:opacity-50"
>
Prev
</button>
{getPageNumbers().map((page) => (
<button
key={page}
onClick={() => setCurrentPage(page)}
className={`px-3 py-1 rounded ${
page === currentPage ? "bg-blue-500 text-white" : "bg-gray-200"
}`}
>
{page}
</button>
))}
<button
disabled={currentPage === totalPages}
onClick={() => setCurrentPage(currentPage + 1)}
className="px-3 py-1 bg-gray-200 rounded disabled:opacity-50"
>
Next
</button>
</div>🔹 4. Use Sliced Data to Show Items
const dataToShow = allItems.slice(
(currentPage - 1) * itemsPerPage,
currentPage * itemsPerPage
);✅ Output Behavior
- Only 5 pages show at a time.
- When you click "Next", it shifts forward.
- Smooth page change with real data slice.
- You can fetch from backend too (pass
currentPagein the request).
⚡ Want Server-side Pagination?
Use useEffect to fetch data:
useEffect(() => {
fetch(`/api/data?page=${currentPage}&limit=${itemsPerPage}`)
.then((res) => res.json())
.then((data) => setItems(data));
}, [currentPage]);If you'd like, I can give you a full working React + Tailwind demo with animation too. Let me know!
চলো ভাই, তোমার getPageNumbers ফাংশনটা একদম লাইন বাই লাইন বাংলা ভাষায়, সহজভাবে ব্যাখ্যা করি— যেন তুমি একদম ফাটিয়ে ফেলো!
🔍 ফাংশনটির উদ্দেশ্য কী?
👉 এই ফাংশনটি হচ্ছে pagination এর page number গুলো নির্ধারণ করার জন্য। যেমন: ধরো মোট ২০টা পেজ আছে, কিন্তু তুমি একসাথে ২০টা পেজ দেখাতে চাও না। তুমি চাও যেন একসাথে শুধু ৫টা পেজ দেখায়, এবং সেটা স্লাইড করে move করে, যেমন:
[1] [2] [3] [4] [5] → current page 3 হলে
[4] [5] [6] [7] [8] → current page 6 হলে✅ লাইন বাই লাইন ব্যাখ্যা:
function getPageNumbers() {👉 এটা ফাংশনের শুরু। ফাংশনের নাম getPageNumbers, অর্থাৎ এটা পেজ নাম্বার বের করবে।
const maxVisiblePages = 5;👉 একসাথে কতগুলো পেজ নাম্বার দেখাবে? এখানে ৫টা ঠিক করা আছে।
let start = Math.max(currentPage - Math.floor(maxVisiblePages / 2), 1);👉 এখন ধরো currentPage = 6 হলে:
Math.floor(5 / 2)= 2currentPage - 2= 6 - 2 = 4- কিন্তু যদি
currentPage1 হয়, তাহলে 1 - 2 = -1, যেটা ঠিক না। - তাই
Math.max(..., 1)দিয়ে বলা হয়েছে — কমপক্ষে ১ থেকেই শুরু হবে।
✅ অর্থ: start হচ্ছে pagination এর শুরুর page number।
let end = start + maxVisiblePages - 1;👉 start থেকে শুরু করে কতদূর পর্যন্ত যাবে? ৫টা পর্যন্ত।
start + 5 - 1=start + 4- উদাহরণ:
start = 4হলে → end = 8
✅ অর্থ: এটা হচ্ছে pagination এর শেষ page number।
if (end > totalPages) {
end = totalPages;
start = Math.max(end - maxVisiblePages + 1, 1);
}👉 যদি end পেজ সংখ্যা (totalPages) এর চেয়ে বেশি হয়ে যায় (যেমন 100 এর মধ্যে 98, 99, 100, 101, 102 হয়), তাহলে:
end = totalPages→ শেষ সীমা ঠিক করা হলোstart = end - 4→ কারণ ৫টা পেজ দেখাতে হবে
✅ উদ্দেশ্য: শেষের দিকে গিয়ে যেন ভুল পেজ নাম্বার না দেখায়।
const pages = [];👉 একটা খালি array বানানো হলো, যাতে পেজ নাম্বার গুলো ভরে রাখা যায়।
for (let i = start; i <= end; i++) {
pages.push(i);
}👉 start থেকে end পর্যন্ত loop চালিয়ে সব page number pages array-তে ঢোকানো হচ্ছে।
return pages;
}👉 সবশেষে, এই পেজ নাম্বারগুলা return করে দেয়া হচ্ছে। যেগুলা UI-তে দেখানো হবে।
🔁 ধরো উদাহরণ:
totalPages = 10currentPage = 6
start = Math.max(6 - 2, 1) = 4
end = 4 + 5 - 1 = 8
=> pages = [4, 5, 6, 7, 8]🧠 এখন তোমার জন্য প্রশ্ন:
👉 ধরো, totalPages = 7 এবং currentPage = 7 হলে, এই getPageNumbers() ফাংশন কী start এবং end মান নির্ধারণ করবে?
pages array-টা কী হবে?
উত্তর দিয়ে দেখাও তুমি আটকে পড়ো না 😎
চলো ভাই 💻 এই কোডটাকে একদম ধাপে ধাপে ভেঙে বুঝে ফেলি — যেন তুমি pagination নিয়ে আর কখনো আটক না যাও!
✅ কোড:
const dataToShow = allItems.slice(
(currentPage - 1) * itemsPerPage,
currentPage * itemsPerPage
);📦 এই কোডটা কী করে?
👉 এটি মূলত allItems নামক বড় একটি অ্যারের ভিতর থেকে সঠিক পেজ অনুযায়ী data কেটে নিচ্ছে — মানে শুধু সেই পেজের data গুলো দেখানোর জন্য।
🔎 ধাপে ধাপে ব্যাখ্যা:
🔢 ধরো:
allItems.length = 20itemsPerPage = 5currentPage = 2
📌 Step 1:
(currentPage - 1) * itemsPerPage;= (2 - 1) * 5 = 1 * 5 = 5
👉 মানে শুরু index হবে ৫, যেটা হচ্ছে ৬তম item (index 5 দিয়ে শুরু হয়)
📌 Step 2:
currentPage * itemsPerPage;= 2 * 5 = 10
👉 মানে শেষ index হবে 10, কিন্তু slice() ফাংশনে এই index পর্যন্ত নেয় না, বরং আগ পর্যন্ত নেয়।
মানে নেয় 5 থেকে 9 পর্যন্ত index এর আইটেমগুলো।
📌 এখন পুরা slice() অংশ:
allItems.slice(5, 10);👉 মানে: ৬ নম্বর থেকে ১০ নম্বর পর্যন্ত আইটেম গুলো নেয়া হবে।
✅ Final result:
dataToShow অ্যারেতে এখন থাকবে ৫টা আইটেম — যেগুলো হচ্ছে current page (2) এর জন্য।
🧠 সংক্ষেপে মনে রাখো:
slice((currentPage - 1) * itemsPerPage, currentPage * itemsPerPage);🔹 startIndex = (page - 1) * perPage
🔹 endIndex = page * perPage
🎯 এখন তোমার জন্য চ্যালেঞ্জ:
ধরো:
itemsPerPage = 4currentPage = 3allItems.length = 12
👉 তাহলে start, end, এবং slice() কী হবে?
আর dataToShow তে কোন কোন index এর data থাকবে?
উত্তর দাও — দেখি কে কাকে আটকে দেয় 😎