Skip to content

SelectBox ​

선택박스 컴포넌트는 드롭다운 목록에서 옵션을 선택할 수 있는 컴포넌트입니다.

기본 사용법 ​

useSelectBox hook을 사용하여 SelectBox를 제어합니다.

tsx
import { SelectBox, useSelectBox } from '@youngduck/yd-ui'

function App() {
  const options = [
    { label: 'option1', value: '옵션 1' },
    { label: 'option2', value: '옵션 2' },
    { label: 'option3', value: '옵션 3' },
  ]

  const selectBoxHook = useSelectBox({
    options,
    defaultValue: 'option1',
  })

  return <SelectBox selectBoxHook={selectBoxHook} label="옵션 선택" />
}

Uncontrolled 모드 ​

tsx
import { SelectBox, useSelectBox } from '@youngduck/yd-ui'

function App() {
  const options = [
    { label: 'option1', value: '옵션 1' },
    { label: 'option2', value: '옵션 2' },
    { label: 'option3', value: '옵션 3' },
  ]

  const selectBoxHook = useSelectBox({
    options,
    defaultValue: 'option1', // 초기값 설정
  })

  return <SelectBox selectBoxHook={selectBoxHook} />
}

Controlled 모드 ​

tsx
import { useState } from 'react'
import { SelectBox, useSelectBox } from '@youngduck/yd-ui'

function App() {
  const [selectedValue, setSelectedValue] = useState('option1')

  const options = [
    { label: 'option1', value: '옵션 1' },
    { label: 'option2', value: '옵션 2' },
    { label: 'option3', value: '옵션 3' },
  ]

  const selectBoxHook = useSelectBox({
    options,
    value: selectedValue, // controlled value
    onChange: (value, option) => {
      setSelectedValue(value)
      console.log('Selected:', option)
    },
  })

  return <SelectBox selectBoxHook={selectBoxHook} />
}

검색 기능 ​

검색 기능을 활성화하려면 search 옵션을 true로 설정합니다.

tsx
const selectBoxHook = useSelectBox({
  options: [
    { label: 'apple', value: '사과' },
    { label: 'banana', value: '바나나' },
    { label: 'cherry', value: '체리' },
  ],
  search: true, // 검색 기능 활성화
})

Sizes ​

선택박스 크기를 조절할 수 있습니다.

tsx
<SelectBox selectBoxHook={selectBoxHook} size="sm" />
<SelectBox selectBoxHook={selectBoxHook} size="md" />
<SelectBox selectBoxHook={selectBoxHook} size="lg" />
<SelectBox selectBoxHook={selectBoxHook} size="full" />

커스텀 필터 함수 ​

기본 필터 함수를 커스터마이징할 수 있습니다.

tsx
const selectBoxHook = useSelectBox({
  options,
  search: true,
  filterFn: (option, term) => {
    // 커스텀 필터 로직
    return option.value.includes(term) || option.label.includes(term)
  },
})

커스텀 변환 함수 ​

옵션을 문자열로 변환하는 함수를 커스터마이징할 수 있습니다.

tsx
const selectBoxHook = useSelectBox({
  options,
  itemToString: (option) => `${option.label}: ${option.value}`,
  getValue: (option) => option.label, // value 대신 label 사용
})

useSelectBox Hook ​

반환값 ​

PropertyTypeDescription
selectedOptionSelectBoxOption현재 선택된 옵션
isOpenboolean드롭다운 열림 상태
searchValuestring검색어
filteredOptionsSelectBoxOption[]필터링된 옵션 목록
selectedTextstring표시될 텍스트
valuestring선택된 옵션의 value
labelstring선택된 옵션의 label
hasOptionboolean옵션이 선택되었는지 여부
containerRefRefObject<HTMLDivElement>컨테이너 ref
handleClickOption(option: SelectBoxOption) => void옵션 클릭 핸들러
handleToggle() => void드롭다운 토글 핸들러
handleSearch(value: string) => void검색 핸들러
handleClose() => void드롭다운 닫기 핸들러
handleTriggerKeyDown(e: KeyboardEvent) => void트리거 키보드 핸들러
handleOptionKeyDown(e: KeyboardEvent, option, index) => void옵션 키보드 핸들러
highlightedIndexnumber현재 하이라이트된 옵션 인덱스
listboxRefRefObject<HTMLDivElement>리스트박스 ref
optionRefsMutableRefObject<(HTMLElement | null)[]>옵션 요소 refs

옵션 ​

OptionTypeDefaultDescription
optionsSelectBoxOption[]필수선택 가능한 옵션 목록
defaultValuestring-초기 선택값 (uncontrolled)
valuestring-현재 선택값 (controlled)
onChange(value: string, option: SelectBoxOption) => void-선택 변경 핸들러
searchbooleanfalse검색 기능 활성화
filterFn(option: SelectBoxOption, term: string) => boolean기본 필터커스텀 필터 함수
itemToString(option: SelectBoxOption) => stringopt => opt.value옵션을 문자열로 변환
getValue(option: SelectBoxOption) => stringopt => opt.value옵션의 value 추출

SelectBox Props ​

PropTypeDefaultDescription
selectBoxHookReturnType<typeof useSelectBox>필수useSelectBox hook 반환값
size'sm' | 'md' | 'lg' | 'full''full'선택박스 크기
labelstring-접근성 레이블 (sr-only로 표시)

타입 ​

tsx
import type { SelectBoxOption } from '@youngduck/yd-ui'

const option: SelectBoxOption = {
  label: 'option1',
  value: '옵션 1',
}

키보드 지원 ​

트리거 (닫힌 상태) ​

키동작
Enter / Space드롭다운 열기
ArrowDown드롭다운 열고 첫 번째 옵션에 포커스
ArrowUp드롭다운 열고 마지막 옵션에 포커스

옵션 목록 (열린 상태) ​

키동작
ArrowDown다음 옵션으로 이동 (마지막에서 처음으로 순환)
ArrowUp이전 옵션으로 이동 (처음에서 마지막으로 순환)
Home첫 번째 옵션으로 이동
End마지막 옵션으로 이동
Enter / Space현재 옵션 선택 후 닫기
Escape드롭다운 닫기
Tab드롭다운 닫고 다음 요소로 이동

접근성 ​

  • role="combobox" 트리거, role="listbox" 드롭다운, role="option" 옵션
  • aria-expanded, aria-haspopup, aria-controls 자동 관리
  • aria-selected로 선택 상태 표시
  • label prop으로 스크린리더 레이블 제공
  • 선택/닫기 후 트리거로 포커스 자동 복귀
  • 하이라이트된 옵션 자동 스크롤

기능 ​

  • ✅ 외부 클릭 시 자동 닫기
  • ✅ ESC 키로 닫기
  • ✅ 검색 기능 (옵션)
  • ✅ Controlled/Uncontrolled 모드 지원
  • ✅ 완전한 키보드 네비게이션
  • ✅ WAI-ARIA Combobox 패턴 준수