728x90
    
    
  웹 개발을 하게 되면, 모달창을 불가피하게 만들어야 하는 상황이 찾아오곤 합니다.
하지만, 단순히 창을 껐다 켰다 하면 속 편하겠지만, 모달창 외부를 클릭했을 때, 모달창을 꺼지는 기능을 만들어야 깔끔합니다.
이번에는 모달창 외부 클릭 시 On/Off를 만들어 볼 예정입니다.
문서 구조

App.js 전체 코드
import "./styles.css";
import React, {useState, useEffect,useRef } from 'react';
import Modal from "./modal.js"
export default function App() {
  const [ModalState, setModalState] = useState('false'); //모달창의 상태를 보관해 둘 useState입니다.
  function OnOffModal(){ //모달창 상태를 변경하는 함수입니다.
    if(ModalState===true){
      setModalState(false);
    }else{
      setModalState(true);
    }
  }
  return (
    <div className="App">
      <h1>모달창 예제</h1>
      <button onClick={OnOffModal}>모달창 켜기</button>
      {ModalState === true ? //모달 상태가 true면 1번, false면 2번이 작동합니다.
      <div style={{display:"flex",position:"fixed",top:"0",left: "0", bottom: "0", right: "0",justifyContent:"center",alignItems:"center", zIndex : "100"}}>
        <Modal setModalState={setModalState}/> 
      </div>
      
      : ""}
      
    </div>
  );
}
Modal.js 전체 코드
import React, {useState, useEffect,useRef, forwardRef, } from 'react';
const modal = forwardRef((props, ref) =>{
  let wrapperRef = useRef(); //모달창 가장 바깥쪽 태그를 감싸주는 역할
    useEffect(()=>{
      document.addEventListener('mousedown', handleClickOutside);
      return()=>{
        document.removeEventListener('mousedown', handleClickOutside);
      }
    })
    const handleClickOutside=(event)=>{
      if (wrapperRef && !wrapperRef.current.contains(event.target)) {
        props.setModalState(false);
      }
    }
    function BtnEvent(){
      alert('모달창 내부 작업을 해도 모달창이 꺼지지 않습니다.');
    }
 
      return (
        <div ref={wrapperRef} style={{width:"300px", height:"300px", border:"1px solid",}}>
         
          <button onClick={BtnEvent}>
            모달창 버튼
          </button>
        </div>
      )
  
});
export default modal;'React' 카테고리의 다른 글
| [리액트] 페이지 이동(Routes) (0) | 2022.11.29 | 
|---|---|
| [리액트] 간단한 게시판 CRUD (0) | 2022.11.20 | 
| [리액트] 반응형 페이지 만들기(react-responsive) (1) | 2022.10.07 | 
| [리액트] 부모 컴포넌트에서 자식 컴포넌트 함수 작동과 자식 컴포넌트에서 부모 컴포넌트 작동하는 법 (0) | 2022.09.22 | 
| [리액트] 로그인 회원가입 기능 구현 (2) | 2022.09.07 |