第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

檢測(cè)React組件外部的單擊

檢測(cè)React組件外部的單擊

慕妹3242003 2019-08-24 14:39:40
檢測(cè)React組件外部的單擊我正在尋找一種方法來檢測(cè)是否在組件外發(fā)生了單擊事件,如本文所述。jQuery nearest()用于查看click事件中的目標(biāo)是否具有dom元素作為其父元素之一。如果匹配,則click事件屬于其中一個(gè)子項(xiàng),因此不被視為在組件之外。所以在我的組件中,我想將一個(gè)單擊處理程序附加到窗口。當(dāng)處理程序觸發(fā)時(shí),我需要將目標(biāo)與我的組件的dom子項(xiàng)進(jìn)行比較。click事件包含“path”之類的屬性,它似乎保存了事件所經(jīng)過的dom路徑。我不確定要比較什么或如何最好地遍歷它,我認(rèn)為有人必須已經(jīng)把它放在一個(gè)聰明的實(shí)用功能中......不是嗎?
查看完整描述

3 回答

?
HUH函數(shù)

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超4個(gè)贊

以下解決方案使用ES6并遵循綁定的最佳實(shí)踐以及通過方法設(shè)置ref。

要看到它的實(shí)際效果:

課程實(shí)施:

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,};

鉤子實(shí)施:

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

  useEffect(() => {
    // Bind the event listener
    document.addEventListener("mousedown", handleClickOutside);
    return () => {
      // Unbind the event listener on clean up
      document.removeEventListener("mousedown", handleClickOutside);
    };
  });}/**
 * 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>;}


查看完整回答
反對(duì) 回復(fù) 2019-08-24
?
蠱毒傳說

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊

UseOnClickOutside Hook - React 16.8 +

創(chuàng)建一個(gè)通用useOnOutsideClick函數(shù)

export const useOnOutsideClick = handleOutsideClick => {
  const innerBorderRef = useRef();

  const onClick = event => {
    if (
      innerBorderRef.current &&
      !innerBorderRef.current.contains(event.target)
    ) {
      handleOutsideClick();
    }
  };

  useMountEffect(() => {
    document.addEventListener("click", onClick, true);
    return () => {
      document.removeEventListener("click", onClick, true);
    };
  });

  return { innerBorderRef };};const useMountEffect = fun => useEffect(fun, []);

然后在任何功能組件中使用鉤子。

const OutsideClickDemo = ({ currentMode, changeContactAppMode }) => {

  const [open, setOpen] = useState(false);
  const { innerBorderRef } = useOnOutsideClick(() => setOpen(false));

  return (
    <div>
      <button onClick={() => setOpen(true)}>open</button>
      {open && (
        <div ref={innerBorderRef}>
           <SomeChild/>
        </div>
      )}
    </div>
  );};

鏈接到演示


查看完整回答
反對(duì) 回復(fù) 2019-08-24
  • 3 回答
  • 0 關(guān)注
  • 732 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)