모달창 구현 방법
- state 로 Modal 노출 여부를 관리한다.
- useState 훅으로 모달창 노출 여부를 관리해준다.
import { useState } from 'react';
import ModalBasic from '../src/common/ModalBasic';
function Modal() {
const [modalOpen, setModalOpen] = useState(false);
const showModal = () => {
setModalOpen(true);
};
return (
<div>
<button onClick={showModal}>모달 띄우기</button>
{modalOpen && <ModalBasic setModalOpen={setModalOpen} />}
</div>
);
}
export default Modal;
import styles from './ModalBasic.module.css';
function ModalBasic({ setModalOpen, id, title, content, writer }: PropsType) {
const closeModal = () => {
setModalOpen(false);
};
return (
<div className={styles.container}>
<button className={styles.close} onClick={closeModal}>
X
</button>
<p>모달창입니다.</p>
</div>
);
}
export default ModalBasic;
- Modal 창이 최상위에 노출되도록 CSS를 조정한다.
- position: absolute로 위치를 조정한다.
- z-index를 높게 줘서 최상위에 노출 시킨다.
.container {
width: 300px;
height: 200px;
z-index: 999;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background-color: gray;
border: 1px solid black;
border-radius: 8px;
}
.close {
position: absolute;
right: 10px;
top: 10px;
}
- 모달창 외부 클릭시, 모달창 제거 처리해준다.
- 모달창 외부 document 클릭 이벤트를 달아준다.
import { useEffect, useRef } from 'react';
import styles from './ModalBasic.module.css';
function ModalBasic({ setModalOpen, id, title, content, writer }: PropsType) {
const closeModal = () => {
setModalOpen(false);
};
const modalRef = useRef<HTMLDivElement>(null);
useEffect(() => {
const handler = () => {
if (modalRef.current && !modalRef.current.contains(event.target)) {
setModalOpen(false);
}
};
document.addEventListener('mousedown', handler);
return () => {
document.removeEventListener('mousedown', handler);
};
});
return (
<div ref={modalRef} className={styles.container}>
<button className={styles.close} onClick={closeModal}>
X
</button>
<p>모달창입니다.</p>
</div>
);
}
export default ModalBasic;
참조:
[React] 모달창(Modal) 초간단 구현 방법(리덕스, 라이브러리 X)