fervor [>]CODING & CURIOSITY
FERVOR LEARNING SYSTEMTUTORIALS
← Next.js

Next.js / 5 MIN READ

useSWR

Let's dive into a tutorial on using useSWR in Next.js, which will simplify fetching and managing data with sleek, automatic data revalidation. What is useS

From the original Fervor library. Examples may use older package versions.

Let’s dive into a tutorial on using useSWR in Next.js, which will simplify fetching and managing data with sleek, automatic data revalidation.

What is useSWR?

useSWR is a React hook from the SWR (stale-while-revalidate) library developed by Vercel. It’s designed to handle data fetching, caching, and revalidation in web applications built with React, including Next.js. The name “stale-while-revalidate” refers to the strategy of serving old (stale) data until new data is fetched (revalidated).

Why use useSWR in Next.js?

Next.js is a powerful framework for building React applications that support server-side rendering, static site generation, and more. When combined with useSWR, you get:

  • Fast Loading Times: SWR caches the data on the client side, allowing immediate rendering of cached data and reducing load time.
  • Real-time Updates: SWR automatically revalidates the cache when there are updates, keeping the UI fresh.
  • Simplified Code: Reduces the boilerplate code needed to manage data fetching and state management.

How to Set Up SWR in Next.js

Here’s a step-by-step guide on how to set it up:

Step 1: Install SWR

First, you need to add SWR to your Next.js project. Run the following command in your project directory:

npm install swr

Step 2: Create a Data Fetching Function

SWR needs a function to fetch data from a given API. You can use native fetch or any data fetching library like Axios. Here’s an example using native fetch:

const fetcher = async (url) => {
    const response = await fetch(url);
    if (!response.ok) {
        throw new Error('An error occurred while fetching the data.');
    }
    return response.json();
};

Step 3: Use useSWR in Your Component

Now, you can use useSWR in your Next.js component to fetch data. Here’s a simple example:

import useSWR from 'swr';

function Profile() {
    const { data, error } = useSWR('/api/user', fetcher);

    if (error) return <div>Failed to load</div>;
    if (!data) return <div>Loading...</div>;
    return <div>Hello, {data.name}!</div>;
}

In this example:

  • /api/user is the URL where your data is fetched from.
  • fetcher is the function we defined earlier to fetch the data.
  • data will hold the fetched data, and error will hold any error that occurs during fetching.

Best Practices

  • Error Handling: Always handle errors in your fetching as shown above.
  • Dependencies: Only include necessary dependencies in the useSWR key array to avoid unnecessary revalidations.
  • Global Configuration: Consider setting up a global SWR configuration using SWRConfig to apply common settings across all uses of useSWR in your app.
import { SWRConfig } from 'swr';

function App() {
  return (
    <SWRConfig value={{
      fetcher: (url) => fetch(url).then(r => r.json()),
      onError: (error) => {
        console.log("Error while fetching:", error);
      }
    }}>
      <MyComponent />
    </SWRConfig>
  );
}

This setup will help you keep your Next.js application’s data fetching logic clean, efficient, and maintainable. Feel free to ask more if you need further details or a specific scenario explored!

Bonus Cool things to do with SWR

SWR is a versatile tool for data fetching in React applications, and it comes packed with features that can make your development experience both smoother and more powerful. Here are some cool things you can do with SWR:

1. Automatic Polling

SWR allows you to set up polling on an interval very easily, which is great for data that needs to be updated frequently, like live sports scores or real-time user statuses. You can use the refreshInterval option to specify how often SWR should fetch the data again.

const { data, error } = useSWR('/api/news', fetcher, { refreshInterval: 5000 });

This will re-fetch the news data every 5 seconds.

2. Dependent Fetching

You can chain requests using SWR by making one request depend on another. This is particularly useful when you need a piece of data from one call to make another. For example, fetching user details only after getting the user ID from a login response.

const { data: user } = useSWR('/api/login', loginFetcher);
const { data: userDetails } = useSWR(() => `/api/user/${user.id}`, userDetailsFetcher);

Here, userDetails won’t be fetched until user.id is available.

3. Focus Revalidation

SWR automatically revalidates data when you switch back to a browser tab that’s displaying stale data. This ensures users always see the most up-to-date information without having to manually refresh the page. This is enabled by default but can be customized or turned off.

4. Local Mutation and Optimistic UI

SWR provides a mutate function that lets you locally modify cached data, which is perfect for instant UI updates. For instance, when a user submits a form, you can optimistically update the local cache to reflect the changes, enhancing the perceived performance:

import { mutate } from 'swr';

// Optimistically update the cache and then revalidate
mutate('/api/comments', [...data, newComment], false);
await postNewComment(newComment);
mutate('/api/comments');

5. Conditional Fetching

You can decide when to fetch data based on any logic, such as feature flags, user permissions, or application state. This prevents unnecessary requests and optimizes your application performance.

const { data, error } = useSWR(shouldFetch ? '/api/data' : null, fetcher);

6. Pagination and Infinite Loading

SWR supports pagination and infinite loading out of the box with the useSWRInfinite hook. This makes it easy to implement a “load more” feature or handle large datasets efficiently by only fetching data as needed.

const { data, size, setSize } = useSWRInfinite(
  index => `/api/items?page=${index}`,
  fetcher
);

const loadMore = () => {
  setSize(size + 1);
};

7. Global Configuration

Set global defaults for all SWR hooks in your application with SWRConfig. This is a convenient way to maintain consistent settings, such as error handling and fetcher functions, across your app.

<SWRConfig value={{ fetcher: fetcherFunction, onError: errorHandler }}>
  <App />
</SWRConfig>

8. Middleware Extensions

Extend SWR’s functionality using middleware, allowing you to add features like retry mechanisms, request deduplication, or enhanced logging without altering the core fetching logic.

useSWR(key, fetcher, {
  use: [dedupingInterval(2000), logger, retry]
});

These features showcase how SWR can simplify data fetching while also making your React apps more efficient and user-friendly. With SWR, you can handle real-world scenarios more effectively, improving both developer and user experiences. If you have any specific use case in mind, I’d love to help you figure out how SWR can be leveraged for that!

Keep your curiosity going.Explore more Next.js →
287 TUTORIALS · 22 TOPICSREADY