useTransition marks state updates as non-urgent, allowing React to interrupt rendering and keep the UI responsive.
Code:
1import { useState, useTransition } from "react";23function SearchResults() {4 const [query, setQuery] = useState("");5 const [results, setResults] = useState<string[]>([]);6 const [isPending, startTransition] = useTransition();78 const handleSearch = (e) => {9 const value = e.target.value;10 setQuery(value); // Urgent: update input immediately1112 startTransition(() => {13 // Non-urgent: expensive filtering can be interrupted14 setResults(filterLargeList(value));15 });16 };1718 return (19 <div>20 <input value={query} onChange={handleSearch} />21 <div style={{ opacity: isPending ? 0.6 : 1 }}>22 {results.map(r => <div key={r}>{r}</div>)}23 </div>24 </div>25 );26}
How it improves UX:
When to use:
Key points:
isPending — true while transition runs