React · Concurrent React

Concurrent React Interview Questions
With Answers & Code Examples

2 carefully curated Concurrent React interview questions with working code examples and real interview gotchas.

Practice Interactively →← All Categories
2 questions0 beginner0 core2 advanced
Q1Advanced

What is Concurrent Mode and what problems does it solve?

💡 Hint: React can pause, resume, and abandon renders — keeps the UI responsive during expensive updates

Concurrent React (enabled by default in React 18 with createRoot) lets React pause work in progress when something more urgent arrives, then resume it later.

Problems it solves:

  • Blocking renders — expensive renders blocked the main thread, causing input lag. Now React can interrupt a slow render to handle a keypress.
  • Tearing — reading from an external store during a render could give inconsistent UI. Concurrent React prevents this with useSyncExternalStore.
  • Waterfall loading — with Suspense + concurrent features, React can start rendering before all data is ready.
// React 18 — opt in to concurrent features
import { createRoot } from 'react-dom/client';
createRoot(document.getElementById('root')).render();

// Now transitions, Suspense, startTransition all work correctly

New APIs enabled by concurrency:

  • startTransition / useTransition — mark updates as non-urgent
  • useDeferredValue — defer a value until the browser is idle
  • Suspense for data fetching — show fallbacks while data loads
  • useId — stable IDs for SSR
💡 Your render functions must be pure (no side effects) for concurrent mode to work correctly — React may call them multiple times or discard partial results.
Practice this question →
Q2Advanced

What are useTransition and useDeferredValue?

💡 Hint: Mark state updates as non-urgent so React can keep the UI responsive — show stale content while new content loads

Both allow non-urgent updates to be deferred so urgent updates (typing, clicking) stay responsive.

useTransition — marks a state update as a transition:

function SearchPage() {
  const [query, setQuery] = useState('');
  const [results, setResults] = useState([]);
  const [isPending, startTransition] = useTransition();

  function handleChange(e) {
    setQuery(e.target.value); // urgent — update input immediately

    startTransition(() => {
      // non-urgent — can be interrupted if user keeps typing
      setResults(expensiveFilter(e.target.value));
    });
  }

  return (
    <>
      
      {isPending ?  : }
    
  );
}

useDeferredValue — defer a value you receive (useful when you don't own the state setter):

function SearchResults({ query }) {
  const deferredQuery = useDeferredValue(query); // lags behind query
  const results = expensiveFilter(deferredQuery); // uses stale value during typing
  const isStale = query !== deferredQuery;

  return (
    
{results.map(r => )}
); }
💡 useTransition is for when you own the state update. useDeferredValue is for when you receive a value as a prop. Both achieve the same goal — responsive typing + deferred expensive render.
Practice this question →

Other React Interview Topics

Rendering StrategiesCore JSType SystemReact FundamentalsFunctionsMicrofrontendsGenericsAsync JSHooksObjectsMonorepoArrays'this' KeywordUtility TypesError HandlingModern JSBundle OptimizationPerformanceDOM & EventsState ManagementClasses & OOPCaching StrategiesComponent PatternsAdvanced TypesAuthenticationReact RouterFormsAdvanced PatternsFrontend SecurityServer ComponentsTestingEcosystemNetwork OptimizationCore Web VitalsBrowser APIs

Ready to practice Concurrent React?

Get AI feedback on your answers, predict code output, and fix real bugs.

Start Free Practice →