Notice
Recent Posts
Recent Comments
관리 메뉴

즐겁게, 코드

Portal 사용하기 본문

🎨 프론트엔드/React.js

Portal 사용하기

Chamming2 2020. 12. 28. 17:15

기본 설정으로 리액트 프로젝트를 구성했다면 index.js 파일에서 아래 코드를 본 적 있을 것이다.

ReactDOM.render(<App />, document.getElementById('root'));

이는 public 폴더에 존재하는 HTML 문서 중 id = "root" 인 요소의 자식으로 App 컴포넌트를 렌더링한다는 의미인데, 가끔은 여러 이유로 부모 컴포넌트를 벗어난 곳에 자식 컴포넌트를 배치해야 할 때가 있다.

예를 들면 모바일 화면에서 드로어(측면 메뉴)를 만들 때 드로어는 화면 위를 덮으므로 DOM 상에서도 최상단에 위치하는 것이 자연스럽다.

그러나 위의 ReactDOM.render() 함수로 인해 드로어는 언제나 root의 자식 요소로 배치되게 되는데, 포탈(portal)을 활용하면 부모 요소 바깥에도 컴포넌트를 렌더링할 수 있게 된다.

 

[포탈 사용법]

ReactDOM.createPortal(<엘리먼트 />, 배치할 DOM 식별자);

포탈은 ReactDOM.render() 와 동일한 방법으로 사용하며, 부모 요소에 구애받지 않고 원하는 위치에 요소를 배치할 수 있게 된다.

 

[사용 예시]

<body>
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="drawer"></div>
    <div id="root"></div>
    <!--
      This HTML file is a template.
      If you open it directly in the browser, you will see an empty page.
      ...
    -->
  </body>

위의 드로어를 root의 자식이 아닌 형제 요소로 렌더링하기 위해 id = "drawer" 라는 형제 요소를 생성한 모습이다.

이제 리액트 컴포넌트에서 포탈을 생성해 보자.

import React from "react";
import ReactDOM from "react-dom";

function SideDrawer({ children }) {
  const content = <aside className="side-drawer">{children}</aside>;
  return ReactDOM.createPortal(content, document.getElementById("drawer"));
}

export default SideDrawer;

jsx로 작성된 컴포넌트의 내용을 content라는 변수에 담은 후 ReactDOM.createPortal()을 활용해 id = "drawer" 라는 요소에 렌더링했다.

 

이제 <SideDrawer /> 컴포넌트를 어디서 사용하든 id = "drawer" 의 자식 요소로 렌더링되는 것을 확인할 수 있다.

DOM 구조를 시맨틱하게 유지하고 싶거나 CSS 사용에 제약이 따를 때 사용하면 좋은 기법이니, 꼭 알아두도록 하자.

반응형

'🎨 프론트엔드 > React.js' 카테고리의 다른 글

useContext 훅에 대하여  (0) 2021.01.05
useRef 훅에 대하여  (1) 2021.01.01
useMemo 훅에 대하여  (0) 2020.12.30
useEffect 훅에 대하여  (1) 2020.12.28
useState 훅에 대하여  (0) 2020.12.28
Comments
소소한 팁 : 광고를 눌러주시면, 제가 뮤지컬을 마음껏 보러다닐 수 있어요!
와!! 바로 눌러야겠네요! 😆