https://ant.design/components/modal
Modal - Ant Design
An enterprise-class UI design language and React UI library with a set of high-quality React components, one of best React UI library for enterprises
ant.design
antd라이브러리에는 자체적인 Modal 컴퍼넌트를 제공합니다.
라이브러리가 굉장히 친절해서 아래 사진의 노란 버튼을 누르면 소스코드도 보여줍니다.
해당 url의 api부분에서 할당가능한 attribute 목록을 확인할 수 있습니다.
이 중에서 저는 footer( 아래에 있는 버튼2개)을 제거하고 esc와 외부 클릭으로 나갈 수 있는 모달을 만들려고 했습니다.
만들어진 모양은 아래와 같습니다.
작성코드
import { Modal } from 'antd';
import { ReactNode } from 'react';
// import { styled } from 'styled-components';
interface CommonModalProps {
isModalOpen: boolean;
children: ReactNode;
setIsModalOpen: React.Dispatch<React.SetStateAction<boolean>>;
}
const CommonModal: React.FC<CommonModalProps> = ({ setIsModalOpen, isModalOpen, children }) => {
return (
<div>
<Modal open={isModalOpen} footer={null} onCancel={() => setIsModalOpen(false)} keyboard centered maskClosable>
{children}
</Modal>
</div>
);
};
export default CommonModal;
이때 할당된 각각의 attribute를 설명하면 아래와 같습니다
open : true가 할당되면 모달이 열립니다.
footer 하단의 버튼 2개 (cancle 와 ok)를 보여줄 지 선택합니다.
onCancel : 닫기 기능을 수행할 함수를 할당합니다. 이떄 저는 isModalOpen 변수로 열기 떄문에 이를 false로 만드는 함수를 할당했습니다)
keyboard : esc 누를 시 onCancel 함수 실행
centerd : 모달 가운데 정렬
maskClosable : 화면 밖의 영역 누를 시 onCancel 함수 실행
api읽을 때는 maskClosable이 true이면 외부 영역 클릭시 닫힌다고 적혀 있어서 시간을 좀 썼습니다... onCancel이 중요한데,,
이후 UserHome 컴퍼넌트 내부의 header 컴퍼넌트에 있는 버튼을 통해서 모달을 여닫습니다.
const UserHome = () => {
const [isModalOpen, setIsModalOpen] = useState<boolean>(false);
const [modalChildren, setModalChildren] = useState<React.ReactNode>(<div></div>);
return (
<LayoutWrapper>
<Header setIsModalOpen={setIsModalOpen} setModalChildren={setModalChildren} />
<Nav />
<Outlet />
<CommonModal isModalOpen={isModalOpen} setIsModalOpen={setIsModalOpen}>
{modalChildren}
</CommonModal>
<Footer />
</LayoutWrapper>
);
};
modalChildren 을 통해서 하위에 컴퍼넌트를 받으려 합니다 (이를 통해서 로그인 회원가입 컴퍼넌트를 교체하려고 합니다.)
하지만 이 코드에선 큰 문제점이 있죠.
바로 isModalOpen 의 상태를 통해서 모달을 여닫기 떄문에 다른 컴퍼넌트의 리랜더링 문제가 생깁니다.
따라서 이를 해결하기 위해서 isModalOpen 상태를 전역변수로 관리하기로 했습니다.
(2부에서 계속)
'프론트엔드' 카테고리의 다른 글
react antd 모달 사이즈 주기 -3 (0) | 2023.08.29 |
---|---|
전역 변수(redux-toolkit) 관리를 통한 모달 컴퍼넌트 리랜더링 관리 - 2 (0) | 2023.08.28 |
react 기본 브라우저 css 없애기 (0) | 2023.08.25 |
typescript 로 axios instance 생성하기 ( JWT토큰 자동전송) (0) | 2023.08.23 |
VITE 란? (0) | 2023.08.22 |