React/예제
모달 버튼 열고 닫기
lamarcK
2025. 4. 8. 01:00
// App.jsx
import React, { useState } from 'react';
import './App.css';
import Modal from './Modal';
function App() {
const [showModal, setShowModal] = useState(false);
return (
<div className="app">
<h1>모달 테스트</h1>
<button onClick={() => setShowModal(true)}>
모달 열기
</button>
{showModal && (
<Modal onClose={() => setShowModal(false)} />
)}
</div>
);
}
export default App;
/* App.css */
.app {
padding: 20px;
text-align: center;
}
button {
padding: 10px 20px;
font-size: 16px;
cursor: pointer;
}
// Modal.jsx
import React, { useEffect } from 'react';
import './Modal.css';
function Modal({ onClose }) {
useEffect(() => {
console.log("🎉 모달이 나타났습니다! (마운트)");
// cleanup 함수
return () => {
console.log("👋 모달이 사라집니다! (언마운트)");
};
}, []);
return (
<div className="modal-backdrop">
<div className="modal-content">
<h2>안녕하세요!</h2>
<p>이것은 모달입니다.</p>
<button onClick={onClose}>닫기</button>
</div>
</div>
);
}
export default Modal;
/* Modal.css */
.modal-backdrop {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
}
.modal-content {
background-color: white;
padding: 20px;
border-radius: 8px;
width: 300px;
}
// main.jsx
import { createRoot } from 'react-dom/client'
import Components from './App.jsx';
createRoot(document.getElementById('root')).render(
<Components />
)