ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ฏ 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 (1) | 2024.12.16 |
---|---|
preconnect (2) | 2024.12.16 |
hydrate (0) | 2024.12.16 |
findDOMNode (0) | 2024.12.16 |
flushSync (0) | 2024.12.16 |
- Total
- Today
- Yesterday
- ์คํ์
- Props
- experimental
- useRef
- experimental_taintuniquevalue
- useformstatus
- ๋ฒ ํ
- useinsertioneffect
- preconnect
- flushsync
- component
- experimental_taintobjectreference
- Nextjs
- react dom hook
- finddomnode
- usedeferredvalue
- zustand
- ๋ฐ์ดํฐ์ ์ง
- react hook
- ์ธ๋ถํฐํธ
- react dom
- dns-prefetch
- ์ ์ฅ์
- ์ํ๊ด๋ฆฌ
- useid
- ์ต์ ๋ฐ์ดํฐ
- react
- Store
- state
- prefetchdns
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 | 31 |