[UI] Shadcn DropdownMenu์์ Dialog ์๋ ๋ซํ ๋ฌธ์ ํด๊ฒฐ
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
์ปดํฌ๋ํธ๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ด๋์ด ์๋ค. ์ ๋ฆฌํด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
DropdownMenu
๋ฅผDialog
์ปดํฌ๋ํธ๋ก ๊ฐ์ผ๋คDropdownMenuItem
์DialogTrigger
์ปดํฌ๋ํธ๋ก ๊ฐ์ผ ํasChild
์์ฑ์ ์ง์ ํ๋ค.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>
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CSS] :focus, :focus-visible ์ฐจ์ด์ (1) | 2025.03.06 |
---|---|
[JS] ์๋ฐ์คํฌ๋ฆฝํธ ๋๋ค ์์(Random Color) ์์ฑํ๊ธฐ (0) | 2025.03.04 |
[CSS] ์์ ๋งฅ๋ฝ Stacking Context (0) | 2025.02.26 |
[React] ๋ฆฌ์กํธ 19 ์ ๋ฐ์ดํธ ๋ด์ฉ ํบ์๋ณด๊ธฐ (0) | 2025.02.08 |
[Next.js] Dynamic Routes ๋ค์ด๋๋ฏน ๋ผ์ฐํธ (0) | 2025.01.31 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[CSS] :focus, :focus-visible ์ฐจ์ด์
[CSS] :focus, :focus-visible ์ฐจ์ด์
2025.03.06 -
[JS] ์๋ฐ์คํฌ๋ฆฝํธ ๋๋ค ์์(Random Color) ์์ฑํ๊ธฐ
[JS] ์๋ฐ์คํฌ๋ฆฝํธ ๋๋ค ์์(Random Color) ์์ฑํ๊ธฐ
2025.03.04 -
[CSS] ์์ ๋งฅ๋ฝ Stacking Context
[CSS] ์์ ๋งฅ๋ฝ Stacking Context
2025.02.26 -
[React] ๋ฆฌ์กํธ 19 ์ ๋ฐ์ดํธ ๋ด์ฉ ํบ์๋ณด๊ธฐ
[React] ๋ฆฌ์กํธ 19 ์ ๋ฐ์ดํธ ๋ด์ฉ ํบ์๋ณด๊ธฐ
2025.02.08