Я хочу закрыть модальный режим, когда нажата клавиша esc

#reactjs #styled-components

Вопрос:

Мы используем компоненты react и style.
При нажатии кнопки справа отображается модальный(выдвижной ящик).
Я хочу, чтобы модальный режим закрывался при нажатии кнопки esc.
Как я могу определить, что кнопка esc была нажата? codesandbox

 import Drawer from "./components/Drawer";
import { FunctionComponent, useState } from "react";

const App: FunctionComponent = () => {
  const [isOpen, setIsOpen] = useState(false);
  const onClose = () => {
    setIsOpen(false);
  };
  return (
    <div className="App">
      <button onClick={() => setIsOpen(!isOpen)}>button</button>
      <Drawer isOpen={isOpen} onClose={onClose}></Drawer>
    </div>
  );
};

export default App;
 
 import React from "react";
import styled from "styled-components";

type Props = {
  isOpen: boolean;
  padding?: number;
  children: React.ReactNode;
  onClose: () => void;
  handleKeyDown: () => void;
};

export default (props: Props) => {
  return (
    <>
      <Overlay isOpen={props.isOpen} onClick={props.onClose} />
      <DrawerModal {...props}>{props.children}</DrawerModal>
    </>
  );
};

const DrawerModal = styled.div<Props>`
  position: absolute;
  overflow: scroll;
  top: 0;
  right: 0;
  height: 100vh;
  width: ${({ isOpen }: Props) => (isOpen ? 400 : 0)}px;
  background: blue;
  box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.25);
  transition: 200ms cubic-bezier(0.25, 0.1, 0.24, 1);
`;

const Overlay = styled.div<{ isOpen: boolean }>`
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: ${(props: { isOpen: boolean }) => (props.isOpen ? 0 : -1)};
`;

 

Ответ №1:

Используйте подобный эффект для обработки событий клавиатуры, подобных этому:

 useEffect(() => {
  function handleEscapeKey(event: KeyboardEvent) {
    if (event.code === 'Escape') {
      setIsOpen(false)
    }
  }

  document.addEventListener('keydown', handleEscapeKey)
  return () => document.removeEventListener('keydown', handleEscapeKey)
}, [])
 

Эффект объявляет функцию, которая обрабатывает keydown событие, и проверяет, была ли нажата клавиша escape. Затем он привязывает этот обработчик событий к документу. Когда компонент удаляется, он очищается, удаляя обработчик событий из документа.

Комментарии:

1. эй, Алекс, могу я узнать, почему в этом случае необходимо прекратить распространение ?

2. @Codenewbie Ха, ты прав! Я не думаю, что в этом есть необходимость.