반응형
카엔입니다
카엔
카엔입니다
전체 방문자
오늘
어제
  • 분류 전체보기 (98)
    • 프론트엔드 (74)
      • JavaScript (22)
      • CSS (2)
      • React (21)
      • Next.js (12)
      • 블록체인 (2)
    • 에러 모음 (11)
    • Git (5)
    • 백엔드 (1)
      • GraphQL (1)
    • AWS (2)
    • CS (1)
    • 코딩테스트 (1)
    • 개발 이야기 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 자릿수 채우기
  • useMemo
  • nextron
  • unoptimized error
  • git
  • Cloudfront
  • useCallback
  • ec2
  • DOUBLE CHECK CONFIGURATION Please double check that you have setup a PAID OpenAI API Account. You can read more here: https://docs.agpt.co/setup/#getting-an-api-key
  • Next.js
  • ChatGPT
  • 이벤트루프
  • 자바스크립트 이진수 변환
  • ipc 통신
  • error
  • git 덮어쓰기
  • 구글 스프레드시트 API
  • 모바일 파란 박스
  • nextron ipc
  • 웹상동작과정

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
카엔입니다

카엔

프론트엔드/React

리액트 모달 외부 클릭시 창 닫기

2022. 9. 27. 14:57

해당 코드

const [isToggle, setIsToggle] = useState(false);

const modalRef = useRef<any>();
const closeModalHandler = (e) => {
	if (isToggle && (!modalRef.current || !modalRef.current.contains(e.target))) setIsToggle(false);
};

useEffect(() => {
	window.addEventListener("click", closeModalHandler);
	return () => {
		window.removeEventListener("click", closeModalHandler);
	};
}, []);

return (
	<Modal ref={modalRef}>
		...
	</Modal>
)

모달에 해당하는 DOM을 ref로 지정

클릭 이벤트가 발생하면 모달에 current 상태와 현재 이벤트를 실행한 element가 e.target에 포함되어있는지 확인

useCustomHook

해당 코드를 재사용하기 위해 커스텀 훅으로 만들 수 있다

Custom Hook

import { useEffect, useRef } from 'react'

export default function useOnClickOutsideRef(callback, initialState = null) {
  const thisDomRef = useRef(initialState);

  useEffect(() => {
    function modalCloseHandler(event) {
      if (!thisDomRef.current?.contains(event.target)) {
        callback()
      }
    }
    window.addEventListener('click', modalCloseHandler);

    return () => window.removeEventListener('click', modalCloseHandler);
  }, [callback]);

  return thisDomRef;
}

코드 적용

const App = () => {
    const [isOpen, setIsOpen] = useState(true)
    const modalRef = useOnClickOutsideRef(() => setIsOpen(false))

    return (
	      <div>
	          <button onClick={() => setIsOpen(true)}>Open Modal</button>

            <Modal ref={modalRef} isOpen={isOpen}>
								...
            </Modal>
				</div>
    )
}

'프론트엔드 > React' 카테고리의 다른 글

react lightweight chart 트레이딩뷰 마우스 이탈 이벤트  (0) 2022.10.23
리덕스 dispatch시 렌더링 발생 방식 및 최적화  (0) 2022.09.28
React DatePicker click on close  (1) 2022.09.26
useEffect  (0) 2022.06.13
React 리액트 렌더링 과정  (0) 2022.06.11
    '프론트엔드/React' 카테고리의 다른 글
    • react lightweight chart 트레이딩뷰 마우스 이탈 이벤트
    • 리덕스 dispatch시 렌더링 발생 방식 및 최적화
    • React DatePicker click on close
    • useEffect
    카엔입니다
    카엔입니다
    https://www.kaen.site/

    티스토리툴바