Компонент Menu в Chakra UI предназначен для создания выпадающих меню с различными уровнями вложенности и интерактивными элементами. Он полностью управляемый, поддерживает клавиатурную навигацию и адаптируется под различные экраны, обеспечивая высокую доступность (accessibility).
Компонент состоит из нескольких ключевых частей:
Простейший пример:
import { Menu, MenuButton, MenuList, MenuItem, Button } from "@chakra-ui/react";
<Menu>
<MenuButton as={Button} colorScheme="blue">
Открыть меню
</MenuButton>
<MenuList>
<MenuItem>Пункт 1</MenuItem>
<MenuItem>Пункт 2</MenuItem>
<MenuItem>Пункт 3</MenuItem>
</MenuList>
</Menu>
MenuButton можно стилизовать как обычную кнопку
Chakra UI. Он поддерживает свойства as,
variant, size, colorScheme и
другие.
Пример с иконкой и кастомной кнопкой:
import { Menu, MenuButton, MenuList, MenuItem, Button, ChevronDownIcon } from "@chakra-ui/react";
<Menu>
<MenuButton as={Button} rightIcon={<ChevronDownIcon />} colorScheme="teal">
Опции
</MenuButton>
<MenuList>
<MenuItem>Редактировать</MenuItem>
<MenuItem>Удалить</MenuItem>
</MenuList>
</Menu>
Для логического разделения элементов используется MenuGroup и MenuDivider. Это полезно для создания категорий внутри меню.
<Menu>
<MenuButton as={Button}>Меню</MenuButton>
<MenuList>
<MenuGroup title="Файлы">
<MenuItem>Создать</MenuItem>
<MenuItem>Открыть</MenuItem>
</MenuGroup>
<MenuDivider />
<MenuGroup title="Правка">
<MenuItem>Копировать</MenuItem>
<MenuItem>Вставить</MenuItem>
</MenuGroup>
</MenuList>
</Menu>
MenuOptionGroup позволяет создавать радиокнопки или чекбоксы внутри меню:
<Menu>
<MenuButton as={Button}>Выбор цвета</MenuButton>
<MenuList>
<MenuOptionGroup defaultValue="red" title="Цвет" type="radio">
<MenuItemOption value="red">Красный</MenuItemOption>
<MenuItemOption value="blue">Синий</MenuItemOption>
<MenuItemOption value="green">Зеленый</MenuItemOption>
</MenuOptionGroup>
</MenuList>
</Menu>
type="radio" – только один пункт может быть
выбран.type="checkbox" – позволяет выбрать несколько
элементов.Компонент поддерживает контролируемое открытие через
isOpen, onOpen и onClose:
import { useDisclosure, Menu, MenuButton, MenuList, MenuItem, Button } from "@chakra-ui/react";
const { isOpen, onOpen, onClose } = useDisclosure();
<Menu isOpen={isOpen}>
<MenuButton as={Button} onCl ick={onOpen}>Меню</MenuButton>
<MenuList>
<MenuItem onCl ick={onClose}>Пункт 1</MenuItem>
<MenuItem onCl ick={onClose}>Пункт 2</MenuItem>
</MenuList>
</Menu>
Это позволяет интегрировать меню с логикой приложения и управлять его состоянием программно.
Chakra UI поддерживает создание вложенных меню, используя комбинацию
Menu внутри MenuItem:
<Menu>
<MenuButton as={Button}>Главное меню</MenuButton>
<MenuList>
<MenuItem>Основной пункт</MenuItem>
<Menu>
<MenuItem>Пункт с подменю
<MenuList>
<MenuItem>Подпункт 1</MenuItem>
<MenuItem>Подпункт 2</MenuItem>
</MenuList>
</MenuItem>
</Menu>
</MenuList>
</Menu>
aria атрибуты для корректной
работы с экранными читалками.Все элементы меню можно кастомизировать с помощью стандартных Chakra UI свойств:
<MenuList bg="gray.50" borderColor="gray.200">
<MenuItem _hover={{ bg: "teal.100" }} _focus={{ bg: "teal.200" }}>
Пункт 1
</MenuItem>
<MenuItem _active={{ bg: "teal.300" }}>Пункт 2</MenuItem>
</MenuList>
_hover – стили при наведении мыши_focus – стили при фокусе клавиатурой_active – стили при нажатииКомпонент Menu является мощным инструментом для создания интерактивных и доступных выпадающих меню в React-приложениях на базе Chakra UI. Он сочетает простоту использования с высокой кастомизацией и поддержкой сложных сценариев интерфейса.