Menu
Menu
は、一般的なドロップダウンメニューを表示するコンポーネントです。
インポート
import {Menu,MenuButton,MenuList,MenuItem,MenuGroup,MenuOptionItem,MenuOptionGroup,MenuSeparator,} from "@yamada-ui/react"
Menu
: メニューの状態を制御するラッパーコンポーネントです。MenuButton
: メニューを開閉するコンポーネントです。MenuList
: メニューの項目を制御するラッパーコンポーネントです。MenuItem
: メニューの項目のコンポーネントです。MenuGroup
: メニューの項目をグループ化するラッパーコンポーネントです。MenuOptionItem
: 選択(ラジオとチェックボックス)可能なメニューの項目のコンポーネントです。MenuOptionGroup
: 選択(ラジオとチェックボックス)可能なメニューの項目をグループ化するラッパーコンポーネントです。MenuSeparator
: メニューの項目を区切るコンポーネントです。
使い方
編集可能な例
<Menu> <MenuButton as={Button} rightIcon={<ChevronDownIcon fontSize="xl" />}> Menu </MenuButton> <MenuList> <MenuItem>Set status</MenuItem> <MenuItem>Edit Profile</MenuItem> <MenuItem>Preferences</MenuItem> </MenuList> </Menu>
内部状態へアクセスする
children
には、isOpen
やonClose
などのメソッドが提供されます。これを利用して、内部状態にアクセスすることができます。
編集可能な例
<Menu> {({ isOpen }) => ( <> <MenuButton as={Button} rightIcon={<ChevronDownIcon fontSize="xl" />}> {isOpen ? "Close" : "Open"} Menu </MenuButton> <MenuList> <MenuItem>Set status</MenuItem> <MenuItem>Edit Profile</MenuItem> <MenuItem>Preferences</MenuItem> </MenuList> </> )} </Menu>
項目にコマンドを表示する
項目にコマンドを表示する場合は、command
に文字列を設定します。
編集可能な例
<Menu> <MenuButton as={IconButton} icon={<MenuIcon fontSize="2xl" />} variant="outline" /> <MenuList> <MenuItem command="⌘T">New Tab</MenuItem> <MenuItem command="⌘N">New Window</MenuItem> <MenuItem command="⌘O">Open File</MenuItem> </MenuList> </Menu>
項目にアイコンを表示する
項目にアイコンを表示する場合は、icon
にReactElement
を設定します。
編集可能な例
<Menu> <MenuButton as={IconButton} icon={<MenuIcon />} variant="outline" /> <MenuList> <MenuItem icon={<PlusIcon fontSize="lg" />} command="⌘T"> New Tab </MenuItem> <MenuItem icon={<ExternalLinkIcon fontSize="lg" />} command="⌘N"> New Window </MenuItem> <MenuItem icon={<FilePenLineIcon fontSize="lg" />} command="⌘O"> Open File </MenuItem> </MenuList> </Menu>
項目にフォーカスする
メニューを開く際に、特定の項目にフォーカスする場合は、initialFocusRef
に対象のref
を設定します。
編集可能な例
const ref = useRef<HTMLDivElement>(null) return ( <Menu initialFocusRef={ref}> <MenuButton as={Button} rightIcon={<ChevronDownIcon fontSize="xl" />}> Menu </MenuButton> <MenuList> <MenuItem>Set status</MenuItem> <MenuItem ref={ref}>Edit Profile</MenuItem> <MenuItem>Preferences</MenuItem> </MenuList> </Menu> )
表示位置を変更する
表示位置を変更するには、placement
にtop
やleft-start
などを設定します。デフォルトでは、bottom-start
が設定されています。
編集可能な例
<Menu placement="top"> <MenuButton as={Button} rightIcon={<ChevronDownIcon fontSize="xl" />}> Menu </MenuButton> <MenuList> <MenuItem>Set status</MenuItem> <MenuItem>Edit Profile</MenuItem> <MenuItem>Preferences</MenuItem> </MenuList> </Menu>
アニメーションを変更する
表示または非表示のアニメーションを変更するには、animation
にtop
やleft
などを設定します。デフォルトでは、scale
が設定されています。
編集可能な例
<Menu animation="top"> <MenuButton as={Button} rightIcon={<ChevronDownIcon fontSize="xl" />}> Menu </MenuButton> <MenuList> <MenuItem>Set status</MenuItem> <MenuItem>Edit Profile</MenuItem> <MenuItem>Preferences</MenuItem> </MenuList> </Menu>
オフセットを変更する
要素の大きさやシチュエーションによっては、メニューの位置を変更したい場合があります。その場合は、gutter
またはoffset
で位置を調整します。
gutter
は、単純な要素との差を設定でき、offset
は、[横軸, 縦軸]
を設定できます。
編集可能な例
<Wrap gap="md"> <Menu gutter={32}> <MenuButton as={Button} rightIcon={<ChevronDownIcon fontSize="xl" />}> Menu </MenuButton> <MenuList> <MenuItem>Set status</MenuItem> <MenuItem>Edit Profile</MenuItem> <MenuItem>Preferences</MenuItem> </MenuList> </Menu> <Menu offset={[16, 16]}> <MenuButton as={Button} rightIcon={<ChevronDownIcon fontSize="xl" />}> Menu </MenuButton> <MenuList> <MenuItem>Set status</MenuItem> <MenuItem>Edit Profile</MenuItem> <MenuItem>Preferences</MenuItem> </MenuList> </Menu> </Wrap>
所要時間を変更する
所要時間を変更する場合は、duration
に数値(秒)を設定します。
編集可能な例
<Menu duration={0.4}> <MenuButton as={Button} rightIcon={<ChevronDownIcon fontSize="xl" />}> Menu </MenuButton> <MenuList> <MenuItem>Set status</MenuItem> <MenuItem>Edit Profile</MenuItem> <MenuItem>Preferences</MenuItem> </MenuList> </Menu>
項目間に区切り線を追加する
MenuItem
の間にMenuSeparator
を設定することで、区切り線を追加できます。
編集可能な例
<Menu> <MenuButton as={Button} rightIcon={<ChevronDownIcon fontSize="xl" />}> Menu </MenuButton> <MenuList> <MenuItem>Set status</MenuItem> <MenuItem>Edit Profile</MenuItem> <MenuItem>Preferences</MenuItem> <MenuSeparator /> <MenuItem>Sign out</MenuItem> </MenuList> </Menu>
項目をグループ化する
項目同士をグループ化する場合は、MenuGroup
を使用します。
編集可能な例
<Menu> <MenuButton as={Button} rightIcon={<ChevronDownIcon fontSize="xl" />}> Menu </MenuButton> <MenuList> <MenuGroup label="account"> <MenuItem>Set status</MenuItem> <MenuItem>Edit Profile</MenuItem> <MenuItem>Preferences</MenuItem> </MenuGroup> <MenuSeparator /> <MenuGroup label="action"> <MenuItem>Sign out</MenuItem> </MenuGroup> </MenuList> </Menu>
選択可能な項目
MenuOptionGroup
とMenuOptionItem
を使用することで、ラジオやチェックボックスのような選択可能な項目を設定することができます。
編集可能な例
<Menu> <MenuButton as={Button} rightIcon={<ChevronDownIcon fontSize="xl" />}> Menu </MenuButton> <MenuList> <MenuOptionGroup label="order" type="radio"> <MenuOptionItem value="asc">Ascending</MenuOptionItem> <MenuOptionItem value="desc">Descending</MenuOptionItem> </MenuOptionGroup> <MenuSeparator /> <MenuOptionGroup label="display" type="checkbox"> <MenuOptionItem value="gender">gender</MenuOptionItem> <MenuOptionItem value="email">email</MenuOptionItem> <MenuOptionItem value="phone">phone</MenuOptionItem> </MenuOptionGroup> </MenuList> </Menu>
ネストしたメニュー
ネストしたメニューを構成するには、MenuItem
内にネストさせるMenu
を挿入します。
編集可能な例
<Menu> <MenuButton as={Button} rightIcon={<ChevronDownIcon fontSize="xl" />}> Menu </MenuButton> <MenuList> <MenuItem> <Menu> <MenuItemButton>Settings</MenuItemButton> <MenuList> <MenuItem>Extensions</MenuItem> <MenuItem> <Menu> <MenuItemButton>Theme</MenuItemButton> <MenuList> <MenuItem>Color Theme</MenuItem> <MenuItem>File Icon Theme</MenuItem> <MenuItem>Product Icon Theme</MenuItem> </MenuList> </Menu> </MenuItem> <MenuItem>User Tasks</MenuItem> </MenuList> </Menu> </MenuItem> <MenuItem>Edit Profile</MenuItem> <MenuItem>Preferences</MenuItem> </MenuList> </Menu>
項目選択時にメニューを閉じない
項目選択時にメニューを閉じたくない場合は、closeOnSelect
をfalse
に設定します。
編集可能な例
<Menu closeOnSelect={false}> <MenuButton as={Button} rightIcon={<ChevronDownIcon fontSize="xl" />}> Menu </MenuButton> <MenuList> <MenuItem>Set status</MenuItem> <MenuItem closeOnSelect={true}>Edit Profile</MenuItem> <MenuItem>Preferences</MenuItem> </MenuList> </Menu>
フォーカスが外れた場合にメニューを閉じない
フォーカスが外れた場合にメニューを閉じたくない場合は、closeOnSelect
をfalse
に設定します。
編集可能な例
<Menu closeOnBlur={false}> <MenuButton as={Button} rightIcon={<ChevronDownIcon fontSize="xl" />}> Menu </MenuButton> <MenuList> <MenuItem>Set status</MenuItem> <MenuItem>Edit Profile</MenuItem> <MenuItem>Preferences</MenuItem> </MenuList> </Menu>
項目を無効にする
項目を無効にする場合は、isDisabled
をtrue
に設定します。
編集可能な例
<Menu> <MenuButton as={Button} rightIcon={<ChevronDownIcon fontSize="xl" />}> Menu </MenuButton> <MenuList> <MenuItem>Set status</MenuItem> <MenuItem isDisabled>Edit Profile</MenuItem> <MenuItem>Preferences</MenuItem> </MenuList> </Menu>
無効な項目のフォーカスを許可する
無効な項目のフォーカスを許可する場合は、isFocusable
をtrue
に設定します。
編集可能な例
<Menu> <MenuButton as={Button} rightIcon={<ChevronDownIcon fontSize="xl" />}> Menu </MenuButton> <MenuList> <MenuItem>Set status</MenuItem> <MenuItem isDisabled isFocusable> Edit Profile </MenuItem> <MenuItem>Preferences</MenuItem> </MenuList> </Menu>
遅延レンダリング
デフォルトでは、アクティブに関わらずDOMにレンダリングされます。つまり、非表示もレンダリングされているが、スタイルによって非表示になっていることになります。
アクティブになるまで、レンダリングを遅延させたい場合は、isLazy
をtrue
に設定します。
編集可能な例
<Menu isLazy> <MenuButton as={Button} rightIcon={<ChevronDownIcon fontSize="xl" />}> Menu </MenuButton> <MenuList> <MenuItem>Set status</MenuItem> <MenuItem>Edit Profile</MenuItem> <MenuItem>Preferences</MenuItem> </MenuList> </Menu>
制御する
編集可能な例
const { isOpen, onOpen, onClose } = useDisclosure() return ( <Menu isOpen={isOpen} onOpen={onOpen} onClose={onClose}> <MenuButton as={Button} rightIcon={<ChevronDownIcon fontSize="xl" />}> Menu </MenuButton> <MenuList> <MenuItem>Set status</MenuItem> <MenuItem>Edit Profile</MenuItem> <MenuItem>Preferences</MenuItem> </MenuList> </Menu> )
GitHubでこのページを編集する