useState를 이용하여modalcomponent 와modal-contentcomponent (SearchModal, CartModal ... )의 상태를 관리한다.children을 사용하여modalcomponet ->modal-content으로 레이아웃을 전달함, 컨텐츠내용만 분리하여 관리 할수 있도록 한다.- 최상위 component인
App.js에modal의 상태관리, 이벤트함수를 등록해두고 언제든지modal기능을 사용하고싶은layout이 있다면props으로 간단하게 전달하여 사용 할 수있도록 구현함
component
---assets
------styles
------img
---layout
---routes
---utils
Modal
---Modal.js //공통컴포넌트
---SearchModal.js //파생컴포넌트
---CartAddModal.js //파생컴포넌트
-기본적인 모달 레이아웃 스타일링은 추후 포스팅할 예정
npm install styled-componet
modal을 공통레이아웃으로 쓰기위해 열기,닫기,제목,그리고modal-content가 들어갈 children을 props으로 전달한다.
modal component 의 open, close를 관리하는 상태함수와modal-content의 title을 관리하는 상태함수modal-content의 내용을 업데이트하는 상태함수를 생성하여App.js에 등록해둔다. const [isModalOpen, setIsModalOpen] = useState(false);
const [modalTitle, setModalTitle] = useState('');
const [modalContent, setModalContent] = useState(null);
modal이 열렸을때 / 닫혔을때 이벤트를 동록한다. const openModal = (title, content) => {
setModalTitle(title);
setModalContent(content);
setIsModalOpen(true);
};
const closeModal = () => {
setModalTitle('');
setModalContent(null);
setIsModalOpen(false);
};
<div>
<Modal
isOpen={isModalOpen}
onClose={closeModal}
title={modalTitle}
>
{modalContent}
</Modal>
</div>
// + 추후 수정하기
(모달창의 z-index 적용 X 임시방편으로 최하단에 코드 추가하여 상단에 위치하게함)
최상위 부모 컴포넌트인 App.js에서 header(사용하고자하는 layout) 에서 modal기능을 사용하기 위해
모달의 기능을 openmodal={openModal}의형태로 props를 전달하였다.
modal 내부의 상태값과 x버튼 클릭시 닫히는 closeModal이벤트 함수 및 제목상태함수도 props도 같이 전달한다.
<Header openModal={openModal} />
//props 전달
<Modal
isOpen={isModalOpen}
onClose={closeModal}
title={modalTitle}
>
{modalContent}
</Modal>
header (사용하고자하는 layout) component에서 전달받은openmodal props를 받아온다.
modal의 기능이 사용될 menu에 (button, Link, 등등 ... ) 에
onclick 이벤트를 걸어 모달이열리는 함수 openmodal을 적용시켜준다.
이 때, {modalcontent}에 넣을 동적컨텐츠 들은 <component />로 작성하여 openModal함수 속에 넣어주면된다!
동적으로 들어갈 제목도 openmodal 함수 속 ' '안에 입력하면 끝!
export default function Header({ openModal }) {
//props 받아오기
<Link onClick={() => openModal('검색tite입니다.', <SearchModal />)}>검색</Link>
}
