В Chakra UI управление поведением компонентов при нажатии клавиши Escape является важной частью UX, особенно для модальных окон, выпадающих меню и других интерактивных элементов. Chakra UI предоставляет встроенные утилиты и хуки для эффективного управления этим событием.
useDisclosure для управления модальными окнамиКомпонент Modal в Chakra UI тесно интегрирован с хук
useDisclosure. Этот хук позволяет легко управлять
состоянием открытия и закрытия модального окна. Одним из ключевых
аспектов является закрытие модального окна при нажатии Escape.
import { useDisclosure, Button, Modal, ModalOverlay, ModalContent, ModalHeader, ModalBody, ModalFooter } from "@chakra-ui/react";
function ExampleModal() {
const { isOpen, onOpen, onClose } = useDisclosure();
return (
<>
<Button onCl ick={onOpen}>Открыть модальное окно</Button>
<Modal isOpen={isOpen} onCl ose={onClose}>
<ModalOverlay />
<ModalContent>
<ModalHeader>Заголовок</ModalHeader>
<ModalBody>
Контент модального окна
</ModalBody>
<ModalFooter>
<Button onCl ick={onClose}>Закрыть</Button>
</ModalFooter>
</ModalContent>
</Modal>
</>
);
}
В этом примере onClose вызывается автоматически при
нажатии клавиши Escape благодаря встроенной поддержке Chakra UI. Это
поведение можно настроить через проп closeOnEsc.
<Modal isOpen={isOpen} onCl ose={onClose} closeOnEsc={false}>
Установка closeOnEsc={false} отключает закрытие при
Escape, что позволяет реализовать кастомную логику.
Иногда требуется не просто закрыть модальное окно, а выполнить
дополнительное действие при нажатии Escape. Для этого можно использовать
хук useEffect с прослушкой события
keydown.
import { useEffect } from "react";
function useEscapeKey(callback) {
useEffect(() => {
const handleKeyDown = (event) => {
if (event.key === "Escape") {
callback();
}
};
window.addEventListener("keydown", handleKeyDown);
return () => {
window.removeEventListener("keydown", handleKeyDown);
};
}, [callback]);
}
Пример интеграции с модальным окном:
function CustomModal({ isOpen, onClose }) {
useEscapeKey(() => {
console.log("Escape нажата!");
onClose();
});
return (
<Modal isOpen={isOpen} onCl ose={onClose} closeOnEsc={false}>
<ModalOverlay />
<ModalContent>
<ModalHeader>Кастомное модальное окно</ModalHeader>
<ModalBody>Контент с обработкой Escape</ModalBody>
<ModalFooter>
<Button onCl ick={onClose}>Закрыть</Button>
</ModalFooter>
</ModalContent>
</Modal>
);
}
Escape Keydown часто требуется для закрытия Drawer,
Menu и других компонентов.
<Drawer isOpen={isOpen} onCl ose={onClose} closeOnEsc={true}>
<DrawerOverlay />
<DrawerContent>
<DrawerHeader>Заголовок</DrawerHeader>
<DrawerBody>Содержимое</DrawerBody>
<DrawerFooter>
<Button onCl ick={onClose}>Закрыть</Button>
</DrawerFooter>
</DrawerContent>
</Drawer>
<Menu closeOnSelect={true}>
<MenuButton as={Button}>Меню</MenuButton>
<MenuList>
<MenuItem>Элемент 1</MenuItem>
<MenuItem>Элемент 2</MenuItem>
</MenuList>
</Menu>
В Menu закрытие при Escape происходит автоматически,
если меню открыто.
При обработке Escape важно учитывать фокус. Chakra UI использует
фокус-трап в Modal и Drawer, чтобы нажатие
Escape корректно закрывало компонент и возвращало фокус на исходный
элемент. При кастомной реализации необходимо вручную управлять
фокусом:
import { useRef } from "react";
const buttonRef = useRef();
function handleClose() {
buttonRef.current.focus();
}
Это предотвращает потерю фокуса после закрытия компонента и улучшает доступность.
closeOnEsc для
стандартного поведения.useEffect с
обработчиком keydown.Drawer.Эти подходы позволяют создавать интерфейсы с корректной и предсказуемой реакцией на Escape, улучшая UX и доступность приложений на Chakra UI.