Have you been struggling with this question too when working on your React project? Whether to choose the endless streams of infinite scrolling or provide structure to your oasis with pagination? I always find myself in the peril of deciding which option is better for efficient data handling in React applications.
If you think about it, even Google shifted from Pagination to Infinite Scrolling and one very apparent benefit that Iâve experienced myself is the fact that I tend to scroll past the first 10 or the first âSERPâ page to find more relevant articles with lower SERP rankings.
The same is the concept with one of the most popular React applications â Instagram! Have you ever found yourself aimlessly scrolling through those addictive reels, swiping one after the other infinitely? This endless abundance of content encourages discovery and reduces friction, providing a seamless user experience.
However, is infinite scrolling a one-size-fits-all solution, or Pagination is a better alternative for efficient data management in some React applications? Today, I will try to break down both these data management techniques and weigh their pros and cons so you know when to use them.
Letâs get started:
Infinite Scrolling: The Endless Stream
The focus of infinite scrolling is to provide a seamless and dynamic user experience to users when working with huge data chunks. By allowing users to endlessly scroll through a stream of endless content without requiring them to load new pages to access more content, your users are motivated to stay and navigate your site or application for longer.
However, this isnât ideal for all situations and can have its pitfalls if not understood properly. Letâs understand the pros and cons of infinite scrolling in React to get a clearer idea â
Pro: User Engagement
Infinite scrolling promotes a seamless and engaging user experience without any interruptions of clicking pagination buttons or links.
Pro: Reduced Initial Load Time
Infinite scrolling triggers page load when the user scrolls down the page to view more content, hence it only loads the first frame of content that needs to be displayed on the first load request. This reduces the initial load time significantly.
Pro: Scrolling over Tapping
Scrolling is way more comfortable and user-friendly than tapping as it has a lower interaction cost. You can scroll through pages faster than clicking buttons. If you have a lengthy content structure for whitepapers or tutorials, infinite scrolling can provide better usability compared to breaking down the text in several sections and providing them with their separate pages or screens.
Con: Performance Issues
The idea of loading massive data on the fly as the user scrolls through your page can lead to performance bottlenecks especially for users that use devices with limited capacities or bandwidth connections. The browser can struggle to keep up with the performance demands of the ever-growing stream of data, resulting in lags and a sluggish user experience.
Con: Accessibility Concerns
The infinite scroll pattern can cause serious challenges from an accessibility point of view, as screen readers and other such assistive tools can have difficulty keeping focus on the userâs current location. The ARIA Authoring Practices Guide by W3.org talks about this in greater detail. It also limits keyboard navigation which can be problematic for users who canât use a mouse.
Con: No Footer
One of the most overlooked perils of infinite scrolling is the absence of a footer. The footer plays a significant role in any website. It provides quick access to important links for users who want to find something or navigate to another page. With infinite scrolling, the user will never reach the footer as they will find more content each time they scroll down the page.
Pagination: The Structured Oasis
Pagination is a more structured approach to a user interface pattern. It divides your huge datasets into multiple pages where each page has a distinctive start and end. This approach allows users to easily navigate where they are, and move to the next page when they want to. It is easier to keep track of what the user has seen and what is left to be seen. Hence, navigation is much more organized with Pagination in React.
While Pagination solves many of infinite scrolling limitations, itâs not without its demerits.
Letâs get a better understanding of the pros and cons of Pagination:
Pro: Better for Conversion
Pagination is ideal for situations where the user is âsearchingâ for something specific from a list of results and not endlessly scrolling content without any motive. Hence, when you visit ecommerce sites such as Amazon, youâll always find pagination in their product listing pages with the numbers tab at the bottom. Even online newspapers and magazines like The New York Times and discussion platforms like Reddit or Stack Overflow use pagination to display their threads and discussions.
Pro: Improved Performance
Pagination limits the number of items that get rendered on each page and loads only a single page at a time. This reduces the performance overhead and lag that infinite scroll implementations can experience with slower devices and limited bandwidth connections.
Pro: Improved Accessibility
Pagination is easier for people dependent on assistive technologies such as screen readers. Screen readers can easily identify and announce page changes which helps the visually impaired users to better navigate through the content while understanding the data structure.
Pro: Enhanced Predictability and Control
Pagination provides a clear and systematic navigation system for users. It can be done through numbered pages, arrows, or any other such design element that allows users to jump to a particular section, switch between different pages or go back to the specific product/service they wanted.
Con: Disruptions in User Flow
Pagination does put disruptions on the user flow, especially for React websites where the main goal is continuous browsing and discovery are the primary goals. Having to click the button âLoad Moreâ or numbered pages can cause interruptions which breaks the tendency of immersion.
Con: Wested Fetches
Pagination also focuses on pushing the most important and closer to the query results on the first few pages so users get instant access to what they are looking for. This can lead to situations where users might never navigate to pages beyond the 3rd or 4th count. This results in wasted server resources fetching data for pages that donât ever get viewed.
Con: Less Engaging for Discovery-Oriented Applications
Pagination provides a structured framework and this approach doesnât sit well with applications that want to promote continuous discovery and browsing. Imagine the UI of Pinterest if it asked you to change the page after one or two scrolls to view more Pins or ideas. That would be an absolute nightmare and kill the purpose of the app.
React Infinite Scrolling vs Pagination Use Cases
Both Infinite Scrolling and Pagination have different approaches to creating an engaging, user-friendly, and performance-oriented user experience. I believe that understanding the use cases and considerations for each approach is crucial for developers who want to optimize usability, accessibility, and performance in their React applications. Which is pretty much, every React developer ever.
Hence, I have outlined some of the most popular use cases and matched them with the most suitable approach, which can help you make a quick and informed decision next time youâre stuck in the same loop.
Use Pagination For
- Ecommerce Product Listings
- SERPs
- Discussion Forums
- Blog Posts/News Articles
- Data Tables
Use Infinite Scrolling For
- Social Media Feeds
- Real-Time Data Feeds
- Image Galleries
- Infinite Lists
React Infinite Scrolling vs Pagination Engagement
Infinite Scroll in React is designed to boost user engagement and increase the overall time visitors stay on your website. If you think your audience base consists of people who donât have a particular goal in mind, they could be easily kept busy with easy, digestible, and interruption-free content. Pagination is designed to help users reach their desired search results as soon as possible. Hence it wonât work best with apps that want to promote content discovery and exploration.
React Infinite Scrolling vs Pagination Ease of Use
If your React app is paginated it allows users to visit and navigate your site with ease. Also, returning customers get a sense of familiarity and comfort knowing your siteâs static layout. A successful pagination effort aims to reduce the number of clicks to reach their desired location and fulfill their goal of visiting the website.
On the contrary, if your site is better-suited to exploration and content discovery, infinite scrolling can help improve your ease of use significantly. It is fast, responsive, and highly intuitive. Discovery-based application users would appreciate the seamless user experience.
React Infinite Scrolling vs Pagination Implementation Ease
Generally, website builders provide default support for pagination for structuring your content. To implement pagination in React you need to track the current page number and number of items per page. Rendering the list of items based on the current page number can still be easily manageable. You can also make use of pagination libraries for React like Material-UI Pagination and Paginate to make the process even easier.
Most of the time pagination is available out of the box too. However, setting up support for infinite scrolling can be challenging and often requires the assistance of a reliable Reactjs development company that has access to skilled developers who can help you with your project.
How to Implement Pagination in React: Code Example
import React, { useState, useEffect } from "react";
import Posts from "./components/Posts";
import Pagination from "./components/Pagination";
import axios from "axios";
import "./style.css";
const App = () => {
const [posts, setPosts] = useState([]);
const [loading, setLoading] = useState(false);
const [currentPage, setCurrentPage] = useState(1);
const [postsPerPage] = useState(10);
useEffect(() => {
const fetchPosts = async () => {
setLoading(true);
const res = await axios.get("https://jsonplaceholder.typicode.com/posts");
setPosts(res.data);
setLoading(false);
};
fetchPosts();
}, []);
//âŻgetâŻcurrentâŻpost
const indexOfLastPost = currentPage * postsPerPage; //âŻ1âŻ*âŻ10âŻ=âŻ10
const indexOfFirstPost = indexOfLastPost - postsPerPage; //âŻ10âŻ-âŻ10âŻ=âŻ0
const currentPosts = posts.slice(indexOfFirstPost, indexOfLastPost); //âŻ0âŻtoâŻ10
const paginate = (pageNumber) => setCurrentPage(pageNumber);
return (
<div>
<h3> Api Pagination in React </h3>{" "}
<Posts posts={currentPosts} loading={loading} />{" "}
<Pagination
postsPerPage={postsPerPage}
totalPosts={posts.length}
paginate={paginate}
/>{" "}
</div>
);
};
export default App;
- Start by Import Necessary Modules:
- React: the core library for building React components.
- useState and useEffect: react hooks for managing states and side effects.
- Posts and Pagination: custom components likely defined in separate files - (
./components.Posts
) and (./components/Pagination
) - Axios: a popular React library for making HTTP requests to API
- ./style.css: an optional CSS file for application styling
- Define the Main App Component:
- This component will serve as the main entry point for your React app
- It makes use of
useState
hook for creating three state variables: - posts: an array that stores the fetched blog posts (initially empty)
- loading: a Boolean flag to indicate if data is fetched (initially false)
- currentPage: the current page number for pagination (starts at 1)
- It also sets a constant
postsPerPage
to define number of posts displayed per page. (for instance, 10 in this example).
- Fetch Posts on Component Mount (useEffect):
- The
useEffect
hook with an empty dependency array ([]) will run once the component mounts. - It defines an async function
fetchPosts
that: - Sets loading to true for indicating data fetching
- Makes a
GET
request using axios to theJSONPlaceholder
API endpoint (https://jsonplaceholder.typicode.com/posts). - Stores the response data (fetched posts) in the posts state variable with help of setPosts hook.
- Sets loading back to false to indicate data fetching completion.
- It calls
fetchPosts
inside theuseEffect
hook for triggering initial data fetch.
- Calculate Current Posts for Display Outside useEffect:
- This code snippet calculates the indices for the first and last post to display on the current page based on
postsPerPage
andcurrentPage
. - indexOfLastPost: The index of the last post +1 (since we are using zero-based indexing).
- indexofFirstPost: The index of the first post.
- Now we use the slice method for the posts array for extracting the subset of posts for the current page. The subsets are stored in the
currentPosts
variable.
- Handle Pagination (Paginate Function):
- The paginate function is a callback prop likely passed to the Pagination component.
- It takes the
pageNumber
argument and updates the currentPage state using setCurrentPage. This triggers re-rendering of the App component, recalculatingcurrentPosts
and reflecting the page change in the UI.
- Rendering the React Application UI:
- The App component returns the JSX file to define the UI structure:
- Heading: âAPI Pagination in Reactâ
- A Posts component passing
currentPosts
for displaying and loading state for conditional rendering. - A pagination component that provides the following props:
- postsPerPage: the number of posts per page (Fixed at 10).
- totalPosts: the total number of fetched posts(posts.length).
- pageinate: the callback function to handle page changes.
How to Implement Infinite Scrolling in React: Code Example
import { useEffect } from "react";
import { useInfiniteQuery } from "react-query";
import { useInView } from "react-intersection-observer";
import Todo from "./Todo";
import "./App.css";
function App() {
const { ref, inView } = useInView();
const LIMIT = 10;
const fetchTodos = async (page) => {
const response = await fetch(
`https://jsonplaceholder.typicode.com/todos?_page=${page}&_limit=${LIMIT}`,
);
return response.json();
};
const { data, hasNextPage, fetchNextPage, isFetchingNextPage } =
useInfiniteQuery("todos", ({ pageParam = 1 }) => fetchTodos(pageParam), {
getNextPageParam: (lastPage, allPages) => {
const nextPage =
lastPage.length === LIMIT ? allPages.length + 1 : undefined;
return nextPage;
},
});
useEffect(() => {
if (inView && hasNextPage) {
fetchNextPage();
}
}, [inView, fetchNextPage, hasNextPage]);
return (
<div className="app">
âŻâŻâŻâŻâŻâŻ
{data?.pages?.map((page) =>
page?.map((todo, i) => {
if (page.length === i + 1) {
return (
<Todo
{...(page.length === i + 1 && { ref: ref })}
key={todo.id}
todo={todo}
/>
);
}
return <Todo key={todo.id} todo={todo} />;
}),
)}
âŻâŻâŻâŻâŻâŻ{isFetchingNextPage && <h3>Loading...</h3>}
âŻâŻâŻâŻ
</div>
);
}
export default App;
- Start by importing necessary files
- Import
useEffect
from React for managing side effects in functional components. - useInfiniteQuery from react-query to fetch data progressively for infinite scrolling.
useInView
fromreact-intersection-observer:
Detects when an element enters the viewport.- Todo component (likely defined in a separate file
./Todo.js
): Renders individual TODO items. ./App.css
(optional): CSS styles for the application.
- App Component:
Defines the functional component App.
- Setup for Infinite Scrolling:
const { ref, inView } = useInView():
- Creates a reference and a state variable
inView
using useInView. This helps detect when the element referenced by ref enters the viewport. const LIMIT = 10:
Defines the number of TODO items fetched per page.
- Fetching TODOs:
- async function
fetchTodos(page):
- Defines an asynchronous function
fetchTodos
that takes a page number as input. - Constructs a URL using template literals to fetch data from the JSONPlaceholder API for the specified page and limit.
- Fetches the data using fetch and returns the parsed JSON response.
- Infinite Data Fetching with useInfiniteQuery:
-
const { data, hasNextPage, fetchNextPage, isFetchingNextPage } = useInfiniteQuery(...):
-
Uses useInfiniteQuery for infinite data fetching.
-
Queries data with the key "todos".
-
Provides a query function that takes an options object:
-
options.pageParam = 1
: Sets the initial page number (default 1). -
Calls
fetchTodos
with the currentpageParam
to fetch data.
This returns an object containing:
-
data
: The fetched TODO data (paginated). -
hasNextPage
: A boolean indicating if more pages are available. -
fetchNextPage
: A function to fetch the next page of data. -
isFetchingNextPage
: A boolean indicating if the next page is being fetched.
- Load More Data on Intersection:
useEffect(() => { ... }, [inView, fetchNextPage, hasNextPage])
:- A useEffect hook that runs whenever
inView, fetchNextPage, or hasNextPage
changes. - Checks if the element is in view (
inView
), there are more pages (hasNextPage
), and the next page is not currently being fetched (!isFetchingNextPage
). - If these conditions are met, calls
fetchNextPage
to load the next page of TODOs.
- Rendering Content:
- The component returns JSX to render the UI:
- A div with class "app" to contain the content.
- Iterates over data?.pages (if data exists) and then over each page's todo items:
- If it's the last TODO item in the page:
- Attaches the ref obtained from useInView to the Todo component, allowing detection when it enters the viewport (for triggering the next page fetch).
- Renders a Todo component for each TODO item, passing the todo data and a unique key.
- If
isFetchingNextPage
is true, shows a "Loading...â, shows a âLoadingâŚâ message.
Final Words
I believe both infinite scrolling and pagination offer viable options for handling large datasets in React applications. The optimal choice would depend on your specific project needs and the user experience you aim to achieve.
Here is a quick recap:
Infinite Scrolling is ideal for continuous, exploration-oriented content where users donât have a specific search item in mind. It promotes a seamless browsing experience but it can impact performance with huge datasets. Consider implementing techniques like lazy loading or virtualization to mitigate performance bottlenecks.
Pagination is better suited for goal-oriented applications where users are actively looking for specific content. It provides more control over navigation but at the cost of less immersion for continuous content.