Select
트리거를 누르면 열리는 목록에서 값 하나를 골라요. 배송 방법이나 결제 수단처럼 정해진 선택지 중에서 고를 때 써요. 선택지가 많아 검색해야 하면 Combobox를, 동작을 실행할 때는 DropdownMenu를 써요.
사용 예시
값 하나 고르기
고른 항목의 글자가 트리거에 보여요. SelectItem을 다른 컴포넌트로 감싸면 트리거가 글자를 찾지 못해서 items로 넘겨요.
tsx
권장
선택지가 적으면 RadioGroup을 써요. 목록을 열지 않아도 모든 선택지가 보여서 빨리 고를 수 있어요.
지양
Select는 트리거를 눌러야 선택지가 보여요. 선택지가 많거나 공간이 좁을 때 Select를 써요.
권장
고른 값이 트리거에 남아서 목록을 닫아도 지금 정렬 기준을 알 수 있어요.
지양
내보내기를 골라도 아무 일도 일어나지 않고, 트리거에 남은 내보내기가 지금 상태처럼 보여요. 동작 목록에는 DropdownMenu를 써요.
항목 설명
이름만으로 항목을 구분하기 어려울 때 써요. 설명은 목록에만 나오고 트리거에는 이름만 보여요.
tsx
권장
placeholder로 트리거에 고를 대상을 적어요. 값을 고르면 placeholder는 사라져요.
지양
placeholder가 없으면 트리거가 비어 보여요. 트리거를 눌러 보기 전에는 고를 항목을 알 수 없어요.
그룹과 구분선
항목이 종류별로 나뉠 때 써요. 그룹 이름이 필요 없으면 SelectSeparator만 둬요.
tsx
라벨과 도움말
Field로 감싸면 라벨과 도움말이 트리거에 연결돼요. 값이 올바르지 않으면 Field에 invalid를 주고 FieldError에 필요한 값을 적어요.
새벽 배송은 일부 지역에서만 돼요.
결제하기 전에 수단을 골라야 해요.
tsx
권장
라벨은 값을 고른 뒤에도 보여요. 나중에 다시 봐도 이 값의 뜻을 알 수 있어요.
지양
placeholder로 라벨을 대신하면 값을 고르는 순간 사라져요.
배경
Select 여러 개가 나란히 있으면 bare를 써요. 하나만 있거나 고르는 곳이 먼저 눈에 띄어야 하면 well을 써요.
tsx
문장 안에서 고르기
설정을 문장처럼 읽게 할 때 써요. 펼침 아이콘은 평소에 옅게 보여요.
반복, 알림
tsx
폼에서는 bare
권장
폼에서는 테두리가 있는 bare를 써요. 고를 수 있는 곳이 바로 보여요.
지양
폼에서 ghost를 쓰면 Select가 글자처럼 보여서 이미 정해진 값으로 읽혀요.
Input 옆
옆에 있는 컨트롤과 size를 맞춰요. Input과 버튼이 lg면 Select도 lg예요.
tsx
비활성
값을 바꿀 수 없을 때는 Select에, 고를 수 없는 항목이 있을 때는 그 SelectItem에 disabled를 줘요.
tsx
컨트롤
값
nulltsx
명세
| 이름 | 값 | 기본 |
|---|---|---|
| Select | ||
| value | string | null | - |
| 호출하는 쪽에서 고른 항목을 관리해요. 고르지 않았으면 null이에요. | ||
| defaultValue | string | null | - |
| 처음 값이에요. | ||
| onValueChange | (value: string | null, eventDetails) => void | - |
| 고른 항목이 바뀌면 호출돼요. | ||
| open | boolean | - |
| 호출하는 쪽에서 열림 상태를 관리해요. | ||
| defaultOpen | boolean | false |
| 처음에 열어 둘지 정해요. | ||
| onOpenChange | (open: boolean, eventDetails) => void | - |
| 열리거나 닫히면 호출돼요. | ||
| placeholder | string | - |
| surface | bare, well, ghost | bare |
| bare는 투명 배경에 테두리, well은 회색 배경이에요. ghost는 평소에 글자만 보이고, 마우스를 올리면 옅은 배경, 열면 조금 진한 배경이 생겨요. 여러 개가 나란히 있으면 bare, 하나만 있으면 well, 문장이나 표 셀 안에서 값을 바로 바꾸면 ghost를 써요. | ||
| size | sm, md, lg | md |
| 높이가 32, 36, 40px이에요. | ||
| arrow | boolean | false |
| 목록에 트리거를 가리키는 화살표를 보여요. | ||
| sideOffset | number, 함수 | 8, arrow가 있으면 14 |
| 기준과 떨어진 거리예요. 단위는 px이에요. | ||
| alignOffset | number, 함수 | 0 |
| align 방향으로 옮기는 거리예요. 단위는 px이에요. | ||
| collisionAvoidance | object | - |
| 화면 가장자리에 닿을 때 뒤집을지, 밀어 넣을지 정해요. Base UI Positioner의 값을 그대로 받아요. | ||
| disabled | boolean | false |
| className | string | - |
| 모든 하위 컴포넌트에 쓸 수 있어요. Select에서는 트리거에 적용돼요. | ||
| SelectItem | ||
| value | string | 필수 |
| 이 항목을 고르면 Select의 value가 이 값이 돼요. | ||
| disabled | boolean | false |
| SelectGroup | ||
| label | string | - |
| 항목 위에 보이는 그룹 이름이에요. | ||