항해하다/항해 - 8주차
[항해99 8주차] - 실전 프로젝트 (2) - 리액트 portal로 모달 만들기
위르겐
2022. 9. 2. 23:56
글 쓰고 기록하는 습관이
점점 사라지고 있는 것 같아 무섭지만
틈틈이 조금씩이라도 써보려고 한다.
저번 주차 클론 코딩 때는
모달 창 띄우는 게 처음이고
도저히 구글링 해서 새로 공부할 시간이 없어서
모달 창 관리를 개떡같이 했는데
프로젝트 규모가 커졌기 때문에
기능 구현에 급급한 코드는
지양해야 할 것 같다.
리액트 portal을 사용하면
모달 라이브러리를 설치하지 않고도
간편하게 모달을 띄울 수 있다!
public / index.html 파일에서
id가 root인 div아래에 같은 경로로
id가 modal인 div를 만들어주면
root(전역) 안에서 어떤 컴포넌트가 어떻게 렌더링 되던지
전혀 영향을 받지 않는
modal을 만들 수 있다.
ModalContainer.jsx파일을 하나 만들어주자
import React from 'react';
import { createPortal } from 'react-dom';
function ModalContainer({ children }) {
return createPortal(<>{children}</>, document.getElementById('modal'));
}
export default ModalContainer;
위와 같은 코드를 붙여 넣고
const Login = ({ onClose, onSignupButton }) => {
return (
<ModalContainer>
<Overlay>
<ModalWrap ref={modalRef}>
모달창입니다!
</ModalWrap>
</Overlay>
</ModalContainer>
);
};
export default Login;
ModalContainer를 import 하여
원하는 모달 컴포넌트를 감싸주면 끝이다.
function Header() {
const [isOpen, setIsOpen] = useState(false);
const onLoginButton = () => {
setIsOpen(true);
};
return (
<StHeaderDiv>
<StDiv>
<StLogJoin fc='#00A99D' onClick={onLoginButton}>
LOGIN
</StLogJoin>
{isOpen && (
<Login
open={isOpen}
onClose={() => {
setIsOpen(false);
}}
></Login>
)}
</StDiv>
</StHeaderDiv>
);
}
state로 상태 관리하여
로그인 버튼을 클릭 시 isOpen을 true로 바꿔주면
숨어있던 모달이 뿅 나타난다.
다음 포스팅은
모달 밖 영역을 클릭했을 때
모달을 닫는 것과
여러 개의 모달을 효율적으로 관리하는 법을 알아보겠다.
물론 언제 포스팅할지는
잘 모르겠다.
그리고 이 portal을 이용하여 채팅창 관리도 하게 될 것 같은데
그것도 그때가서 글을 쓰겠다!!
아자아자 화이팅
반응형