В Chakra UI компонент Modal используется для создания
модальных окон, которые перекрывают основное содержимое страницы и
привлекают внимание пользователя к важной информации или действиям. Он
полностью управляемый и поддерживает доступность (ARIA), плавные
анимации и адаптивность под мобильные устройства.
Базовая структура модального окна включает несколько ключевых компонентов:
import {
Modal,
ModalOverlay,
ModalContent,
ModalHeader,
ModalCloseButton,
ModalBody,
ModalFooter,
Button,
useDisclosure
} from "@chakra-ui/react";
function Example() {
const { isOpen, onOpen, onClose } = useDisclosure();
return (
<>
<Button onCl ick={onOpen}>Открыть модальное окно</Button>
<Modal isOpen={isOpen} onCl ose={onClose}>
<ModalOverlay />
<ModalContent>
<ModalHeader>Заголовок модального окна</ModalHeader>
<ModalCloseButton />
<ModalBody>
Содержимое модального окна
</ModalBody>
<ModalFooter>
<Button colorScheme="blue" mr={3} onCl ick={onClose}>
Закрыть
</Button>
<Button variant="ghost">Дополнительное действие</Button>
</ModalFooter>
</ModalContent>
</Modal>
</>
);
}
isOpen для управления
состоянием и onClose для обработки закрытия.ModalContent.onClose.Для управления открытием и закрытием используют хук
useDisclosure:
const { isOpen, onOpen, onClose } = useDisclosure();
Можно также управлять модалкой через состояние React:
const [isOpen, setIsOpen] = useState(false);
<Button onCl ick={() => setIsOpen(true)}>Открыть</Button>
<Modal isOpen={isOpen} onCl ose={() => setIsOpen(false)}>...</Modal>
Chakra UI по умолчанию использует framer-motion для
плавных анимаций появления и исчезновения модальных окон. Можно
управлять анимациями через пропсы motionPreset:
<Modal isOpen={isOpen} onCl ose={onClose} motionPreset="slideInBottom">
Доступные варианты:
slideInBottom – анимация с выдвижением снизу.scale – плавное появление с увеличением масштаба.ModalContent поддерживает пропсы для управления
размерами и позиционированием:
<ModalContent maxW="xl" borderRadius="md">
xs,
sm, md, lg, xl,
full).Modal) – предварительно
заданные размеры: xs, sm, md,
lg, xl, full.Модальное окно по умолчанию центрировано по экрану, но можно
использовать isCentered для точного центрирования:
<Modal isOpen={isOpen} onCl ose={onClose} isCentered>
Chakra UI обеспечивает автоматическое управление фокусом при открытии
модалки и возвращение фокуса к элементу, вызвавшему модалку. Для
управления элементами внутри окна используют
initialFocusRef и finalFocusRef:
const initialRef = useRef();
<Modal isOpen={isOpen} onCl ose={onClose} initialFocusRef={initialRef}>
<ModalBody>
<Input ref={initialRef} placeholder="Фокус при открытии" />
</ModalBody>
</Modal>
Chakra UI поддерживает вложенные модальные окна, однако стоит
учитывать порядок слоёв. Каждый Modal создаёт отдельный
портальный слой (Portal).
Для асинхронного контента можно использовать isLoading
на кнопках или условно рендерить ModalBody после загрузки
данных:
<ModalBody>
{loading ? <Spinner /> : <Form />}
</ModalBody>
Модальное окно можно закрывать разными способами:
ModalCloseButtonModalOverlay (по умолчанию true,
можно отключить через closeOnOverlayClick={false})true, можно отключить
через closeOnEsc={false})<Modal isOpen={isOpen} onCl ose={onClose} closeOnOverlayClick={false}>
Модальные окна часто используются для форм. ModalBody
удобно комбинировать с компонентами Input,
Textarea, Select и кнопками из Chakra UI:
<ModalBody>
<FormControl>
<FormLabel>Имя</FormLabel>
<Input placeholder="Введите имя" />
</FormControl>
<FormControl mt={4}>
<FormLabel>Электронная почта</FormLabel>
<Input type="email" placeholder="Введите email" />
</FormControl>
</ModalBody>
ModalFooter обычно содержит кнопки сохранения и
отмены:
<ModalFooter>
<Button colorScheme="blue" mr={3}>Сохранить</Button>
<Button variant="ghost" onCl ick={onClose}>Отмена</Button>
</ModalFooter>
useDisclosure для управления состоянием
нескольких модальных окон.Portal для рендеринга в отдельном слое
и избежания конфликтов стилей.initialFocusRef для улучшения
UX.motionPreset для разнообразных эффектов
появления.Chakra UI делает работу с модальными окнами простой, гибкой и полностью доступной, обеспечивая единообразный интерфейс и поддержку лучших практик UX.