React Context is the default state tool for most teams. It ships with React, no extra library, easy to set up. It's also the slowest option for anything that updates often.
I see this pattern in every React codebase I audit: a giant AppContext holding auth, theme, cart, search filters, and form state. Every keystroke in the search input re-renders the whole app. The fix isn't more React.memo. The fix is using the right tool for each piece of state.
The actual cost of Context
Context's contract: when the value changes, every consumer re-renders. Period.
const AppContext = createContext(null)
function AppProvider({ children }) {
const [searchQuery, setSearchQuery] = useState('')
const [theme, setTheme] = useState('dark')
const [user, setUser] = useState(null)
return (
<AppContext.Provider value={{ searchQuery, setSearchQuery, theme, setTheme, user, setUser }}>
{children}
</AppContext.Provider>
)
}