다른 방식도 있을 수 있지만 위 방식은 별로다. 위와 같은 API형태로 disabled attribute를 표현하려면 어떻게 할까? 여튼 별로다.
compound component API는 컴포넌트 간의 관계를 표현하기 좋은 방법이다.
이 컨셉ㅇ의 다른 중요한 측면은 implicit state 다. 엘리먼트는 암시적으로 선택된 option에 대해 상태를 저장하고 children을 공유한다. 그래서 상태 기반하여 뭘 렌더링할지 정확히 알고 있다. 하지만 그 상태 공유는 암시적이다. 왜냐하면 상태에 접근할 수 있는 HTML code가 아무것도 없다.
이러한 우언칙을 이해하기 위해 합성 컴포넌트를 나타내는 리액트 컴포넌트를 보자. 예제인 ReachUI를 보자.
functionApp(){return (<Menu><MenuButton> Actions <spanaria-hidden>▾</span></MenuButton><MenuList><MenuItemonSelect={() =>alert('Download')}>Download</MenuItem><MenuItemonSelect={() =>alert('Copy')}>Create a Copy</MenuItem><MenuItemonSelect={() =>alert('Delete')}>Delete</MenuItem></MenuList></Menu> );}
이 예제에서 는 공유된 암시적인 state를 수립한다. 각 컴포넌트는 state를 접근/공유할 수 있고 모두 암시적으로 수행된다. 이것이 너가 찾는 표현하는 API다.
이것을 가능하게 하는 방법은?
children을 React.cloneElement로 나타내기
React context 이용하기
여기서는 context를 이용하여 하 합성 컴포넌트 set을 만들어보자.
.을 이용했는데 이유는 이 컴포넌트들이 컴포넌트의 static 프로퍼티로 추가됐기 때문이다. 합성 컴포넌트의 필수 요소는 아니라는 점을 알아두자.(위 예제 MenuComponent는 .안이용함) 걍 필자가 개인적으로 .으로 명시적 관계 표현하는거 좋아하는거임.