React

리액트 createPortal 사용하기

citron031 2023. 3. 18. 11:01

리액트는 트리구조로 위에서 아래로 작성하게 된다.

하지만 리액트의 portal을 사용하면, 하위 컴포넌트에서 상위 컴포넌트에 element를 넣을 수 있게 된다.

따라서 modal을 구현할 때 많이 사용되는 portal의 사용법에 대해서 알아보기로 하였다.

 

import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import "./index.css";

ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

리액트의 최상위 파일은 다음과 같이 createRoot로 이루어진다.

root라는 id를 갖는 element에 작성한 컴포넌트들이 삽입되게 된다.

App이 다음과 같이 작성되어있고, 그 하위에 TimeStamp에서 portal을 생성해보자.

import Main from "./components";
import "./App.css";

function App() {
  return (
    <Main>
      <Main.TitleName />
      <Main.Counter />
      <Main.TimeStamp />
    </Main>
  );
}

export default App;

TimeStamp는 App의 자식이다.

여기서 createPortal을 사용하게 된다.

🧉 createPortal은 첫 번째 인자로 삽입할 element가 들어가고 두 번째 인자로 삽입될 위치(부모 element)가 필요하다.

import { createPortal } from "react-dom";
import dayjs from "dayjs";

const TimeStamp = () => {
  const day = dayjs()
    .startOf("month")
    .add(1, "day")
    .set("year", 2022)
    .format("YYYY-MM-DD HH:mm:ss");

  return (
    <>
      <p className="main-time">{day}</p>
      {createPortal(
        <p className="body-time" style={{ position: "absolute", top: 0 }}>{day}</p>,
        document.body
      )}
    </>
  );
};

export default TimeStamp;

TimeStamp 컴포넌트는 시간을 두 번 보여주게 되는데, main-time 클래스의 p 요소는 기존의 컴포넌트로, Main 컴포넌트 하위에 위치하게 된다.

하지만, createPortal을 통해 만들어진 p 태그는 그보다 상위인 body 바로 아래에 위치하는 걸 확인할 수 있다.

 

 

https://beta.reactjs.org/reference/react-dom/createPortal

 

createPortal

A JavaScript library for building user interfaces

beta.reactjs.org