Suspense and Concurrent Features
Suspense for Data Fetching
import { Suspense } from 'react';
function App() {
return (
<Suspense fallback={<Loading />}>
<UserProfile userId='123' />
</Suspense>
);
}
// Component that suspends
function UserProfile({ userId }) {
const user = use(fetchUser(userId)); // React 19
return <div>{user.name}</div>;
}
useTransition - Non-Blocking Updates
import { useTransition, useState } from 'react';
function SearchResults() {
const [query, setQuery] = useState('');
const [isPending, startTransition] = useTransition();
const handleChange = e => {
const value = e.target.value;
// Urgent: Update input immediately
setQuery(value);
// Non-urgent: Update results
startTransition(() => {
setSearchResults(expensiveSearch(value));
});
};
return (
<>
<input value={query} onChange={handleChange} />
{isPending && <Spinner />}
<ResultsList />
</>
);
}
useDeferredValue
import { useDeferredValue } from 'react';
function ProductList({ searchTerm }) {
const deferredSearchTerm = useDeferredValue(searchTerm);
const filteredProducts = useMemo(() => {
return products.filter(p => p.name.includes(deferredSearchTerm));
}, [deferredSearchTerm]);
return <List items={filteredProducts} />;
}
Concurrent Rendering Benefits
- Interruptible rendering - React can pause work
- Priority-based updates - Urgent vs non-urgent
- Better user experience - UI stays responsive
- Automatic batching - Multiple state updates batched