useTransition
useTransition
is a React Hook that lets you render a part of the UI in the background.
This is how the official React documentation defines the hook.
In React, we can mark certain state updates as transitions.
When we talk about the "background," we’re referring to asynchronous tasks—those that are handled by different threads or workers and later passed to the event loop to be executed on the main call stack.
How to Use It
The useTransition
hook returns an array with two values:
- isPending – a boolean indicating whether the transition is in progress
- startTransition – a function used to wrap the state update logic (called an action)
By convention, the callback you pass to startTransition
is often named action or ends with the word Action.
Example:
function SubmitButton({ submitAction }) {
const [isPending, startTransition] = useTransition();
return (
<button
disabled={isPending}
onClick={() => {
startTransition(async () => {
await submitAction();
});
}}
>
Submit
</button>
);
}
By using the startTransition
function, we define actions that trigger state changes.
This lets React manage them in a non-blocking way, improving the user experience—particularly by reducing unnecessary re-renders and smoothing out rapid user interactions.
For instance, when a user clicks to switch tabs but quickly selects another one, React can cancel the first transition and focus on rendering the most recent action instead.
Once the transitions complete, React will update the UI with the final state resulting from those actions.
useTransition ≠ Debounce
It's important to note that useTransition
is not the same as debouncing.
A debounced function delays execution until a fixed period of inactivity has passed.
In contrast, useTransition
doesn't wait—it starts the operation immediately but allows React to interrupt it if new updates come in.
Why is this important? For example, consider when we want to use one of these approaches to handle a request:
-
useTransition
executes a request each time a change occurs but may cancel any ongoing request if a newer update arrives. - A debounced function runs only after the debounce delay has passed, ignoring intermediate triggers.
So while both help manage rapid updates, debounce waits for the final input, while useTransition
handles each one but prioritizes the most recent.
ps: beautiful cover image by Wilhelm Gunkel on Unsplash
Top comments (0)