Skip to content
Advanced React Patterns

Lesson 4 of 6 · 24 min

x
4/6

Lesson position in the course — not completion. Use Mark Complete to track finished lessons (saved in this browser).

React Context, Reducers & Atomic State

React Context provides a way to pass data down the component tree without manually threading props at every level. However, when a Context value object updates, all components consuming that Context re-render, even if they only use a subset of un-changed properties.

To manage complex state transitions cleanly, combine React Context with useReducer. useReducer enforces deterministic state changes via dispatched action objects. For large-scale applications with frequent individual updates, separate state Context from dispatch Context or use atomic state libraries (Zustand, Jotai).

Before
Single Context Object Causing Mass Re-renders
1// ❌ Every theme change forces profile components to re-render2const CombinedContext = createContext<{ user: User; theme: string } | null>(null);
After
Split Context Providers for Targeted Re-renders
1// ✅ Separate contexts isolate re-renders by topic2const UserContext = createContext<User | null>(null);3const ThemeContext = createContext<Theme | null>(null);4 5export function UserProfile() {6  const user = useContext(UserContext); // Only re-renders when User updates!7  return <div>{user?.name}</div>;8}

Exercise

Create a shopping cart state provider using useReducer (addItem, removeItem, clear) and a Context provider.

Check your understanding

  • Why does combining useReducer with Context improve state management?Show answer

    Answer

    It decouples state transition logic (reducers) from UI rendering while allowing deep components to dispatch actions cleanly.
  • How do you prevent Context consumers from re-rendering when unrelated state changes?Show answer

    Answer

    Split state into separate Context providers or memoize Context provider value objects.
Previous

Progress is saved in this browser.

Next Lesson