Performance: React context in client components
This affects interaction responsiveness and rendering speed by controlling how often components re-render when context changes.
const UserContext = React.createContext(null); const ThemeContext = React.createContext(null); function App() { const [user, setUser] = React.useState({ name: 'Alice' }); const [theme, setTheme] = React.useState('light'); return ( <UserContext.Provider value={user}> <ThemeContext.Provider value={theme}> <UserProfile /> <ThemeSwitcher /> </ThemeContext.Provider> </UserContext.Provider> ); } function UserProfile() { const user = React.useContext(UserContext); return <div>{user.name}</div>; } function ThemeSwitcher() { const theme = React.useContext(ThemeContext); return <button>{theme}</button>; }
const MyContext = React.createContext({ user: {}, theme: 'light' }); function App() { const [user, setUser] = React.useState({ name: 'Alice' }); const [theme, setTheme] = React.useState('light'); return ( <MyContext.Provider value={{ user, theme }}> <UserProfile /> <ThemeSwitcher /> </MyContext.Provider> ); } function UserProfile() { const { user } = React.useContext(MyContext); return <div>{user.name}</div>; } function ThemeSwitcher() { const { theme } = React.useContext(MyContext); return <button>{theme}</button>; }
| Pattern | DOM Operations | Reflows | Paint Cost | Verdict |
|---|---|---|---|---|
| Single large context for multiple states | Many components re-render unnecessarily | Multiple reflows triggered | Higher paint cost due to frequent updates | [X] Bad |
| Multiple small contexts for separate states | Only relevant components re-render | Fewer reflows triggered | Lower paint cost with targeted updates | [OK] Good |
import { createContext, useContext } from 'react';
const ThemeContext = createContext('light');
export default function DisplayTheme() {
const theme = useContext(ThemeContext);
return <div>Current theme: {theme}</div>;
}DisplayTheme is rendered without a ThemeContext.Provider?import { createContext, useContext } from 'react';
const UserContext = createContext();
export default function UserName() {
const user = useContext(UserContext);
return <div>User: {user.name}</div>;
}Pass the test and this pattern moves unknown