컴포넌트 합성과 슬롯

읽는 시간 약 9

이 문서에서 배우는 것

  • 내용을 인자로 받는 컴포넌트 설계
  • 옵션이 늘어날 때의 신호
  • 합성으로 조건 분기를 줄이는 법

자리를 비워 두기

컴포넌트는 값을 받듯 마크업도 받을 수 있습니다. 카드의 테두리와 여백만 책임지고, 안에 무엇이 들어갈지는 부르는 쪽이 정하게 하는 식입니다.

function Panel({ title, children }) {
  return html`
    <section class="panel">
      <h2>${title}</h2>
      ${children}
    </section>
  `;
}

Panel({ title: '배포 기록', children: html`<ul>…</ul>` });

자리를 여러 개 두고 싶으면 그냥 필드를 늘리면 됩니다. 머리말과 꼬리말을 따로 받는 식이죠. 특별한 슬롯 문법을 배울 필요가 없습니다.

옵션이 늘어날 때

showHeader, compact, variant 같은 불리언이 셋을 넘어가면, 대개 컴포넌트 하나가 서로 다른 두 컴포넌트를 억지로 겸하고 있다는 신호입니다. 이럴 때는 옵션을 더 붙이는 대신 공통 부분을 안쪽 컴포넌트로 뽑고 바깥을 두 개로 나누는 편이 읽기도 고치기도 쉽습니다.

참고

나눌지 말지 애매하면, 두 사용처의 마크업을 나란히 놓고 실제로 겹치는 줄을 세어 보세요. 절반을 넘지 않으면 나누는 쪽이 대체로 옳습니다.

조건 분기 줄이기

부모가 자식의 상황을 다 알고 분기하는 구조는 금방 커집니다. 자식이 자기 상황을 스스로 그리게 하고, 부모는 자리만 내주는 방향으로 옮기면 분기가 사라집니다.

요약

  • 마크업도 인자다. 자리를 비워 두면 레이아웃과 내용이 분리된다.
  • 불리언 옵션이 셋을 넘으면 컴포넌트를 나눌 때다.
  • 분기는 부모가 아니라 자식에게 맡긴다.