Pagination और Infinite Scroll
In this page:
const [page, setPage] = useState(1);
const pageSize = 10;
const start = (page - 1) * pageSize;
const pageItems = items.slice(start, start + pageSize);
const totalPages = Math.ceil(items.length / pageSize);
<button disabled={page === 1} onClick={() => setPage(p => p - 1)}>Prev</button>
<button disabled={page === totalPages} onClick={() => setPage(p => p + 1)}>Next</button>
Current Page Track करना
एक simple page state variable (1 से शुरू) track करता है कि data का कौन सा page currently display हो रहा है। इस value को बदलना, आमतौर पर Next/Previous buttons के through, यही है जो dataset का एक अलग slice दिखाना (या fetch करना) trigger करता है।
उदाहरण: Tracking the Current Page
<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
function App() {
const [page, setPage] = React.useState(1);
return (
<div>
<p>Current page: {page}</p>
<button onClick={() => setPage(p => p + 1)}>Next</button>
</div>
);
}
ReactDOM.createRoot(document.getElementById('root')).render(<App />);
</script>
</body>
</html>
Client-Side Data को Page के According Slice करना
जब सारा data client पर already load हो गया हो, pagination सिर्फ current page और एक fixed page size के based पर array slice करने की बात है, actually display करने योग्य relevant chunk लेने के लिए Array.slice() उपयोग करते हुए।
उदाहरण: Slicing Client-Side Data by Page
<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
function App() {
const items = Array.from({ length: 23 }, (_, i) => "Item " + (i + 1));
const [page, setPage] = React.useState(1);
const pageSize = 5;
const pageItems = items.slice((page - 1) * pageSize, page * pageSize);
return (
<div>
<ul>{pageItems.map(i => <li key={i}>{i}</li>)}</ul>
<button onClick={() => setPage(p => p + 1)}>Next</button>
</div>
);
}
ReactDOM.createRoot(document.getElementById('root')).render(<App />);
</script>
</body>
</html>
Boundaries पर Buttons Disable करना
Total item count और page size से total number of pages compute करना आपको page 1 पर Previous button और last page पर Next button disable करने देता है, users को उन pages पर navigate करने से रोकते हुए जो मौजूद ही नहीं हैं।
उदाहरण: Disabling Buttons at the Boundaries
<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
function App() {
const items = Array.from({ length: 12 }, (_, i) => "Item " + (i + 1));
const [page, setPage] = React.useState(1);
const pageSize = 5;
const totalPages = Math.ceil(items.length / pageSize);
return (
<div>
<p>Page {page} of {totalPages}</p>
<button onClick={() => setPage(p => p - 1)} disabled={page === 1}>Prev</button>
<button onClick={() => setPage(p => p + 1)} disabled={page === totalPages}>Next</button>
</div>
);
}
ReactDOM.createRoot(document.getElementById('root')).render(<App />);
</script>
</body>
</html>
- सिर्फ current page के बजाय सारे pages upfront fetch करना, pagination के purpose को defeat करते हुए।
- जब एक filter या search term बदलता है तो current page को वापस 1 पर reset करना भूल जाना।
- Last page पर Next button disable न करना, users को उन pages के लिए request करने देते हुए जो मौजूद नहीं हैं।
- Pagination एक बड़े dataset को pages में split करता है, एक समय में सिर्फ एक page का worth fetch या दिखाते हुए।
- एक page state variable track करता है कि currently कौन सा page active है।
- Next/Previous buttons page को increment या decrement करते हैं, आमतौर पर उस page के data के लिए एक fetch फिर से trigger करते हुए।
- पहले/last page पर navigation buttons disable करना out-of-range pages request करने से रोकता है।
कोई React-version restriction नहीं — useState और (optionally) एक data-fetching hook से बना।
Chapter Quiz — Complete all 10 topics to unlock
0/10 topics done
Complete these topics first: