▶ 리액트에서 유용한 커스텀 훅인 useOnClickOutside가 있다.
▶ 아래 화면중에서 쿵푸팬더 화면은 모달창이고 그 외의 부분을 클릭했을 때 닫히는 커스텀 훅이다.
▶ 코드는 아래와 같다
import React from 'react';
import { useEffect } from 'react';
const UseOnClickOutside = (ref,handler) => {
useEffect(() => {
const listener = (event)=>{
if(ref.current.contains(event.target)){
return
} else{
handler();
}
};
document.addEventListener('mousedown',listener)
return () => {
document.removeEventListener('mousedown',listener)
};
}, [ref,handler]);
}
export default UseOnClickOutside;
▶ 위의 코드를 보면 addeventlistener에서 자주쓰는 click이 아니라 mousedown을 쓰고 있다.
▶ 만약 해당부분을 click으로 바꾸게 되면 모달창을 띄우려고 해도 뜨지 않는다.
▶ 이유는 '이벤트 버블링'현상 때문이다. 창을 열려는 click과 커스텀훅의 click이 순간적으로 작동하여 열리고 닫힌다. 그래서 아무 것도 안 일어나는 것처럼 보인다.
▶ 이를 회피하기 위해서 'mousedown'을 사용하며, addEventListener에 3번째 인자를 넣어서도 해결 가능하다
document.addEventListener('click', listener, true)