Frontend 프론트엔드
[ 33 ] Ant Design 모달창 만들기 실습
박민우_
2024. 6. 23. 17:14
기초 모달 실습
import { Modal } from "antd";
export default function ModalAlertPage(): JSX.Element {
const onClickSuccess = (): void => {
Modal.success({
content: "게시글 등록에 성공했습니다!!",
});
};
const onClickError = (): void => {
Modal.error({
content: "비밀번호가 틀렸습니다",
});
};
return (
<>
<button onClick={onClickSuccess}>성공</button>
<button onClick={onClickError}>실패</button>
</>
);
}
커스텀 모달창 : 확인 버튼과 취소 버튼
import { Modal } from "antd";
import { useState } from "react";
export default function ModalAlertPage(): JSX.Element {
const [isOpen, setIsOpen] = useState(false);
const showModal = (): void => {
setIsOpen(true);
};
const handleOk = (): void => {
setIsOpen(false);
};
const handleCancel = (): void => {
setIsOpen(false);
};
return (
<>
<button onClick={showModal}>모달창 열기 !</button>
<Modal
title="모달 제목"
open={isOpen}
onOk={handleOk}
onCancel={handleCancel}
>
비밀번호 입력 : <input type="password"></input>
</Modal>
</>
);
}
모달창으로 주소입력창 만들기
다음에서 제공하는 주소 컴포넌트를 사용한다.
yarn add react-daum-postcode
import { Modal } from "antd";
import { useState } from "react";
import DaumPostcodeEmbed from "react-daum-postcode";
import type { Address } from "react-daum-postcode";
export default function ModalAlertPage(): JSX.Element {
const [isOpen, setIsOpen] = useState(false);
const showModal = (): void => {
setIsOpen(true);
};
const handleOk = (): void => {
setIsOpen(false);
};
const handleCancel = (): void => {
setIsOpen(false);
};
const handleComplete = (data: Address): void => {
console.log(data);
setIsOpen(false);
};
return (
<>
<button onClick={showModal}>모달창 열기 !</button>
{/* 모달 종료 방식 1. 모달 숨기는 방법 ex. 이력서 등 */}
<Modal
title="모달 제목"
open={isOpen}
onOk={handleOk}
onCancel={handleCancel}
>
<DaumPostcodeEmbed onComplete={handleComplete} />
</Modal>
</>
);
}
문제상황
주소를 클릭하고 나서 모달이 꺼졌을 때 , 모달을 다시 클릭해도 주소창이 뜨지 않는다. 모달을 삭제해줬다가 다시 렌더링 해주는 방법을 사용해야 한다.
해결 코드
import { Modal } from "antd";
import { useState } from "react";
import DaumPostcodeEmbed from "react-daum-postcode";
import type { Address } from "react-daum-postcode";
export default function ModalAlertPage(): JSX.Element {
const [isOpen, setIsOpen] = useState(false);
const showModal = (): void => {
setIsOpen(true);
};
const handleOk = (): void => {
setIsOpen(false);
};
const handleCancel = (): void => {
setIsOpen(false);
};
const handleComplete = (data: Address): void => {
console.log(data);
setIsOpen(false);
};
return (
<>
<button onClick={showModal}>모달창 열기 !</button>
{/* 모달 종료 방식 2. 모달 삭제하는 방법 ex. 신용카드, 비밀번호 등 */}
{isOpen && (
<Modal
title="모달 제목"
open={true}
onOk={handleOk}
onCancel={handleCancel}
>
<DaumPostcodeEmbed onComplete={handleComplete} />
</Modal>
)}
</>
);
}
모달창 리팩토링하기
setState((prev)=>!prev) 를 이용하면 토글 함수를 쉽게 구현 할 수 있다.
import { Modal } from "antd";
import { useState } from "react";
import DaumPostcodeEmbed from "react-daum-postcode";
import type { Address } from "react-daum-postcode";
export default function ModalAlertPage(): JSX.Element {
const [isOpen, setIsOpen] = useState(false);
const onToggleModal = () => {
setIsOpen((prev) => !prev);
};
const handleComplete = (data: Address): void => {
console.log(data);
onToggleModal();
};
return (
<>
<button onClick={onToggleModal}>모달창 열기 !</button>
{/* 모달 종료 방식 2. 모달 삭제하는 방법 ex. 신용카드, 비밀번호 등 */}
{isOpen && (
<Modal
title="모달 제목"
open={true}
onOk={onToggleModal}
onCancel={onToggleModal}
>
<DaumPostcodeEmbed onComplete={handleComplete} />
</Modal>
)}
</>
);
}
728x90