Dropdown
간단하게 드롭다운을 만들 수 있는 컴포넌트입니다.
드롭다운 부분은 useContextMenu 를 이용하여 구현되어 있습니다. 그래서 열림/닫힘에 관한 특성도 ContextMenu 를 따르게 됩니다.
const MyDropdown = forwardRef<DropdownControl, {list:string[]}>(({list}, ref)=>{
const control = useRef<DropdownControl>();
const [open, setOpen] = useState(false);
useEffect(()=>{
const down = ()=>{
setOpen(false)
}
window.addEventListener('mousedown', down);
return ()=>{
window.removeEventListener('mousedown', down);
}
}, [])
useImperativeHandle(ref, () => (control.current), []);
return <Dropdown
ref={control}
fitContextToTitle
containerWidth='200px'
title='선택'
style={{ width: '100%', height:'40px', background:open? '#f4f2f2' : 'white' }}
icon={<DropdownIcon open={open} />}
dropdownGap={5}
onClick={()=>{
setOpen(control.current?.getShowState());
}}
>
<div style={{ width: '100%', background: 'white', border: '1px solid black', padding: '5px 10px' }}>
{list.map((name)=>{
return <div>{name}</div>
})}
</div>
</Dropdown>
})
export function DropdownBasic(){
return <Frame>
<Flex rowDirection flexGap="10px">
<MyDropdown list={['선택1','선택2','선택3']} />
<MyDropdown list={['두번째 선택1','두번째 선택2','두번째 선택3']} />
<MyDropdown list={['세번째 선택1']} />
</Flex>
</Frame>
}
위의 예시에서 보면 하나의 드롭다운이 열리면 기존에 열려있던 다른 드롭다운들은 자동으로 닫히게 됩니다. 더 정확히는, 모든 useContextMenu 로 생성된 컴포넌트는 모두 숨겨집니다.
속성 설명
(optional) title
title = ReactNode
드롭다운의 기본 타이틀을 설정합니다.
ReactNode 타입이므로 string 뿐만 아니라 다른 컴포넌트를 사용할 수도 있습니다.
(optional) icon
icon = ReactNode
드롭다운의 아이콘 부분을 설정합니다.
값을 설정하지 않으면 기본 아이콘이 보입니다.
title 과 icon 은 서로 flex 의 space-between 으로 정렬되어 있으므로 둘 중 어느 하나가 없으면 왼쪽으로 정렬됩니다.
(optional) style
style = React.CSSProperties
드롭다운의 메인 요소인 button 엘레먼트의 스타일을 지정할 수 있습니다.
(optional) disabled
disabled = boolean
드롭다운의 메인 요소인 button 엘레먼트의 disabled 속성을 지정할 수 있습니다.
(optional) dropdownGap
dropdownGap = number
메인 요소와 드롭다운 부분의 세로방향 gap 을 설정합니다.
만약 이 값을 "5px" 로 설정하면 드롭다운은 메인요소보다 아래로 5px 떨어진 곳에 보여집니다.
(optional) dropdownGapLeft
dropdownGapLeft = number
메인 요소와 드롭다운 부분의 가로방향 gap 을 설정합니다.
만약 이 값을 "5px" 로 설정하면 드롭다운은 메인요소보다 오른쪽으로 5px 떨어진 곳에 보여집니다.
(optional) fitContextToTitle
fitContextToTitle = boolean
메인 요소와 드롭다운의 크기를 맞출지의 여부입니다. 기본값은 true 입니다.
만약 이 값이 false 이면 드롭다운의 children 으로 넣은 ReactNode 가 그대로 표현됩니다.
(optional) containerWidth
containerWidth = boolean
드롭다운의 폭을 고정합니다.
만약 이 값을 설정하지 않으면 드롭다운의 메인 크기는 컨텐츠에 맞춰집니다. (= fit-content)
드롭다운 컨트롤
Dropdown 컴포넌트는 ForwardRef Component 입니다. ref 를 통해 드롭다운의 컨트롤을 얻을 수 있습니다.
const control = useRef<DropdownControl>();
...
return <Dropdown ref={control}>
...
이 컨트롤을 이용하여 드롭다운을 직접 펼치거나 접을 수 있습니다.
show
show = () => void
드롭다운을 펼칩니다.
hide
hide = () => void
드롭다운을 숨깁니다.
getShowState
getShowState = () => boolean
드롭다운의 펼친 상태를 리턴합니다.