The `react-infinite-scroll-component` is a popular and efficient React library designed to implement infinite scrolling functionality in web applications. Infinite scrolling, also known as endless scrolling, is a web design technique where content loads continuously as the user scrolls down the page, eliminating the need for pagination.
How it Works:
1. Detects Scroll Position: The component internally monitors the scroll position of its container (or a specified `scrollableTarget`).
2. Triggers `next` Function: When the user scrolls near the bottom of the content area, and there's more data to load (`hasMore` is true), the component automatically calls a user-provided function (`next`). This `next` function is responsible for fetching additional data from an API or other data source.
3. Appends New Data: The fetched data is then appended to the existing list of items in the component's state.
4. Manages `hasMore` State: The `hasMore` prop (a boolean) tells the component whether there's more data available to load. Once all data has been fetched, `hasMore` should be set to `false` to prevent further `next` calls.
5. Loader and End Message: It provides props for displaying a `loader` component while data is being fetched and an `endMessage` when `hasMore` becomes `false`.
Key Props:
* `dataLength` (number, required): The total number of items currently rendered. This helps the component determine the content height and scroll position.
* `next` (function, required): A function that gets called when the user scrolls to the bottom and `hasMore` is true. This function should fetch and append new data.
* `hasMore` (boolean, required): Indicates whether there is more data to load. When `false`, the `next` function will no longer be called.
* `loader` (ReactNode, required): The component or message to display while new data is being loaded.
* `children` (ReactNode, required): The actual list of items to be displayed. These are typically mapped from your component's state.
* `endMessage` (ReactNode, optional): A message or component to display when `hasMore` becomes `false`, indicating that all data has been loaded.
* `scrollableTarget` (string | HTMLElement, optional): If the component's scroll area is not the `window` but a specific container, you can provide its ID or a DOM element reference. Otherwise, it defaults to the `window`.
* `height` (number | string, optional): If `scrollableTarget` is used, you can specify a fixed height for the scroll container.
Benefits:
* Performance: Efficiently handles large datasets by only rendering a subset of items initially and loading more as needed.
* User Experience: Provides a seamless browsing experience by eliminating page reloads or manual clicks for pagination.
* Ease of Use: Simple API with essential props for quick implementation.
Example Code
```jsx
import React, { useState, useEffect } from 'react';
import InfiniteScroll from 'react-infinite-scroll-component';
const style = {
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
border: '1px solid grey',
margin: '8px',
padding: '8px',
minHeight: '80px', // Ensure items have some height
justifyContent: 'center'
};
function InfiniteScrollExample() {
// Initial state with 20 dummy items
const [items, setItems] = useState(Array.from({ length: 20 }));
// State to track if there's more data to load
const [hasMore, setHasMore] = useState(true);
// Simulate an API call to fetch more data
const fetchMoreData = () => {
// In a real application, you would make an actual API request here.
// For demonstration, we're simulating a delay and a fixed limit of 200 items.
if (items.length >= 200) {
setHasMore(false); // No more data to load
return;
}
// Simulate fetching new items after a delay
setTimeout(() => {
setItems((prevItems) =>
prevItems.concat(Array.from({ length: 20 })) // Add 20 new dummy items
);
}, 1500); // Simulate network delay
};
return (
<div>
<h1>Infinite Scroll Demo</h1>
<hr />
<InfiniteScroll
dataLength={items.length} // This is important for the component to know the current content length
next={fetchMoreData} // Function to call when scrolling near the bottom
hasMore={hasMore} // Boolean to indicate if there's more data
loader={<h4>Loading...</h4>} // Loader component to show while fetching
endMessage={
<p style={{ textAlign: 'center' }}>
<b>Yay! You have seen it all</b>
</p>
}
// Optional: If you want to scroll inside a specific div instead of the window
// scrollableTarget="scrollableDiv"
// height={400} // If using scrollableTarget, specify height
>
{items.map((_, index) => (
<div style={style} key={index}> {/* key prop is important for list items */}
div - #{index + 1}
</div>
))}
</InfiniteScroll>
</div>
);
}
export default InfiniteScrollExample;
```








react-infinite-scroll-component