Performance: Shared state across layouts
This affects page load speed and interaction responsiveness by how state is managed and shared between layouts and pages.
import { createContext, useContext, useState, useEffect } from 'react'; const UserContext = createContext(null); export function UserProvider({ children }) { const [user, setUser] = useState(null); useEffect(() => { fetch('/api/auth').then(res => res.json()).then(data => setUser(data.user)); }, []); return <UserContext.Provider value={user}>{children}</UserContext.Provider>; } // Wrap root layout with <UserProvider> and consume user via useContext in nested layouts
import { useState, useEffect } from 'react'; export default function Layout({ children }) { const [user, setUser] = useState(null); useEffect(() => { fetch('/api/auth').then(res => res.json()).then(data => setUser(data.user)); }, []); return <>{children}</>; } // Each layout fetches user separately causing repeated requests
| Pattern | DOM Operations | Reflows | Paint Cost | Verdict |
|---|---|---|---|---|
| Independent state per layout | Multiple fetches and state updates | Multiple reflows per layout | Higher paint cost due to repeated updates | [X] Bad |
| Centralized shared state via Context | Single fetch and state update | Single reflow for shared state change | Lower paint cost with fewer updates | [OK] Good |
const CountContext = React.createContext();
function CountProvider({ children }) {
const [count, setCount] = React.useState(0);
return (
<CountContext.Provider value={{ count, setCount }}>
{children}
</CountContext.Provider>
);
}
function Button() {
const { count, setCount } = React.useContext(CountContext);
return <button onClick={() => setCount(count + 1)}>Clicked {count} times</button>;
}
// Root layout wraps children with <CountProvider>Pass the test and this pattern moves unknown