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>