
props를 사용하는 것이 더 나을 때도 있습니다.Options를 포함한 Select입니다. 아마도 HTML에서 작동하는 방식과 유사하기 때문일 것입니다.children을 원하는 대로 배치할 수 있게 해줄 때 빛을 발합니다. Select의 경우, 우리는 아마 그런 기능이 필요하지 않을 것입니다. options는 메뉴 안으로 들어가고, 우리는 각 옵션을 차례대로 보여주고 싶어 합니다. 이것이 바로 많은 사람들이 타입 수준에서 children에 전달할 수 있는 내용을 제한하고 싶어 하는 이유입니다. 예를 들어 Select에는 Option만 전달할 수 있도록 하는 식입니다.children에 관한 것이 전혀 아닙니다. 제 의견은 만약 children을 특정 타입으로 제한하고 싶다면, 합성 컴포넌트는 잘못된 추상화라는 것입니다.Select를 사용하지 않을 가능성이 높습니다. 콘텐츠는 대부분 동적 결과 집합을 가진 API 호출에서 올 것이기 때문입니다. 또한, 대부분의 디자인 가이드는 다섯 개 미만의 옵션에는 Select를 사용하지 말 것을 권장합니다. 드롭다운 안에 적은 수의 선택지를 숨기는 것은 불필요한 클릭과 인지 부하를 유발하기 때문입니다.Select로 시작했다가, 대부분의 사용 사례에서 다음과 같은 매핑 코드를 작성해야 했습니다.children 대신 props를 사용하는 Select를 노출하는 방식으로 전환했습니다.children이 없었기에 우리가 원하던 타입 안전성도 얻을 수 있었습니다. 또한, Select를 제네릭(Generic)으로 만들어 value, onChange, options가 모두 동일한 타입을 갖도록 보장할 수 있습니다.ModalDialog 컴포넌트는 사용자에게 컴포넌트 합성의 모든 권한을 주고 싶지 않은 또 다른 예시입니다. 제 말은, DialogFooter를 DialogHeader 위에 렌더링하는 것은 말이 되지 않는다는 것입니다. 또한 누군가 실수로 DialogBackdrop을 빠뜨리거나 DialogBody와 DialogFooter 사이에 서로 다른 간격을 만드는 것도 원치 않습니다. 일관성과 순서가 중요한 경우, 슬롯(Slots)이 대개 더 나은 추상화입니다.Dialog 기본 요소(Primitives)를 갖추는 것은 물론 훌륭하지만, 저는 이를 사용자에게 직접 노출하지는 않을 것입니다.<ButtonGroup>, <TabBar> 또는 <RadioGroup>입니다.Select와의 주요 차이점은 우리가 명시적으로 RadioGroupItem 타입이 아닌 children을 갖고 싶어 한다는 것입니다. 이를 원하는 대로 배치하고, 어쩌면 추가적인 도움말 텍스트까지 넣을 수 있는 능력은 필수적입니다. 물론 RadioGroup에 동적인 옵션이 필요한 경우도 있겠지만, 그런 경우에는 앞서 보여드린 것처럼 루프를 만드는 것이 세상이 끝날 일은 아닙니다.ThemeSwitcher에 전달된 value가 단순한 문자열이 아니라 문자열 리터럴(String literal)이길 바라기 때문입니다.RadioGroup을 앞서 보여드린 것처럼 제네릭으로 만들면 value와 onChange 프롭을 ThemeValue에 묶을 수 있지만, RadioGroupItem은 어떨까요? 각 아이템에 전달된 value가 정적으로 분석될 수 있도록 어떻게 보장할 수 있을까요?RadioGroupItem도 제네릭으로 만들 수 있습니다. 하지만 이 접근 방식의 문제는 JSX 자식 요소가 부모 컴포넌트로부터 타입 매개변수를 "상속"받지 않기 때문에, RadioGroup의 타입이 아이템에서 자동으로 사용 가능하지 않다는 점입니다. 따라서 RadioGroup이 완벽하게 타입 정의되어 <ThemeValue>를 추론하더라도, 우리는 여전히 각 RadioGroupItem에 매개변수를 지정해야 합니다.RadioGroup과 RadioGroupItem을 노출하는 대신, 타입 매개변수와 함께 한 번 호출해야 하는 createRadioGroup이라는 함수만 내보냅니다. 그러면 이 함수는 타입이 서로 묶인 정적 타입의 RadioGroup과 그에 대응하는 RadioGroupItem을 반환합니다.RadioGroup과 RadioGroupItem을 객체로 감싸는 것 외에는 아무것도 하지 않습니다. 하지만 타입 수준에서는 타입 매개변수들을 서로 묶어줍니다. 그리고 제네릭의 기본값을 never로 설정했다는 것은 사용자가 결과물로 의미 있는 작업을 하기 위해 타입을 반드시 전달해야 함을 의미하며, 다음과 같이 사용할 수 있게 해줍니다.RadioGroup을 생성하고 그 아이템들을 Theme.RadioGroup에 전달할 수 있지만, 실수로 그런 일이 발생할 가능성은 훨씬 적습니다.아직 댓글이 없습니다.
첫 번째 댓글을 작성해보세요!
[번역] sessionStorage가 다른 탭 간에 공유되지 않는 이유
Inkyu Oh • Front-End
[번역] javascript의 try-catch가 성능에 영향을 주나요?
Inkyu Oh • Front-End