ClickOutsideWrapper.tsx 725 B

123456789101112131415161718192021222324252627282930313233343536
  1. import { PureComponent } from 'react';
  2. import ReactDOM from 'react-dom';
  3. export interface Props {
  4. onClick: () => void;
  5. }
  6. interface State {
  7. hasEventListener: boolean;
  8. }
  9. export class ClickOutsideWrapper extends PureComponent<Props, State> {
  10. state = {
  11. hasEventListener: false,
  12. };
  13. componentDidMount() {
  14. window.addEventListener('click', this.onOutsideClick, false);
  15. }
  16. componentWillUnmount() {
  17. window.removeEventListener('click', this.onOutsideClick, false);
  18. }
  19. onOutsideClick = event => {
  20. const domNode = ReactDOM.findDOMNode(this) as Element;
  21. if (!domNode || !domNode.contains(event.target)) {
  22. this.props.onClick();
  23. }
  24. };
  25. render() {
  26. return this.props.children;
  27. }
  28. }