흥미를 끄는 리액트의 기능이 생겨 이를 알아보는 글입니다.
이름도 무려 포탈이다..!
포탈이란 무엇인고? 게임을 하다보면 캐릭터가 어떤 포탈 속에 쏙 빨려들어가서 이곳에서 저곳으로 이동하게 된다.
리액트 공식문서에서는 createPortal을 이렇게 설명한다.
부모 컴포넌트의 DOM 계층 구조의 외부에 있는 DOM노드로 자식 컴포넌트를 랜더링 할 수 있다.
createPortal(children, domNode, key?)
children
: 포털로 보낼 것. React로 랜더링할 수 있는 모든것이 가능하다domNode
: children을 보낼 장소, 포탈리 열리는 곳key
?: 포털 키 (고유한 문자열 또는 숫자)코드와 함께 보자
부모인 div 태그 안에 자식요소인 p태그와 createPortal
로 생성한 어떤 자식노드가 있다.
<div>
<p>This child A .부모div아래에 위치한다.</p>
{createPortal(
<p>This child B. 부모div아래의 위치에서 벗어나, document.body위에 있다.</p>,
document.body
)}
</div>
개발자 도구를 열어서 DOM구조를 확인해보면 아래 사진과 같다.
(위 코드는 블로그에 정리하기위해 p태그 내부 글만 정리한것이다..)
✅ 정리하자면!
포탈은 특정 요소를 실제 DOM요소에 랜더링 하면서도, react컴포넌트 트리에서는 자신의 자리에 남아 본연의 역할을 수행한다..
이것이 바로 위에서 말했던 '물리적 배치만 변경한다'라는 말의 의미이다.
예를들어
<APP>
<Content>
<Modal /> //🗣️위로 올라가고 싶어요..
</Content>
</APP>
<Modal/>
은 <Content>
의 내부에 있지만, createPortal을 이용해 원하는 위치에 랜더링 시킬 수 있다. DOM의 위치상으로는 content의 품을 떠났지라고, react-tree상에서는 여전히 contents의 자식으로 남아있고 이벤트 버블링도 content로 전달된다.
즉, createPortal은 그저 렌더링 위치만 이동시켜준 것이다.
자식컴포넌트를 DOM상의 다른곳에 위치시키는것에 사용된다.
cf) 모달을 만들 때, createPortal 말고도 dialog 태그를 사용하면 좀더 쉽게 만들 수 있다고 한다.