bugl
bugl
HomeLearnPatternsPathsSearchPremium
HomeLearnPatternsPaths
Learn/React/React Core
React•React Core

React Transitions

What is useTransition?

The useTransition hook helps you keep your React app responsive during heavy updates.

It lets you mark some state updates as "non-urgent", allowing other, more urgent updates to happen first.

When to Use Transitions?

Use transitions when you have

  • A slow operation that might freeze the UI
  • Updates that aren't immediately critical
  • Search results that take time to display

Basic Example

Here's a simple example showing how to use transitions in a search feature:

Example

import { useState, useTransition } from 'react';
function SearchBar() {
 const [text, setText] = useState('');
 const [results, setResults] = useState('');
 const [isPending, startTransition] = useTransition();
 const handleChange = (e) => {
 // Urgent: Update input right away setText(e.target.value);
 // Non-urgent: Update search results startTransition(() => { setResults(e.target.value);
 });
};
return ( <div> <input value={text} onChange={handleChange} /> {isPending ? ( <p>Loading...</p> ) : ( <p>Search results for: {results}</p> )}
</div> );
}

In this example

  • The input field updates immediately (urgent update)
  • The search results update is marked as a transition (non-urgent)
  • The loading message shows while the transition is pending

Real-World Example

Here's a more practical example with a slow search feature:

Example

import { useState, useTransition } from 'react';
function SearchResults({ query }) {
 // Simulate slow search results
 const items = [];
 if (query) {
 for (let i = 0; i < 1000; i++) {
 items.push(<li key={i}>Result for {query} - {i}</li>);
 }
 }
 return <ul>{items}</ul>;
}
function App() {
 const [input, setInput] = useState('');
 const [query, setQuery] = useState('');
 const [isPending, startTransition] = useTransition();
 const handleChange = (e) => {
 // Urgent: Update input field setInput(e.target.value);
 // Non-urgent: Update search results startTransition(() => { setQuery(e.target.value);
 });
};
return ( <div> <input
type="text"
value={input}
onChange={handleChange}
placeholder="Type to search..."
/> {isPending && <p>Loading results...</p>}
<SearchResults query={query} /> </div> );
}

How this example works

  • When you type in the input field, it updates immediately
  • The search results update is wrapped in startTransition
  • While the results are updating, isPending is true
  • The UI stays responsive even with many results

useTransition Hook

The useTransition hook returns two items

  • isPending : tells you if a transition is active
  • startTransition : function to mark updates as transitions

Note

Use transitions only for non-urgent updates. For example, typing in an input field should be urgent, but filtering a large list can be a transition.

Previous

React Router

Next

React forwardRef

This chapter

Overview
45

Lessons

142m

Read time

1. React Tutorial2. React Introduction3. React Getting Started4. Your First React App5. React Render HTML6. Upgrade React7. React ES68. React ES6 Classes9. React ES6 Arrow Functions10. React ES6 Variables11. JavaScript Array map()12. React ES6 Destructuring13. React ES6 Spread Operator14. React ES6 Modules15. React ES6 Ternary Operator16. React ES6 Template Strings17. React JSX18. React JSX Expressions19. React JSX Attributes20. React JSX If Statements21. React Components22. React Class Components23. React Props24. React Destructuring Props25. React Props Children26. React Events27. React Conditional Rendering28. React Lists29. React Forms30. React Submit Forms31. React Forms - Textarea32. React Forms - Select33. React Forms - Multiple Input Fields34. React Forms - Checkbox35. React Forms - Radio36. React Portals37. React Suspense38. Styling React Using CSS39. React CSS Modules40. React CSS-in-JS41. React Router42. React Transitions43. React forwardRef44. React Higher Order Components45. React Sass Styling

On this page

What is useTransition?When to Use Transitions?Basic ExampleReal-World ExampleuseTransition Hook