Promptless AI is here soon - Production-ready contextual code. Don't just take our word for it. Know more
Know More

Performance First: A Deep Dive into Data Fetching in React

No items found.

Rakesh Purohit

ReactJS Developer Advocate
July 31, 2023

Rakesh Purohit

July 31, 2023

Hello, fellow React enthusiasts! Ever found yourself tangled in the web of data fetching in React? You're not alone. It's a jungle out there, with various libraries, techniques, and React's lifecycle to consider. But fear not! Today, we're going to embark on a journey to unravel the mysteries of performance-first data fetching in React. So, buckle up and let's dive right in!

The ABCs of Performance-First Data Fetching in React

Before we get our hands dirty with code, let's set the stage by understanding the basics.

What is Performance-First Data Fetching?

Performance-first data fetching is a technique that focuses on optimizing the way we fetch data in React applications. It's all about ensuring that our app provides a swift, seamless user experience, without compromising on performance.

Why is it Important?

Imagine you're waiting for your favorite website to load. But it's taking forever, and you're growing impatient. You wouldn't want your users to feel the same way, right? That's precisely why performance-first data fetching is crucial. It ensures that your app loads quickly, providing a smooth user experience.

Let's Talk Code

Now that we've covered the basics, let's roll up our sleeves and delve into some code. Remember, our goal here is to fetch data effectively while keeping performance in mind.

Fetching Data the React Way

Fetching data in React can be done using the useEffect hook. Here's a simple example:

import React, { useState, useEffect } from 'react';

const MyComponent = () => {
  const [data, setData] = useState(null);

  useEffect(() => {
      .then(response => response.json())
      .then(data => setData(data));
  }, []);

  return data ? <div>{data}</div> : <div>Loading...</div>;

Image Description: A basic React component using the useEffect hook to fetch data from an API endpoint.

In this example, we're using the fetch function to retrieve data from an API. The useEffect hook ensures that this happens when the component mounts.

The Performance-First Approach

While the above example works, it doesn't consider performance. If our API takes a long time to respond, our users will be stuck staring at a loading screen. Not the best user experience, right? So, how can we improve this? Let's explore.

1. Parallel Data Fetching

One way to optimize our data fetching is by making our requests in parallel. This means sending multiple requests at the same time, rather than waiting for one to finish before starting the next. Here's how you can do it:

import React, { useState, useEffect } from 'react';const MyComponent = () => {  const [data1, setData1] = useState(null);  const [data2, setData2] = useState(null);  useEffect(() => {    Promise.all([      fetch('/api/data1').then(response => response.json()),      fetch('/api/data2').then(response => response.json())    ]).then(([data1, data2]) => {      setData1(data1);      setData2(data2);    });  }, []);  return data1 && data2 ? (    
  ) : (    

Image Description: A React component fetching two sets of data in parallel using Promise.all.

In this example, we're using Promise.all to send two requests in parallel. This significantly reduces the total time it takes to fetch all our data, improving our app's performance.

2. Prioritizing Critical Data

Another performance-first approach to data fetching in React is prioritizing critical data. This means fetching and rendering the most important data first, while the less important data loads in the background.

import React, { useState, useEffect } from 'react';

const MyComponent = () => {
  const [criticalData, setCriticalData] = useState(null);
  const [nonCriticalData, setNonCriticalData] = useState(null);

  useEffect(() => {
      .then(response => response.json())
      .then(data => setCriticalData(data));

      .then(response => response.json())
      .then(data => setNonCriticalData(data));
  }, []);

  return (
      {criticalData ? <div>{criticalData}</div> : <div>Loading critical data...</div>}
      {nonCriticalData ? <div>{nonCriticalData}</div> : <div>Loading non-critical data...</div>}

Image Description: A React component fetching and rendering critical data before non-critical data.

In this example, we're fetching and rendering the critical data before the non-critical data. This way, our users can start interacting with the most important parts of our app while the rest of the data is still loading.

Sequential Data Fetching

In React, when fetching sequential data, you typically want to load one piece of data after another to ensure smooth user experience and avoid overwhelming the application with a large amount of data at once. One common way to achieve this is by using asynchronous functions and the useEffect hook. Additionally, we can use Markdown to display the fetched data in a user-friendly format.

Let's assume you want to fetch and display a list of articles, each written in Markdown format. Here's an example of how you can achieve sequential data fetching and rendering using React:

  1. Set up the component and state variables:

import React, { useState, useEffect } from 'react';

const ArticleList = () => {
  const [articles, setArticles] = useState([]);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
  }, []);

  const fetchArticlesSequentially = async () => {
    const articleIds = [1, 2, 3, 4]; // Sample article IDs, replace with your data source
    const fetchedArticles = [];

    for (const articleId of articleIds) {
      const response = await fetch(`/api/articles/${articleId}`); // Replace with your API endpoint
      const articleData = await response.json();


  return (
      {loading ? (
        <p>Loading ... </p>
      ) : (, index) => (
          <div key={index}>
            <div dangerouslySetInnerHTML={{ __html: article.content }}></div>

export default ArticleList;

In the example above, we use the useState hook to store the fetched articles and a loading state. We use the useEffect hook with an empty dependency array ([]) to fetch the articles sequentially when the component mounts.

The fetchArticlesSequentially function fetches each article by iterating through the articleIds array and then appends the fetched data to the fetchedArticles array. We use setArticles to update the state with the fetched articles, and setLoading to indicate that the fetching process is complete.

Within the return statement, we check the loading state to either display a loading message or render the articles using the map function. The dangerouslySetInnerHTML attribute allows us to render the Markdown content as HTML within the div.

Remember to replace the articleIds and the API endpoint (/api/articles/) with the appropriate values for your specific use case.

This way, the articles will be fetched one by one, and each will be displayed as soon as it is available, ensuring a smooth user experience.

Introducing WiseGPT: Your Coding Assistant

WiseGPT logo

Before we wrap up, let's talk about a tool that can help you write performance-first data fetching code in React - WiseGPT.

WiseGPT is an IDE plug-in for VS Code and IntelliJ IDEA which serves as a prompt list generative AI for developers. It's like having your own personal coding assistant! Here's what it brings to the table:

  • Importing Postman Collections: With WiseGPT, you can import your Postman collections and it will help you write performance data fetching code in no time.
  • Mirroring Your Coding Style: WiseGPT learns your coding style and structure, helping you write code that feels authentically yours.
  • Adding Meaningful Comments: It adds meaningful comments to your code, reducing technical debt and making your code easier to understand.
  • Generating Code in Multiple Files: WiseGPT can generate code in multiple files without an output token limit, making it a versatile tool for large projects.
  • Automatic Handling: WiseGPT automatically handles the generation of code, freeing you up to focus on more complex tasks.


Performance-first data fetching in React is not just a technique, but a mindset. It's about prioritizing your users' experience and ensuring that your app runs as smoothly and quickly as possible. By making your requests in parallel, prioritizing critical data, and using tools like WiseGPT, you can optimize your data fetching and take your React apps to the next level.

Remember, the best performance is not achieved by using the most advanced tools or techniques, but by understanding the fundamentals and applying them effectively. So, keep learning, keep experimenting, and keep pushing the boundaries of what's possible with React!

So, that's a wrap! Hopefully, you've found this deep dive into performance-first data fetching in React insightful. Until next time, happy coding! 🚀

Frequently Asked Questions (FAQ) on Performance First Data Fetching in React

What is data fetching in React?

Data fetching in React refers to the process of requesting and receiving data from a server or an API. This is a crucial aspect of web development as it allows your app to access and display dynamic data. You can fetch data using various methods, such as the Fetch API or libraries like Axios.

How do I start fetching data in React?

To start fetching data, you typically use the `fetch` function inside an async function. This fetching function sends a request to the server via the fetch API and waits for the response. Here's an example:

const fetchData = async () => {
  const response = await fetch(url);
  const data = await response.json();
  return data;

How do I handle data fetching in a parent component?

Handling data fetching in a parent component involves fetching the data in the parent and passing it down to the child components. This is a common pattern that allows child components to access the fetched data without making their own requests.

What is the role of `const data` in data fetching?

`const data` is used to store the data fetched from the server. This data is typically returned as a JSON object which can then be parsed and stored in the `const data` variable.

What is the loading state in data fetching?

The loading state is used to indicate whether the app is currently fetching data. This state is typically set to `true` when the fetch request begins and is set to `false` when the data has been received and is ready to be rendered.

How can I handle errors during data fetching?

Errors during data fetching can be handled using a `try-catch` block. This allows you to catch any http errors that occur during the fetch request and handle them appropriately, such as displaying an error message to the user.

What is the role of the Fetch API in data fetching?

The Fetch API provides a powerful, promise-based method to make http requests from the browser. It is used to request data from the server, handle the response returned, and catch any errors that occur during this process.

How can I handle data fetching with optional parameters?

Optional parameters can be included in the URL used in the fetch request. These parameters can be used to filter or sort the data returned from the server.

What is the role of the `async function` in data fetching?

The `async function` is used to handle the asynchronous nature of data fetching. It allows you to use the `await` keyword to pause the execution of the function until the fetch request has completed and the data has been returned.

How can I prevent blocking rendering during data fetching?

To prevent blocking rendering, you can use the `useEffect` hook to fetch data in the background after the first render of the component. This allows the component to render with the initial state before the data is fetched, preventing blocking rendering.

How can I cache data from a fetch request?

Caching data from a fetch request can be done using various methods, such as using the browser's Cache API or libraries like SWR or React Query. Caching allows you to store fetched data so that subsequent requests for the same data can be served faster.

What is the role of `const response` in data fetching?

`const response` is used to store the response returned from the fetch request. This response includes the fetched data as well as other information about the request, such as the status code and headers.

How can I fetch data from a GraphQL server?

Fetching data from a GraphQL server can be done using the Fetch API or libraries like Apollo Client. The fetch request will include a query that specifies the data you want to fetch from the server.

How can I re-run the data fetching function?

The data fetching function can be re-run by updating a state or prop that is included in the dependency array of the `useEffect` hook that contains the fetch function. This will cause the `useEffect` hook to run again, triggering another fetch request.

How can I handle the loading state when fetching data?

The loading state can be handled using React's state. You can set the loading state to `true` when the fetch request begins and set it to `false` when the data has been fetched and is ready to be rendered. This allows you to display a loading indicator to the user while the data is being fetched.

What is the role of the `catch` block in data fetching?

The `catch` block is used to handle any errors that occur during data fetching.

Frequently asked questions

Frequently asked questions

No items found.