๋ฐ˜์‘ํ˜•

 

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>

 


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