React useClickOutside

React useClickOutside

import React, {useRef, useState, useEffect} from 'react'

export function useClickOutside<T extends HTMLElement>(callback: () => void): React.RefObject<T> {
  let dom = useRef<T>(null);
  const handleClick = ({target}: Event) => {
    if (target && dom.current && !dom.current.contains(target as Node)) {
      callback()
    }
  }
  useEffect(() => {
    document.addEventListener("click", handleClick)
    return () => {
      document.removeEventListener("click", handleClick)
    }
  }, [])
  return dom;
}

export function App() {
  const [open, setOpen] = useState(false)
  const outsideClickRef:React.RefObject<HTMLElement> = useClickOutside(() => {
    setOpen(false)
  });
  const styles = {
    width: '120px',
    height: '200px',
    border : '2px dashed red'
  };
  const listStyles = {
    display: open ? 'block' : 'none'
  }
  return <div style={styles}>
      <section ref={outsideClickRef}>
        <h3 onClick={() => setOpen(true)}>Click to see menu</h3>
        <ul style={listStyles}>
          <li>menu1</li>
          <li>menu2</li>
          <li>menu3</li>
          <p onClick={() => setOpen(false)}>Close X</p>
        </ul>
      </section>
  </div>
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值