컴포넌트 밖을 클릭 했을때 callback 함수를 호출하도록 하는 custom hooks
import React, { useEffect } from 'react'
export function useOutSideClick(
ref: React.MutableRefObject<any>, // generic으로 바꿀 예정
handlerCallback: (event?: CustomEvent<MouseEvent>) => void,
): void {
useEffect(() => {
// 커스텀 이벤트 선언
const listener = (event: CustomEvent<MouseEvent>) => {
// reference가 없거나
// 클릭한 element가 reference 하위에 속한 element라면
// 함수 종료
if (!ref.current || ref.current.contains(event.target)) {
return
}
handlerCallback(event)
}
// component 가 mount 되었을때 document에 event 등록
document.addEventListener('mousedown', listener as EventListener)
document.addEventListener('touchstart', listener as EventListener)
return () => {
// component가 unmount 되었을때 document에서 event 등록 해제
document.removeEventListener('mousedown', listener as EventListener)
document.removeEventListener('touchstart', listener as EventListener)
}
// ref나 callback 함수가 변경되었을때 이벤트 새로 생성 및 등록
}, [ref, handlerCallback])
}
'Language & Library > React' 카테고리의 다른 글
Recoil로 파라미터가 포함된 비동기 데이터 쿼리호출 (with TypeScript) (0) | 2021.06.02 |
---|---|
Recoil의 설치 및 기본 개념 (0) | 2021.05.25 |
React의 Virtual DOM(VDOM)과 Diffing 알고리즘 (0) | 2020.09.09 |
"Parsing error: Unexpected token =eslint" 에러 CRA(create-react-app)의 package.json 설정으로 해결 (2) | 2020.08.10 |
[create-react-app] 다른 host에서 접근하기 (0.0.0.0) (0) | 2020.05.18 |
댓글