DEV Community

ajay-8192
ajay-8192

Posted on

`useTransition` for Smoother API Calls in React

Mini-Post: useTransition for Smoother API Calls in React

React 18 introduced a powerful new hook called useTransition. Its primary purpose is to differentiate between urgent updates (like typing in an input) and non-urgent updates (like fetching data or rendering a large list). This can significantly improve the perceived responsiveness of your application.

What is useTransition?

useTransition provides a way to mark certain state updates as "transitions." During a transition, React will keep the old UI visible and interactive while it prepares the new UI in the background. Once the new UI is ready, it will seamlessly swap it in. This avoids jarring loading states or blocking the main thread for less critical operations.

How to use it for API Calls

API calls are a perfect candidate for useTransition because they often involve a delay, and you wouldn't want to block the user interface while waiting for data.

Here's a common pattern:

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

function ProductList() {
  const [products, setProducts] = useState([]);
  const [isLoading, setIsLoading] = useState(false);
  const [isPending, startTransition] = useTransition();

  const fetchProducts = async () => {
    setIsLoading(true); // Indicate the start of data fetching
    startTransition(async () => {
      // Mark this update as a transition
      const response = await fetch('/api/products');
      const data = await response.json();
      setProducts(data);
      setIsLoading(false); // Data fetching is complete
    });
  };

  return (
    <div>
      <button onClick={fetchProducts} disabled={isLoading}>
        {isLoading ? 'Loading...' : 'Fetch Products'}
      </button>

      {isPending && <p>Preparing new product list...</p>} {/* Optional pending indicator */}

      <ul>
        {products.map(product => (
          <li key={product.id}>{product.name}</li>
        ))}
      </ul>
    </div>
  );
}

export default ProductList;
Enter fullscreen mode Exit fullscreen mode

Explanation:

  1. const [isPending, startTransition] = useTransition();:
  * `isPending`: A boolean that tells you if a transition is currently in progress. You can use this to show a lightweight, non-blocking indicator (e.g., a "Preparing..." message) instead of a full spinner that blocks the UI.
  * `startTransition`: A function that you wrap your non-urgent state updates in.
Enter fullscreen mode Exit fullscreen mode
  1. startTransition(async () => { ... });:
  * Inside this callback, you perform your API call and update the state (setProducts). React knows that these updates are part of a transition.

  • While the API call is in progress and setProducts is preparing the new UI, the isPending flag will be true, allowing you to show a subtle indicator. The old products list will remain visible and interactive until the new data is ready.
Enter fullscreen mode Exit fullscreen mode

Benefits:

  • Improved User Experience: The UI remains responsive and interactive even during data fetching, preventing frustrating freezes.
  • Smoother Transitions: Users perceive a smoother flow as new data is seamlessly integrated without abrupt loading screens.
  • Clearer Intent: It explicitly tells React which updates are critical and which can be deferred.

By leveraging useTransition, you can create a much more fluid and user-friendly experience when dealing with data fetching and other potentially slow operations in your React applications.


Top comments (0)