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} />
}

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드롭다운 닫기 핸들러

옵션

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'선택박스 크기

타입

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

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

기능

  • ✅ 외부 클릭 시 자동 닫기
  • ✅ ESC 키로 닫기
  • ✅ 검색 기능 (옵션)
  • ✅ Controlled/Uncontrolled 모드 지원
  • ✅ 키보드 네비게이션 지원