#7StructuralMedium

Compound Pattern (Accordion)

Compound Component Pattern - Accordion

Accordion을 compound 컴포넌트로 구현하세요. Accordion, Accordion.Item, Accordion.Header, Accordion.Panel 이 React Context를 통해 암묵적으로 상태를 공유합니다. 단일 열림(single-open) 동작이며, 같은 헤더를 다시 누르면 닫힙니다.

API

<Accordion defaultOpen="a">
  <Accordion.Item id="a">
    <Accordion.Header>A</Accordion.Header>
    <Accordion.Panel>Panel A</Accordion.Panel>
  </Accordion.Item>
  <Accordion.Item id="b">
    <Accordion.Header>B</Accordion.Header>
    <Accordion.Panel>Panel B</Accordion.Panel>
  </Accordion.Item>
</Accordion>

동작

  • 처음에는 defaultOpen 이 가리키는 Item 의 panel만 보임 (defaultOpen 없으면 모두 닫힘)
  • Accordion.Header 를 클릭하면 그 Item 의 panel이 열린다 (이미 열려 있으면 닫힘)
  • 한 번에 최대 1개만 열림. 다른 헤더를 누르면 이전 panel은 닫힘
  • 닫힌 panel은 DOM 에서 빠지거나 숨겨지며 screen.queryByText 로 잡히지 않아야 함
  • 헤더는 role="button" 이어야 한다 (<button> 사용 권장)

힌트

  • createContext{ openId, setOpenId } 공유
  • Accordion.Item 은 자기 id 를 내부 컨텍스트로 다시 내려서 Header / Panel 이 자기 item 의 id 를 알 수 있게 한다

학습 포인트

  • 합성된 자식들이 암묵적으로 상태 공유 (props drilling 없음)
  • 중첩된 Context 로 부모-자식 식별
  • 단일 열림 토글 패턴
Sandpack 로드 중…