Q11: How does the React Context API work and how do you prevent Context render thrashing?
Context provides a mechanism to pass data through the component tree without manually passing props at every level ('prop drilling'). However, whenever a Context Provider value object updates, all consuming components re-render. To avoid render thrashing, split contexts by domain or memoize provider values with useMemo.
Memoizing Context Provider Values
function UserProvider({ children }) {
const [user, setUser] = useState(null);
// Memoize value to prevent consumer re-renders when parent re-renders
const contextValue = useMemo(() => ({ user, setUser }), [user]);
return (
<UserContext.Provider value={contextValue}>
{children}
</UserContext.Provider>
);
}💡 useMemo ensures contextValue maintains reference equality unless user state explicitly updates.
Key Takeaways
- Eliminates deep prop drilling across component hierarchies.
- Unmemoized value objects (
value={{ state, dispatch }}) create fresh references every render, forcing consumers to re-render.
Knowledge Check
What causes all components calling useContext(MyContext) to re-render?