当前位置: 首页 > 面试题库 >

检测React组件外部的点击

龙永思
2023-03-14
问题内容

我正在寻找一种检测点击事件是否在组件外部发生的方法。jQuery最近的()用于查看click事件中的目标是否具有dom元素作为其父元素之一。如果存在匹配项,则单击事件属于子项之一,因此不被视为在组件之外。

因此,在我的组件中,我想将单击处理程序附加到窗口。当处理程序触发时,我需要将目标与组件的dom子代进行比较。

click事件包含“path”之类的属性,该属性似乎包含事件经过的dom路径。我不确定要比较什么或如何最好地遍历它,并且我认为有人必须已经将其放在聪明的实用程序函数中了……不?


问题答案:

以下解决方案使用ES6,并遵循最佳实践进行绑定以及通过一种方法设置ref。

Class Implementation::

import React, { Component } from 'react';

/**
 * Component that alerts if you click outside of it
 */
export default class OutsideAlerter extends Component {
  constructor(props) {
    super(props);

    this.setWrapperRef = this.setWrapperRef.bind(this);
    this.handleClickOutside = this.handleClickOutside.bind(this);
  }

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

  componentWillUnmount() {
    document.removeEventListener('mousedown', this.handleClickOutside);
  }

  /**
   * Set the wrapper ref
   */
  setWrapperRef(node) {
    this.wrapperRef = node;
  }

  /**
   * Alert if clicked on outside of element
   */
  handleClickOutside(event) {
    if (this.wrapperRef && !this.wrapperRef.contains(event.target)) {
      alert('You clicked outside of me!');
    }
  }

  render() {
    return <div ref={this.setWrapperRef}>{this.props.children}</div>;
  }
}

OutsideAlerter.propTypes = {
  children: PropTypes.element.isRequired,
};

Hooks Implementation:

import React, { useRef, useEffect } from "react";

/**
 * Hook that alerts clicks outside of the passed ref
 */
function useOutsideAlerter(ref) {
  useEffect(() => {
    /**
     * Alert if clicked on outside of element
     */
    function handleClickOutside(event) {
      if (ref.current && !ref.current.contains(event.target)) {
        alert("You clicked outside of me!");
      }
    }

    // Bind the event listener
    document.addEventListener("mousedown", handleClickOutside);
    return () => {
      // Unbind the event listener on clean up
      document.removeEventListener("mousedown", handleClickOutside);
    };
  }, [ref]);
}

/**
 * Component that alerts if you click outside of it
 */
export default function OutsideAlerter(props) {
  const wrapperRef = useRef(null);
  useOutsideAlerter(wrapperRef);

  return <div ref={wrapperRef}>{props.children}</div>;
}


 类似资料:
  • 问题内容: 如何检测Angular中组件 外部 的点击? 问题答案: import { Component, ElementRef, HostListener, Input } from ‘@angular/core’;

  • 问题内容: 我有一个id为“ content- area”的div,当用户在该div之外单击时,我想提醒他们他们在该div之外单击的事实。我将如何使用JavaScript解决此问题? 问题答案: 用纯Javascript 看看这个小提琴,看看这就是你所追求的!

  • 问题内容: 如何检测元素外部的点击?我正在使用Vue.js,因此它将不在我的模板元素之外。我知道如何在Vanilla JS中做到这一点,但是当我使用Vue.js时,我不确定是否有更合适的方法来做到这一点? 我想我可以使用更好的方法来访问元素? 问题答案: 只需设置一次自定义指令即可很好地解决: 用法: 在组件中:

  • 使用此答案中的代码解决单击组件外部的问题: 我不知道如何对不愉快的路径进行单元测试,以使警报不运行,目前为止我得到了什么: 我尝试过: 通过

  • 问题内容: 使用此答案中的代码来解决在组件外部单击的问题: 我不知道如何对不愉快的道路进行单元测试,以使警报不会运行,到目前为止,我得到了什么: 我试过了: 通过发送 节点并发送通过(不模拟) 荷兰国际集团在元件内部(不触发事件侦听器) 我确定我缺少一些小东西,但是我在任何地方都找不到这样的例子。 问题答案: import { mount } from ‘enzyme’ import React

  • 问题内容: 我有一些HTML菜单,当用户单击这些菜单的标题时,它们会完整显示。当用户在菜单区域之外单击时,我想隐藏这些元素。 jQuery可能会发生这种情况吗? 问题答案: 注意:应该避免使用,因为它会破坏DOM中的正常事件流。有关更多信息,请参见本文。考虑使用这种方法,而不是 将单击事件附加到关闭窗口的文档主体。将单独的click事件附加到容器,以停止传播到文档主体。