React Design Patterns
Compound components, render props, HOCs, custom hooks, and architectural patterns.
Overview
Design patterns provide proven solutions to common React architecture challenges.
Key Concepts
- Compound Components — Shared state between related components
- Render Props — Pass render function as prop for flexibility
- Higher-Order Components — Enhance components with additional functionality
- Container/Presentation — Separate data logic from UI
- Provider Pattern — Share state implicitly through context
Code Examples
// Compound Component Pattern
function Tabs({ children, defaultTab }) {
const [activeTab, setActiveTab] = useState(defaultTab);
return (
<TabsContext.Provider value={{ activeTab, setActiveTab }}>
<div className="tabs">{children}</div>
</TabsContext.Provider>
);
}
function TabList({ children }) {
return <div className="tab-list" role="tablist">{children}</div>;
}
function Tab({ children, id }) {
const { activeTab, setActiveTab } = useContext(TabsContext);
return (
<button
role="tab"
aria-selected={activeTab === id}
onClick={() => setActiveTab(id)}
className={activeTab === id ? 'active' : ''}
>
{children}
</button>
);
}
function TabPanels({ children }) {
const { activeTab } = useContext(TabsContext);
return <div className="tab-panels">{children}</div>;
}
function TabPanel({ children, id }) {
const { activeTab } = useContext(TabsContext);
if (activeTab !== id) return null;
return <div role="tabpanel">{children}</div>;
}
// Usage
<Tabs defaultTab="tab1">
<TabList>
<Tab id="tab1">Tab 1</Tab>
<Tab id="tab2">Tab 2</Tab>
</TabList>
<TabPanels>
<TabPanel id="tab1">Content 1</TabPanel>
<TabPanel id="tab2">Content 2</TabPanel>
</TabPanels>
</Tabs>
Practice
Build a compound component for an accordion with keyboard navigation.