React Advanced

React Design Patterns

Compound components, render props, HOCs, custom hooks, and architectural patterns.

Advertisement

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.