Как зафиксировать клик за пределами компонента React

Я начал изучать React и пытаюсь реализовать модальное окно. Я одновременно использую TypeScript.

Я хотел зафиксировать щелчок за пределами моего компонента React, поэтому, когда я щелкаю за пределами модального окна, это закрывается. Я основывал свой подход на этом: Как зафиксировать клик за пределами компонента React

import styled from 'styled-components';

const StyledModal = styled.div`
  width: 100%;
  background-color: #fff;
  box-shadow: 0 0 0.625rem, rgba(0, 0, 0, 0.2);

  @media (min-width: 576px) {
    width: 32rem;
  },
`;

class Modal extends React.Component<ModalProps> {
    private modal: HTMLDivElement;

    onOutsideClick = (e: any) => {
      if (!_.isNil(this.modal)) {
        if (!this.modal.contains(e.target)) {
          this.onClose(e);
        }
      }
    }

    componentDidMount() {
      document.addEventListener('mousedown', this.onOutsideClick, false);
    }

    componentWillMount() {
      document.removeEventListener('mousedown', this.onOutsideClick, false);
    }

    render() {
        <div>
            <StyledModal ref = {(node: any) => { this.modal = node; }}>
            ...
            </StyledModal>
        </div>
    }
}

Проблема в том, что всякий раз, когда я щелкаю внутри или снаружи модального окна, я получаю эту ошибку, и я не знаю, что это такое и как ее исправить:

Как зафиксировать клик за пределами компонента React

Любые огни, пожалуйста, дайте мне знать ...

вы можете сделать рабочий пример или коды для своего кода?

Raviteja 09.04.2018 06:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
3
1
2 394
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Поскольку ваш StyledModal - styled-components, вам нужно добавить innerRef, чтобы иметь возможность получить узел DOM. Имейте в виду, что innerRef является настраиваемой опорой только для styled-components.

https://github.com/styled-components/styled-components/blob/master/docs/tips-and-tricks.md#refs-to-dom-nodes

<StyledModal innerRef = {(node: any) => { this.modal = node; }}>
  ...
</StyledModal>

StyledModal - это не настраиваемый компонент, это просто стилизованный компонент. Пожалуйста, проверьте мой обновленный фрагмент кода

ivantxo 09.04.2018 06:56

Я считаю, что вам просто нужно вместо этого добавить innerRef.

Kenneth Truong 09.04.2018 07:03

Я отредактировал свой ответ на для вас. styled-components - это оболочка над узлами DOM, поэтому вам нужно использовать innerRef вместо ref.

Kenneth Truong 09.04.2018 07:11

Начиная с версии styled-components v4, это опора ref.

constructor(props) {
  super(props);
  this.inputRef = React.createRef();
}

render() {
  return (
   <Input
      ref = {this.inputRef}
    />
  );
}

Для получения дополнительной информации Ссылки

Если вы хотите использовать крошечный компонент (466 байт, сжатый в сжатом виде), который уже существует для этой функции, вы можете проверить эту библиотеку реакция-выход. Он позволяет захватывать клики за пределами компонента.

Преимущество библиотеки в том, что она также позволяет обнаруживать щелчки вне одного компонента и внутри другого. Он также поддерживает обнаружение других типов событий.

Другие вопросы по теме