--- name: managing-local-vs-global-state description: Teaches when to use local state vs global state (Context) in React 19. Use when deciding state management strategy, avoiding prop drilling, or architecting component state. allowed-tools: Read, Write, Edit version: 1.0.0 --- # Local vs Global State ## Decision Flow **Use Local State (useState) when:** - State only needed in one component - State only needed by component + direct children - State changes frequently (avoid Context re-renders) - State is UI-specific (form input, toggle, etc.) **Use Lifted State when:** - Two sibling components need to share state - Parent coordinates between children - Still contained to component subtree **Use Context when:** - Many components at different nesting levels need state - Prop drilling through 3+ levels - Global configuration (theme, locale, auth) - State changes infrequently ## Examples **Local State:** ```javascript function Counter() { const [count, setCount] = useState(0); return ; } ``` **Lifted State:** ```javascript function Parent() { const [filter, setFilter] = useState('all'); return ( <> ); } ``` **Context (React 19 with `use()`):** ```javascript import { createContext, use } from 'react'; const ThemeContext = createContext('light'); function App() { const [theme, setTheme] = useState('light'); return ( ); } function DeepComponent() { const { theme, setTheme } = use(ThemeContext); return ; } ``` ## Anti-Patterns ❌ **Context for frequently changing state:** ```javascript const MousePositionContext = createContext(); function App() { const [position, setPosition] = useState({ x: 0, y: 0 }); useEffect(() => { const handler = (e) => setPosition({ x: e.clientX, y: e.clientY }); window.addEventListener('mousemove', handler); return () => window.removeEventListener('mousemove', handler); }, []); return ( ); } ``` This causes re-render of entire tree on every mouse move! ✅ **Local state or ref instead:** ```javascript function Component() { const [position, setPosition] = useState({ x: 0, y: 0 }); useEffect(() => { const handler = (e) => setPosition({ x: e.clientX, y: e.clientY }); window.addEventListener('mousemove', handler); return () => window.removeEventListener('mousemove', handler); }, []); return
Mouse: {position.x}, {position.y}
; } ``` For comprehensive state management patterns, see: `research/react-19-comprehensive.md` lines 1293-1342.