모달이나 드롭다운은 외부 요소를 클릭했을 때 닫히도록 구현하면 사용자 경험을 향상할 수 있다.
리액트의 useRef 훅을 활용하여 이를 구현하기 위한 방법에 대해 알아보자!

useRef를 사용하여 함수형 컴포넌트 내에서 생성된 DOM 요소에 접근할 수 있다.useRef는 렌더링과 무관하게 데이터를 저장할 때 유용useRef는 리렌더링되지 않는다.useRef의 current 속성을 사용하여 값에 접근할 수 있다.useRef(initialValue)를 사용할 수 있다.useRef로 생성한 객체는 컴포넌트의 라이프사이클과 관련이 없으므로, useEffect의 의존성 배열에 포함시키지 않아도 된다.useOutsideClick 커스텀 훅 작성callback)를 받고, useRef 훅을 사용하여 요소의 참조를 생성useEffect를 사용한 이벤트 리스너 등록import { useRef, useEffect } from "react";
export const useOutsideClick = (callback: () => void) => {
const ref = useRef<HTMLDivElement>(null);
useEffect(() => {
const handleClick = (event: MouseEvent) => {
callback();
};
document.addEventListener("click", handleClick);
return () => {
document.removeEventListener("click", handleClick);
};
}, [callback, ref]);
return ref;
};
useOutsideClick 커스텀 훅 사용const modalRef = useOutsideClick(() => {
// 외부 클릭 시 실행할 동작 (예: 모달 닫기)
closeModal();
});
ref를 요소에 연결반환된 modalRef를 JSX 요소의 ref 속성에 할당하여 외부 클릭 이벤트를 감지할 대상 요소를 지정
return (
<div ref={modalRef} className="modal">
{/* 모달 내용 */}
<p>This is a modal!</p>
</div>
);
이제 modalRef가 가리키는 요소 외부를 클릭하면 callback으로 전달된 함수가 실행되어 원하는 동작을 수행할 수 있다.
References
[OutsideClick] outside click 구현 #1
React Hook: Detect Click outside of Component