useDeferredValue defers re-rendering of expensive parts of the UI.
Code:
1import { useState, useDeferredValue, useMemo } from "react";23function SearchResults({ query }: { query: string }) {4 const deferredQuery = useDeferredValue(query);5 const isStale = query !== deferredQuery;67 const results = useMemo(() => {8 return expensiveFilter(deferredQuery);9 }, [deferredQuery]);1011 return (12 <div style={{ opacity: isStale ? 0.7 : 1 }}>13 <p>Results for: {deferredQuery}</p>14 <ul>15 {results.map(item => (16 <li key={item.id}>{item.name}</li>17 ))}18 </ul>19 </div>20 );21}2223function App() {24 const [query, setQuery] = useState("");2526 return (27 <div>28 <input29 value={query}30 onChange={e => setQuery(e.target.value)}31 placeholder="Search..."32 />33 <SearchResults query={query} />34 </div>35 );36}
How it works:
When to use:
vs useTransition:
Benefits: