close icon
daily.dev platform

Discover more from daily.dev

Personalized news feed, dev communities and search, much better than what’s out there. Maybe ;)

Start reading - Free forever
Continue reading >

From Zero to Hero: UseQuery React Tutorial

From Zero to Hero: UseQuery React Tutorial
Author
Nimrod Kramer
Related tags on daily.dev
toc
Table of contents
arrow-down

🎯

Learn how to use React Query's useQuery feature to fetch, cache, and update data in your React apps. Explore advanced features, error handling, and debugging with React Query Devtools.

Getting started with useQuery in React Query can significantly enhance your React app's data handling capabilities. Here’s a quick summary of what you’ll learn:

  • How to seamlessly integrate React Query into your project for efficient data fetching.
  • Utilizing the useQuery hook for fetching, caching, and automatically updating your app's data.
  • Optimizing your app's performance by leveraging React Query’s caching and background refetching features.
  • Error handling and loading states to improve user experience during data fetching.
  • Advanced features like pagination support, data deduplication, and configuring query caching for more complex scenarios.
  • Debugging with React Query Devtools for a smoother development process.

This guide is crafted to equip you with the knowledge to implement useQuery in your React applications, making data fetching and management a breeze. Whether you’re fetching data for the first time or looking to optimize existing fetch requests, you’ll find valuable insights and practical examples to get you from zero to hero in no time.

React Fundamentals

  • You should know the basics of React, like how to use components, props, state, and hooks.
  • You've built and shown React components on the screen before.
  • You're comfortable with React hooks such as useState and useEffect.

JavaScript Knowledge

JavaScript Knowledge

  • You're good with JavaScript, understanding its syntax and features.
  • You're okay with working on concepts like promises and async/await.
  • You can handle writing code that waits for something to happen (asynchronous code).

Node.js and npm

Node.js and npm

  • Make sure you have the latest Node.js and npm installed.
  • You know how to kick off a new React project using npx create-react-app.
  • You understand how to add and manage npm packages in your project.

With these essentials under your belt, you're ready to tackle React Query and the useQuery hook in our tutorial. Let's dive in!

Understanding React Query

React Query

React Query is a tool that makes it easier to work with data in React apps. It helps with three main things when dealing with data:

  • Fetching data - With React Query, you use something called useQuery to grab data from the internet. It handles the tricky parts like showing loading messages, dealing with errors, saving data for later, and getting fresh data automatically.
  • Caching data - It saves data so your app can quickly show things without asking for the same data over and over. This makes your app feel snappier.
  • Managing asynchronous state - React Query keeps track of the data that's coming and going so your components can just focus on showing things to the user.

In short, React Query handles:

  • Saving data so it doesn't keep asking for the same thing
  • Getting new data in the background so what you see is always current
  • Making sure it doesn't ask for the same thing more than once
  • Making things quicker by managing how and when data is asked for
  • Loading multiple data sources at once for faster display
  • Giving you tools to see what's happening with your data requests

This means you can spend more time making your app look and work great instead of figuring out how to manage data.

Here's why React Query is helpful:

Simple Data Fetching

The useQuery hook makes it easy to get and show data without having to deal with the usual headaches of loading and error messages.

Fast Stale-While-Revalidate Caching

Data is kept saved while new data is fetched in the background, so your app can quickly show old data while updating.

Automatic Background Refetching

When you go back to your app, it automatically checks for new data so everything is up-to-date.

Parallel Queries

You can get several pieces of data at once, which makes everything load faster.

Request Deduplication

If you ask for the same data more than once, React Query is smart enough not to repeat the same request.

Powerful DevTools

React Query has tools that let you see exactly how your data fetching is working, making it easier to spot and fix issues.

Next, we'll look at how to add React Query to your project and start using the useQuery hook to fetch data.

Getting Started

Starting to use React Query in your React apps for fetching, caching, and updating data is straightforward. First, we need to add React Query to our project and set it up properly.

Installation

To add React Query, run this command in your project:

npm install react-query

Or if you prefer Yarn:

yarn add react-query

Importing and Setup

Next, bring in QueryClientProvider and QueryClient from react-query into your file:

import { QueryClient, QueryClientProvider } from 'react-query';

Create a QueryClient like this:

const queryClient = new QueryClient();

Now, make sure your App component is wrapped with QueryClientProvider, giving it the client as a prop:

<QueryClientProvider client={queryClient}>
  <App />
</QueryClientProvider>

This step is crucial because it lets you use React Query's features throughout your app.

Configure React Query Client

You have the option to tweak QueryClient settings for things like:

  • defaultOptions - To set up common settings for your queries
  • queries - To manage how queries prefetch or cache
  • mutationCache - To adjust settings for mutation caching

For instance:

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      staleTime: Infinity,
    },
  },
});

Here, we're setting the stale time to infinity, which means the data will stay cached without needing to be refreshed.

With React Query now in your project and everything set up, you're all set to start using its hooks like useQuery to manage data in your app!

Fetching Data with useQuery

useQuery Basics

The useQuery hook is a straightforward way to grab data in your React apps using React Query. Here's what you need to know about it:

  • You give it a unique query key (like 'todos' or 'user'), which is just a name to remember the query by.
  • It requires a query function that knows how to fetch your data and returns a promise.
  • It gives back an object with helpful info like:
    • data - the fetched data
    • isLoading - tells you if it's still fetching
    • error - tells you if something went wrong

A simple example looks like this:

const { data, isLoading, error } = useQuery('todos', fetchTodos);

Here, we're asking for 'todos' data using a fetchTodos function.

Making Requests

Let's fetch some data. We'll get a list of tasks from an example API:

function Todos() {
  const { data, isLoading } = useQuery('todos', async () => {
    const res = await fetch('https://jsonplaceholder.typicode.com/todos');
    return res.json();
  });

  if (isLoading) {
    return <span>Loading...</span>
  }

  return (
    <ul>
      {data.map(todo => (
        <li key={todo.id}>{todo.title}</li>  
      ))}
    </ul>
  );
}

We tell useQuery we want 'todos' and provide a function that:

  • Gets the data from the API
  • Waits for the data and then gives it back

If it's still loading, we show a 'Loading...' message. Once we have the data, we show the tasks.

Managing Loading States

useQuery gives us more ways to handle loading, like:

  • isIdle - It hasn't started fetching yet
  • isLoading - It's fetching
  • isSuccess - It got the data
  • isError - Something went wrong

For example:

function Todos() {
  const { isLoading, isError, data } = useQuery('todos', fetchTodos);

  if (isLoading) {
    return <span>Loading...</span>;
  }

  if (isError) {
    return <span>Error!</span>;
  }

  return (
    // show data
  ); 
}

This makes it easy to manage different states of fetching.

Handling Errors

If there's an error, we can show it using the error property:

function Todos() { 
  const { isError, error } = useQuery('todos', fetchTodos);

  if (isError) {
    return <span>Error: {error.message}</span>;  
  }

  // ...
}

This way, we can easily tell users if something went wrong while fetching.

With useQuery, fetching, caching, and updating data in React becomes much simpler.

sbb-itb-bfaad5b

Advanced useQuery

React Query's useQuery hook gives you a bunch of cool advanced features for getting data in your React apps. Let's dive into some of these features.

Configurable Query Caching

A big plus of useQuery is how it stores data you've fetched before. Basically, if you ask for the same data again, React Query quickly gives you the stored data while quietly updating it in the background.

You can tweak how this storage works:

useQuery('todos', fetchTodos, {
  cacheTime: 5000, // keeps data stored for 5 seconds
  staleTime: 10000, // serves old data for 10 seconds
})
  • cacheTime - How long to keep the data stored
  • staleTime - How long to keep using old data

This smart storing of data helps make your web apps faster.

Automatic Background Refetching

useQuery also automatically updates your data in the background when it's needed. This means when someone comes back to your app after a break, useQuery updates all the stored data without them noticing. They see the old data first, then the updated data replaces it.

This happens without you having to do anything!

Powerful Pagination Support

A lot of times, you need to fetch data page by page. useQuery has a built-in way to handle this using the keepPreviousData option:

useQuery(['projects', cursor], fetchProjects, {
  keepPreviousData: true,
})

With keepPreviousData on, when you move to the next page, the data from the previous page stays put. This makes moving through pages smooth without any repeats.

Request Deduplication

If you end up asking for the same data more than once at the same time, useQuery is smart and only makes one request. Then, it shares the data from that one request with all the places that asked for it.

This stops unnecessary repeat requests and keeps your app running smoothly.

In short, useQuery has a lot of handy features like storing data, updating it without bothering the user, handling pages of data, and not repeating requests. Getting good at using these features will really help your React apps shine.

Debugging with React Query Devtools

React Query has some really helpful tools for checking and fixing your data fetching. These tools let you see what's happening with your data in real time.

Enabling Devtools

First, you need to add the Devtools to your app. Here's how:

import { ReactQueryDevtools } from 'react-query/devtools';

function App() {
  return (
    <>
      <MyApp />
      <ReactQueryDevtools initialIsOpen={false} />
    </>
  )
}

This adds a panel to your app that you can open or close, showing you the Devtools.

Query Inspector

The Query Inspector shows you a list of all the data fetching happening right now. It tells you:

  • What you're asking for
  • If it's loading or if there's an error
  • How long it takes
  • The data you got back
  • How often it's checking for new data

You can click on any item to see more info and even ask it to fetch the data again. This is super helpful for fixing issues with specific data fetching.

Mutation Inspector

The Mutation Inspector does something similar for mutations. It shows you details like what the mutation does, any errors, and more.

Advanced Capabilities

Devtools also have some advanced features, like:

  • Writing down details and errors
  • Trying out different settings
  • Seeing what happens if you're offline
  • Stopping or starting data fetching
  • Managing how much data you're storing

These tools give you a lot of control and help you understand and fix issues.

Conclusion

Using the React Query Devtools makes it much easier to see and fix problems with how your app gets data. They give you a clear view of what's going on and let you manage data fetching more effectively. It's a good idea to use these tools to keep your app running smoothly.

Conclusion

The useQuery feature in React Query makes handling data in React apps much easier. It comes with cool tools that do a lot of the heavy lifting for you.

Here are the main points to keep in mind:

  • useQuery helps you get data with just a name and a function that knows how to fetch it.
  • It deals with loading, errors, saving data, and getting fresh data all by itself.
  • You can change how it saves data to make sure you always have the latest info.
  • It has smart ways to prevent asking for the same data twice and to handle paging through data.
  • The React Query Devtools let you peek behind the scenes to see how data fetching is going.

For more info on React Query, you might want to check out:

With useQuery and React Query, managing data in React becomes a lot simpler. Keep exploring and happy coding!

Related posts

Why not level up your reading with

Stay up-to-date with the latest developer news every time you open a new tab.

Read more