Script Valley
React.js: Complete Course
Component Patterns and Context APILesson 4.2

Compound component pattern in React

compound components definition, shared implicit state, Context for compound components, dot notation API, Tabs example, Select example, composability benefits

Compound Components

Compound components are a group of components that work together, sharing implicit state through Context. They provide a flexible, expressive API โ€” consumers can compose the pieces in any order without passing many props.

Building a Tabs Component

import { createContext, useContext, useState } from 'react';

const TabsContext = createContext(null);

function Tabs({ children, defaultIndex = 0 }) {
  const [activeIndex, setActiveIndex] = useState(defaultIndex);
  return (
    <TabsContext.Provider value={{ activeIndex, setActiveIndex }}>
      {children}
    </TabsContext.Provider>
  );
}

function TabList({ children }) {
  return <div role="tablist">{children}</div>;
}

function Tab({ children, index }) {
  const { activeIndex, setActiveIndex } = useContext(TabsContext);
  return (
    <button
      role="tab"
      aria-selected={activeIndex === index}
      onClick={() => setActiveIndex(index)}>
      {children}
    </button>
  );
}

function TabPanel({ children, index }) {
  const { activeIndex } = useContext(TabsContext);
  return activeIndex === index ? <div role="tabpanel">{children}</div> : null;
}

Tabs.List = TabList;
Tabs.Tab = Tab;
Tabs.Panel = TabPanel;
<Tabs defaultIndex={0}>
  <Tabs.List>
    <Tabs.Tab index={0}>Profile</Tabs.Tab>
    <Tabs.Tab index={1}>Settings</Tabs.Tab>
  </Tabs.List>
  <Tabs.Panel index={0}>Profile content</Tabs.Panel>
  <Tabs.Panel index={1}>Settings content</Tabs.Panel>
</Tabs>

Up next

Higher-order components (HOC) pattern explained

Sign in to track progress

Compound component pattern in React โ€” Component Patterns and Context API โ€” React.js: Complete Course โ€” Script Valley โ€” Script Valley