๋ฐ˜์‘ํ˜•

 

Shadcn์˜ ๋“œ๋กญ๋‹ค์šด(Dropdown)์€ ํŠน์ • ๋™์ž‘์ด๋‚˜ ๊ธฐ๋Šฅ ๋“ฑ์„ Popover ํ˜•ํƒœ๋กœ ํ‘œ์‹œํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋‹ค. ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด ์•„์ดํ…œ(DropdownMenuItem)์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ๋‹ค์ด์–ผ๋กœ๊ทธ(ํ˜น์€ AlertDialog)๋ฅผ ๋„์šฐ๋ ค๋Š” ์˜๋„๋กœ ๋ฉ”๋‰ด ์•„์ดํ…œ์˜ ์ž์‹์œผ๋กœ ๋‹ค์ด์–ผ๋กœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ๋‹ค์ด์–ผ๋กœ๊ทธ๊ฐ€ ์ œ๋Œ€๋กœ ์—ด๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.

<DropdownMenu>
<DropdownMenuTrigger>๋ฉ”๋‰ด ์—ด๊ธฐ</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuGroup>
<DropdownMenuItem>
<Dialog>{/* ... */}</Dialog>
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>;

 

Radix์˜ ๋ฉ”๋‰ด ์•„์ดํ…œ์€ ํด๋ฆญํ–ˆ์„ ๋•Œ ๋“œ๋กญ๋‹ค์šด์ด ์ž๋™์œผ๋กœ ๋‹ซํžˆ๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ๋‹ค. ๋•Œ๋ฌธ์— ๋‹ค์ด์–ผ๋กœ๊ทธ๋ฅผ ๋„์šฐ๋Š” ๋ฉ”๋‰ด ์•„์ดํ…œ์„ ํด๋ฆญํ•˜๋ฉด, ๋“œ๋กญ๋‹ค์šด์ด ๋‹ซํžˆ๋Š” ๊ธฐ๋ณธ ๋™์ž‘์— ์˜ํ•ด ๋‹ค์ด์–ผ๋กœ๊ทธ๊ฐ€ ์—ด๋ฆฌ์ง€ ๋งˆ์ž ๋‹ซํžˆ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

์œ„ ๋ฌธ์ œ๋กœ StackOverFlow๋ฅผ ์ฐพ์•„๋ณด๋ฉด DropdownMenuItem ์ปดํฌ๋„ŒํŠธ onSelect ์ด๋ฒคํŠธ์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ๋ฐฉ์ง€ํ•˜๊ฑฐ๋‚˜(preventDefault ํ˜ธ์ถœ), ๋‹ค์ด์–ผ๋กœ๊ทธ ํŠธ๋ฆฌ๊ฑฐ/์ฝ˜ํ…์ธ ์˜ onClick ์ด๋ฒคํŠธ ์ „ํŒŒ๋ฅผ ๋ง‰๋Š” ๋ฐฉ๋ฒ• ๋“ฑ์ด ๋‚˜์˜จ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•๋“ค์€ ๋‹ค์ด์–ผ๋กœ๊ทธ๋ฅผ ๋‹ซ์•˜์„ ๋•Œ aria-hidden ์ ‘๊ทผ์„ฑ ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , ๋‹ค์ด์–ผ๋กœ๊ทธ ํ‘ธํ„ฐ(Footer)์— ์žˆ๋Š” ๋ฒ„ํŠผ์„ ํ‚ค๋ณด๋“œ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.

 

๋‹ค์ด์–ผ๋กœ๊ทธ๋ฅผ ๋‹ซ์•˜์„ ๋•Œ ํ‘œ์‹œ๋˜๋Š” ์ ‘๊ทผ์„ฑ ๊ฒฝ๊ณ 

 

์ž์„ธํ•˜์ง„ ์•Š์ง€๋งŒ Shadcn ๊ณต์‹๋ฌธ์„œ - Dialog ํŽ˜์ด์ง€๋ฅผ ๋ณด๋ฉด DropdownMenu, Dialog ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์•ˆ๋‚ด๋˜์–ด ์žˆ๋‹ค. ์ •๋ฆฌํ•ด ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

  1. DropdownMenu๋ฅผ Dialog ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ผ๋‹ค
  2. DropdownMenuItem์„ DialogTrigger ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ผ ํ›„ asChild ์†์„ฑ์„ ์ง€์ •ํ•œ๋‹ค.
  3. DropdownMenu ์ปดํฌ๋„ŒํŠธ ๋ฐ”๊นฅ ์˜์—ญ์— DialogContent๋ฅผ ๋ฐฐ์น˜ํ•œ๋‹ค.

 

<Dialog>
<DropdownMenu>
<DropdownMenuTrigger>๋ฉ”๋‰ด ์—ด๊ธฐ</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuGroup>
<DialogTrigger asChild>
<DropdownMenuItem>{/* ... */}</DropdownMenuItem>
</DialogTrigger>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
<DialogContent>{/* ... */}</DialogContent>
</Dialog>

 

Combobox, ContextMenu ๋“ฑ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋‹ค์ด์–ผ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋„ ์œ„์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

<Dialog>
<Popover>
<PopoverTrigger asChild>{/* ... */}</PopoverTrigger>
<PopoverContent>
<Command>
<CommandInput />
<CommandList>
<CommandEmpty>{/* ... */}</CommandEmpty>
<CommandGroup>
{boardList.map(({ id, title }) => (
<CommandItem value={id}>{title}</CommandItem>
))}
</CommandGroup>
</CommandList>
<DialogTrigger asChild>{/* ... */}</DialogTrigger>
</Command>
</PopoverContent>
</Popover>
<DialogContent>{/* ... */}</DialogContent>
</Dialog>

 


๊ธ€ ์ˆ˜์ •์‚ฌํ•ญ์€ ๋…ธ์…˜ ํŽ˜์ด์ง€์— ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€

๋Œ“๊ธ€์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.