跳到主要内容

useClickInside

import React from 'react';

export default function useClickInside (ref, callback) {
const handleClick = e => {
if (ref.current && ref.current.contains(e.target)) {
callback();
}
};
React.useEffect(() => {
document.addEventListener('click', handleClick);
return () => {
document.removeEventListener('click', handleClick);
};
});
};

介绍

当我们要判断点击事件是否发生在某个元素上的时候,我们首先使用事件监听器 addEventListener 来为DOM元素添加点击事件,并在事件回调函数中访问事件对象(通常以参数的形式传递给回调函数)。 事件对象包含有关事件的信息,这里以 event 来命名参数,我们可以访问属性 event.targetevent.clientXevent.clientY 等。

然后我们通过 useRef 来绑定点击元素的访问对象,判断是否和点击事件的回调参数 target 相等。

使用方法

实时编辑器
function ClickEventPlay () {
  const [count, setCount] = useState(0);

  const ClickBox = ({ onClickInside }) => {
    const clickRef = React.useRef();
    useClickInside(clickRef, onClickInside);

    return (
      <div
        className="click-box"
        ref={clickRef}
        style={{
          border: '2px dashed orangered',
          height: 200,
          width: 380,
          display: 'flex',
          justifyContent: 'center',
          alignItems: 'center',
          userSelect: 'none'
        }}
      >
        <p>Click inside this element {count}</p>
      </div>
    );
  };

  return (
    <ClickBox onClickInside={() => setCount(count + 1)} />
  )
}
结果
Loading...

当点击橙色边框里面的时候数值会递增,而点击外面区域则不会触发 onClickInside 事件。