개인공부/React

React 외부 클릭시 모달 사라지게 하기

somm12 2023. 6. 16. 20:21

useRef를 이용해서 모달 외부 화면 클릭시, 모달이 사라지도록 구현해보고자 한다.

1. ref = useRef()

2. modalCloseHandler() 정의

3. useEffect 내에서 addEvenlistener, removeeventlistener 사용.

4. 모달 감싸는 element tag에 ref 적용.

const Comment = () => {
  const ref = useRef();//***** useRef 사용.
  const [modalFlag, setModalFlag] = useState(false);
  const modalCloseHandler = ({ target }) => {
    // 모달이 열려있고, ref 영역이 아닌 영역클릭시, 모달 닫기.
    if (modalFlag && !ref.current.contains(target)) setModalFlag(false);
  };
  useEffect(() => {
    document.addEventListener("mousedown", modalCloseHandler);
    // Cleanup the event listener, unmount 될 때, evenListener 제거해주기.
    return () => {
      document.removeEventListener("mousedown", modalCloseHandler);
    };
  }, [modalFlag]);

  return (
    <div>
      <div className={style.commentBox}>
            <h3 onClick={() => setModalFlag(true)}>...</h3>
            {modalFlag && ( // flag가 true일 때만, 모달이 보여짐.
              <div className={style.controlModal} ref={ref}>// ref넣어주기.
                <p className={style.editText}>수정</p>
                <p className={style.deleteText}>삭제</p>
              </div>
            )}
          </div>
    </div>
  );
};

export default Comment;