ํฐ์คํ ๋ฆฌ ๋ทฐ

๐ฏ createPortal์ด๋ ๋ฌด์์ธ๊ฐ์?
**createPortal**์ React์์ ์ปดํฌ๋ํธ๋ฅผ ๋ค๋ฅธ DOM ๋ ธ๋๋ก ๋ ๋๋งํ ์ ์๋๋ก ํด์ฃผ๋ ๊ธฐ๋ฅ์ด์์.
- ๊ธฐ๋ณธ์ ์ผ๋ก React ์ปดํฌ๋ํธ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ DOM ์์ ๋ ๋๋ง๋์์์?
 - ํ์ง๋ง ํน์  ์ํฉ์์๋ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ชจ DOM ๋ฐ์ ๋ค๋ฅธ ์์น์ ๋ ๋๋งํด์ผ ํ  ๋๊ฐ ์์ด์.
์ด๋ด ๋ createPortal์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. 
๐ ๋น์ ๋ก ์ดํดํ๊ธฐ: ์ฐฝ๋ฌธ ๋์ด ๋ฐฐ๋ฌ ์์ ๊ฑด๋ค์ฃผ๊ธฐ
์ฌ๋ฌ๋ถ์ด ํผ์ ๊ฐ๊ฒ์์ ์ผํ๋ค๊ณ ์์ํด ๋ณด์ธ์. ๐
- ๊ธฐ๋ณธ ๋ ๋๋ง ๋ฐฉ์
- ์ฃผ๋ฐฉ์์ ๋ง๋ ํผ์๋ฅผ ์ฃผ๋ฐฉ ๋ฌธ์ ํตํด ํ(๋ถ๋ชจ DOM)๋ก ๋ด๋ณด๋ ๋๋ค.
 - ์ด๊ฒ React์ ์ผ๋ฐ์ ์ธ ๋ ๋๋ง ๋ฐฉ์์ด์์.
 
 - createPortal์ ์ฌ์ฉํ๋ฉด?
- ์ฃผ๋ฐฉ์์ ๋ง๋ ํผ์๋ฅผ ์ฃผ๋ฐฉ ์ฐฝ๋ฌธ์ ํตํด ๋ฐ๊นฅ(๋ค๋ฅธ DOM ๋ ธ๋)์ ๋ฐ๋ก ์ ๋ฌํด์!
 - ํผ์๋ ์ฃผ๋ฐฉ์์ ๋ง๋ค์ด์ง์ง๋ง, ์ต์ข ๋ชฉ์ ์ง๋ ๋ค๋ฅธ ๊ณต๊ฐ์ด ๋๋ ๊ฑฐ์ฃ .
 
 
React์ createPortal์ ์ปดํฌ๋ํธ๋ฅผ **๋ค๋ฅธ DOM ๋ ธ๋(์ฐฝ๋ฌธ ๋ฐ)**์ ๋ ๋๋งํ ์ ์๋๋ก ๋์์ฃผ๋ ์ญํ ์ ํด์.
๐ ๏ธ createPortal ์ฌ์ฉ๋ฒ
createPortal์ React์ ReactDOM.createPortal() ํจ์๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํด์.
๊ฐ๋จํ ์์ ๋ฅผ ํตํด createPortal์ ์ดํด๋ณผ๊ฒ์.
1. ๋ชจ๋ฌ ์ฐฝ์ ์์ ๋ก ์์๋ณด๊ธฐ
๋ชจ๋ฌ ์ฐฝ์ ์ผ๋ฐ์ ์ผ๋ก ํ๋ฉด์ ์ต์๋จ์ ๋ ์ผ ํ์์์?
๊ทธ๋์ createPortal์ ์ฌ์ฉํด ๋ชจ๋ฌ์ ๋ถ๋ชจ DOM ๋ฐ์ผ๋ก ๋ ๋๋งํ  ์ ์์ต๋๋ค.
HTML ๊ตฌ์กฐ (index.html)
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>React Portal</title>
  </head>
  <body>
    <div id="root"></div> <!-- ๋ฉ์ธ React ์ฑ์ด ๋ ๋๋ง๋  ๊ณณ -->
    <div id="modal-root"></div> <!-- ๋ชจ๋ฌ์ด ๋ ๋๋ง๋  DOM ๋
ธ๋ -->
  </body>
</html>
React ์ฝ๋
import React, { useState } from 'react';
import ReactDOM from 'react-dom';
// ๋ชจ๋ฌ ์ปดํฌ๋ํธ
function Modal({ children, onClose }) {
  return ReactDOM.createPortal(
    <div style={modalStyles}>
      <div>
        {children}
        <button onClick={onClose}>๋ซ๊ธฐ</button>
      </div>
    </div>,
    document.getElementById('modal-root') // ๋ชจ๋ฌ์ ๋ ๋๋งํ  DOM ๋
ธ๋
  );
}
// ๋ฉ์ธ ์ปดํฌ๋ํธ
export default function App() {
  const [isOpen, setIsOpen] = useState(false);
  return (
    <div>
      <h1>React Portal ์์ </h1>
      <button onClick={() => setIsOpen(true)}>๋ชจ๋ฌ ์ด๊ธฐ</button>
      {isOpen && (
        <Modal onClose={() => setIsOpen(false)}>
          <h2>๋ชจ๋ฌ ๋ด์ฉ</h2>
          <p>์ด ๋ชจ๋ฌ์ createPortal๋ก ๋ ๋๋ง๋์์ด์!</p>
        </Modal>
      )}
    </div>
  );
}
// ๋ชจ๋ฌ ์คํ์ผ
const modalStyles = {
  position: 'fixed',
  top: 0,
  left: 0,
  width: '100%',
  height: '100%',
  backgroundColor: 'rgba(0, 0, 0, 0.5)',
  display: 'flex',
  justifyContent: 'center',
  alignItems: 'center',
  color: 'white',
};
๐ ์ฝ๋ ์ค๋ช
- HTML์ ๋ชจ๋ฌ์ ์ํ ๋ณ๋ DOM ๋
ธ๋
- index.html์ **<div id="modal-root"></div>**๋ผ๋ ๋ณ๋์ DOM ๋ ธ๋๋ฅผ ๋ง๋ค์์ด์.
 
 - createPortal์ ์ฌ์ฉํ ๋ชจ๋ฌ ๋ ๋๋ง
- **ReactDOM.createPortal**์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋ ๋๋งํ ์์, ๋ ๋ฒ์งธ ์ธ์๋ก ๋ ๋๋ง๋ DOM ๋ ธ๋๋ฅผ ๋ฐ์ต๋๋ค.
 - ์ด ์ฝ๋์์๋ ๋ชจ๋ฌ์ **modal-root**๋ผ๋ DOM์ ๋ ๋๋งํ๊ณ ์์ด์.
 
 - ๋ฉ์ธ DOM๊ณผ ๋ถ๋ฆฌ๋ ๋ ๋๋ง
- ๋ฉ์ธ ์ปดํฌ๋ํธ๋ ์ฌ์ ํ **root**์ ๋ ๋๋ง๋์ง๋ง, ๋ชจ๋ฌ์ **modal-root**์ ๋ ๋๋ง๋ฉ๋๋ค.
 - ๋ถ๋ชจ ์ปดํฌ๋ํธ์ DOM ๊ตฌ์กฐ์ ์๊ด์์ด ์ต์์ ๋ ์ด์ด์ ๋ชจ๋ฌ์ ํ์ํ ์ ์์ฃ .
 
 - ๊ฒฐ๊ณผ
- ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋ชจ๋ฌ ์ฐฝ์ด ํ๋ฉด์ ์ต์๋จ์ ํ์๋๊ณ ,
 - ๋ชจ๋ฌ์ด ๋ถ๋ชจ ์ปดํฌ๋ํธ ๋ฐ์์ ๋ ๋๋ง๋๋ ๊ฑธ ํ์ธํ ์ ์์ด์! ๐
 
 
๐ createPortal์ ์ฌ์ฉํ๋ฉด ์ข์ ์ํฉ
- ๋ชจ๋ฌ, ํ์
 ์ฐฝ
- ๋ชจ๋ฌ์ด๋ ํ์ ์ฐฝ์ ํ๋ฉด ์ต์๋จ์ ๋ ์ผ ํ๊ณ , ๋ถ๋ชจ ์ปดํฌ๋ํธ์ CSS์ ์ํฅ์ ๋ฐ์ผ๋ฉด ์ ๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ๋ฉด ์ข์์.
 
 - ํดํ์ด๋ ๋๋กญ๋ค์ด ๋ฉ๋ด
- ๋๋กญ๋ค์ด ๋ฉ๋ด๋ ํดํ์ด ๋ถ๋ชจ ์ปดํฌ๋ํธ์ DOM ๋ฐ์์ ํ์๋ ๋ ์ฌ์ฉํด์.
 
 - ์ค๋ฒ๋ ์ด(UI ์์ ๋ฎ์ด์์ฐ๋ ํ๋ฉด)
- ํ๋ฉด ์ ์ฒด๋ฅผ ๋ฎ๋ ์ค๋ฒ๋ ์ด๋ ๋ถ๋ชจ DOM ๋ฐ์์ ๋ ๋๋งํ๋ฉด ๊น๋ํด์ง๋๋ค.
 
 
๐ ํ ์ค ์์ฝ
**createPortal**์ React ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ชจ DOM ๋ฐ๊นฅ์ ํน์  DOM ๋
ธ๋์ ๋ ๋๋งํ  ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ์ด์์.
์ฃผ๋ก ๋ชจ๋ฌ, ํ์
, ๋๋กญ๋ค์ด์ฒ๋ผ ๋
๋ฆฝ์ ์ธ ๋ ์ด์ด๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉํฉ๋๋ค!
๐ ๋ง๋ฌด๋ฆฌ
React์ **createPortal**์ ํ์์๋ ํ์ํ์ง ์์ง๋ง, ๋ชจ๋ฌ์ด๋ ํ์
์ฒ๋ผ ํ๋ฉด์ ๊ตฌ์กฐ๋ฅผ ๋ฒ์ด๋ ๋ ๋๋งํด์ผ ํ  ๋ ์์ฃผ ์ ์ฉํด์.
์ด์  **"React๋ก ๋ชจ๋ฌ์ ์ด๋ป๊ฒ ๋ง๋ค์ง?"**๋ผ๋ ๊ณ ๋ฏผ์ด ์๊ธฐ๋ฉด createPortal์ ๋ ์ฌ๋ ค ๋ณด์ธ์!
'web > react dom' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| prefetchDNS (2) | 2024.12.16 | 
|---|---|
| preconnect (2) | 2024.12.16 | 
| hydrate (1) | 2024.12.16 | 
| findDOMNode (3) | 2024.12.16 | 
| flushSync (1) | 2024.12.16 | 
- Total
 
- Today
 
- Yesterday
 
- dns-prefetch
 - usedeferredvalue
 - finddomnode
 - experimental_taintuniquevalue
 - state
 - flushsync
 - image pull
 - useRef
 - useformstatus
 - useinsertioneffect
 - ์ ์ฅ์
 - Props
 - ์คํ์ 
 - Nextjs
 - react dom
 - component
 - react hook
 - ์ธ๋ถํฐํธ
 - prefetchdns
 - experimental
 - private regisirty
 - experimental_taintobjectreference
 - ๋ฒ ํ
 - zustand
 - react dom hook
 - preconnect
 - react
 - ์ํ๊ด๋ฆฌ
 - Store
 - useid
 
| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ | 
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 | 
| 9 | 10 | 11 | 12 | 13 | 14 | 15 | 
| 16 | 17 | 18 | 19 | 20 | 21 | 22 | 
| 23 | 24 | 25 | 26 | 27 | 28 | 29 | 
| 30 |