JS Guide
HomeQuestionsSearchResources
Search

Built for developers preparing for JavaScript, React & TypeScript interviews.

ResourcesQuestionsSupport
HomeQuestionsSearchProgress
HomeQuestionsreact
PrevNext
react
senior
concurrent

What are React's concurrent features and how do Suspense and transitions work?

concurrent
suspense
useTransition
useDeferredValue
performance
lazy
Quick Answer

Concurrent React enables interruptible rendering, allowing React to pause low-priority work for urgent updates. Suspense handles async loading states declaratively. useTransition marks updates as non-urgent, and useDeferredValue defers expensive re-renders.

Detailed Explanation

Concurrent Rendering:

  • Rendering is interruptible
  • React can work on multiple versions of UI
  • High-priority updates (typing) interrupt low-priority (search results)
  • Enables smooth UX during complex updates

Suspense:

  • Declarative loading states
  • Shows fallback while children load
  • Works with lazy(), data fetching libraries
  • Allows streaming SSR

useTransition:

  • Marks state update as non-urgent
  • Keeps UI responsive during heavy updates
  • Returns [isPending, startTransition]

useDeferredValue:

  • Defers updating a value until urgent work completes
  • Shows stale data while computing new data
  • Like debouncing but smarter

Code Examples

Suspense for code splitting
import { Suspense, lazy } from 'react';

// Lazy load component
const Dashboard = lazy(() => import('./Dashboard'));
const Settings = lazy(() => import('./Settings'));

function App() {
  const [page, setPage] = useState('dashboard');
  
  return (
    <div>
      <nav>
        <button onClick={() => setPage('dashboard')}>Dashboard</button>
        <button onClick={() => setPage('settings')}>Settings</button>
      </nav>
      
      {/* Suspense shows fallback while lazy component loads */}
      <Suspense fallback={<div>Loading...</div>}>
        {page === 'dashboard' ? <Dashboard /> : <Settings />}
      </Suspense>
    </div>
  );
}

// Nested Suspense for granular loading
function App() {
  return (
    <Suspense fallback={<PageSkeleton />}>
      <Header />
      <Suspense fallback={<SidebarSkeleton />}>
        <Sidebar />
      </Suspense>
      <Suspense fallback={<ContentSkeleton />}>
        <MainContent />
      </Suspense>
    </Suspense>
  );
}

Resources

React Docs - Suspense

docs

React Docs - useTransition

docs

React Docs - useDeferredValue

docs

Related Questions

Explain React.memo, useMemo, and useCallback. When should each be used?

senior
performance
Previous
How does React's reconciliation algorithm work?
Next
How do Error Boundaries work in React and what are their limitations?