react 点击弹窗之外关闭弹窗 demo

本文介绍了如何在React中利用ref来实现在点击弹窗外的区域时关闭弹窗的功能。通过监听document的点击事件,比较点击事件的目标元素是否在弹窗内,从而决定是否关闭弹窗。关键代码在于判断条件:`!this.inputRef.current.contains(e.target as Node) && this.inputRef.current !== e.target`。
摘要由CSDN通过智能技术生成

最近做一个需求,想要点击空白的地方关闭弹窗,网上找了好久,没有一个能用的,后面用ref实现了,记录一下

原理就是用ref来获取DOM元素,进行比对,如果被点击的event是弹窗本身或者包含弹窗,就不处理,如果弹窗之外的区域,就关闭

react 的实现demo如下:

interface IDemoState {
  open: boolean;
}
 
class Demo extends React.Component<{}, IDemoState> {
  
  public inputRef = React.createRef<HTMLDivElement>();
 
  constructor(props: IDeliveryLocationProps) {
    super(props);
    this.state = {
      open: false,
    };
  }
 
  componentDidMount() {
    this.getAddress();
    document.addEventListener('click', this.handleDocumentClick);
  }
 
  componentWillUnmount() {
    document.removeEventListener('click', this.handleDocumentClick);
  }
  /**点击弹窗之外的地方弹窗消失 */
  handleDocumentClick = (e: Event) => {
    if (!this.inputRef.current) {
      return;
    }
 /**点击弹窗之内的,不关闭;点击弹窗之外的,关闭 */
    if (!this.inputRef.current.contains(e.target as Node) 
         && this.inputRef.current !== e.target) {
     
      this.setState({
        open: false,
      });
    }
  };
  render() {
    return (
		 <div >
		   <div  ref={this.inputRef}>
			{ this.state.open && <span >弹窗</span>}                 
		   </div>	
		   
		   <div >			 
			弹窗之外			  
		   </div>
		 </div>
    );
  }
}

 

最关键的就是这个判断了

if (!this.inputRef.current.contains(e.target as Node) 
        && this.inputRef.current !== e.target)

如果是弹窗区域或者包含弹窗区域,则不处理;反之,则关闭弹窗

 

来源:https://blog.csdn.net/yangbo10086/article/details/105123406?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-5.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-5.control

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值