React Portal
React์๋ ์ฐธ ์ ๊ธฐํ๊ฒ ๋ง๋ค. ๋ณ๋ณ ๊ฒ๋ค์ ๋ค ํด๋๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๊ณ ์ฐ๊ธฐ๋๊ฒ ๋๊ฒ ์ด๋ณด ์ฌ๋ฅํฐ์์ ๋ ์ํ๋ ๊ณ ์ธ๋ฌผ๊ฐ๋ค..
์ํผ React Portal์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ DOM ๊ณ์ธต ๊ตฌ์กฐ ๋ฐ๊นฅ์ ์๋ DOM ๋ ธ๋๋ก ์์์ ๋ ๋๋งํ๋ ๋ฐฉ์์ ์ ๊ณตํ๋ค. ๊ฐ๋จํ๊ฒ ์๊ฐํด๋ณด์๋ฉด ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ค๋ฅธ ๊ณณ์ ๊ฐ๋ค ์ ๋ฌํ ์ ์๋ค๋ ๋ป์ด๋ค.
์ ์ฌ์ฉํ ๊น?
React์ ํธ๋ฆฌ ๊ตฌ์กฐ์ ๋ฐ๋ผ์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๊ฒฝ์ฐ์ ์์ ์์ ๋ํ ๋ฐ๋ผ์ ๋ ๋๋ง ๋ ์๋ฐ์ ์๋ค. ํ์ง๋ง ๋ง์ฝ ์์ ์์๊ฐ ๋ฐ๋์ง ์๋๋ค๋ฉด ๊ตณ์ด ๋ ๋๋ง์ ๋ค์ ํ ํ์๊ฐ ์๊ณ , ์ฑ๋ฅ์ ๋จ์ด๋จ๋ฆฌ๋ ์์ธ๋ฐ์ ๋์ง ์์ผ๋ฏ๋ก ํฌํ์ ์ฌ์ฉํ๋ค.
๊ทธ๋ ๊ฒ ํฌํ๋ก ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ฐ๊นฅ์ ๋ด๋์์ผ๋ก์จ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํจ๊ณผ ๋์์ DOM ์์์์๋ ๋ถ๋ชจ-์์๊ด๊ณ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ด๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ๋ค.
์ฌ์ฉํ๊ธฐ
createPortal(children)
<div>
<SomeComponent />
{createPortal(children, domNode, key?)}
</div>
// ์ ์ฉ ์์
import { createPortal } from 'react-dom';
// ...
<div>
<p>This child is placed in the parent div.</p>
{createPortal(
<p>This child is placed in the document body.</p>,
document.body
)}
</div>ํฌํ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ createPortal์ ์คํํ์ฌ ํฌํ์ ์์ฑํด์ผ ํ๋ค.
- children: JSX ์กฐ๊ฐ (์:
<div />๋<SomeComponent />), Fragment (<>...</>), ๋ฌธ์์ด์ด๋ ์ซ์, ๋๋ ์ด๋ค์ ๋ฐฐ์ด๊ณผ ๊ฐ์ด React๋ก ๋ ๋๋งํ ์ ์๋ ๋ชจ๋ ๊ฒ. - domNode:
document.getElementById()๊ฐ ๋ฐํํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ผ๋ถ DOM ๋ ธ๋์ด๋ค- ๋ ธ๋๋ ์ด๋ฏธ ์กด์ฌํ๊ณ ์์ด์ผ ํ๋ค. ์ ๋ฐ์ดํธ ์ค์ ๋ค๋ฅธ DOM ๋ ธ๋๋ฅผ ์ ๋ฌํ๋ฉด ํฌํธ ์ฝํ ์ธ ๊ฐ ๋ค์ ์์ฑ๋๋ค
- ์ ํ์
key: ํฌํธ์ ํค๋ก ์ฌ์ฉํ ๊ณ ์ ๋ฌธ์์ด ๋๋ ์ซ์ ์ด๋ ๊ฒ ํฌํ์ ์์ฑํ๋ฉด ๋ฐํ๊ฐ์ผ๋ก React node๋ฅผ ๋ฐํํ๋ค. ๋ฆฌ์กํธ๋ ๋ ๋๋ง ์ค์ ์ด ํฌํ๋ก ๋ง๋ค์ด์ง React node๋ฅผ ๋ณด๋ฉด ์ ๊ณต๋children์ ์ค์ ํdomNode์์ ๋ฐฐ์นํ๋ค.
๋ฐ๋ผ์ ์์ ๊ฐ์ ์์๋ก ํฌํ์ ๋ง๋ค๊ฒ ๋๋ฉด ํ์ฌ ์ฝ๋ ์์์ <p>This child is placed in the document body.</p>๋ ํ์ฌ ์ฐ๋ฆฌ๊ฐ ๋ณด๋ ๊ฒ๊ณผ ๊ฐ์ด div ํ๊ทธ์ ์์ ์์์ฒ๋ผ ๋ณด์ด์ง๋ง ์ค์ ๋ก ๋ ๋๋ง ํ ๋๋ฅผ ๋ณด๋ฉด ๋ค๋ฅด๋ค.
<body>
<div id="root">
...
<div style="border: 2px solid black">
<p>This child is placed inside the parent div.</p>
</div>
...
</div>
<p>This child is placed in the document body.</p>
</body>๋ง์น ์ด๋ฐ์์ผ๋ก ํฌํ์ ํตํด ๋ฟ ~ ๋์ด๊ฐ ๋ค document์ body์ชฝ์ผ๋ก ์ด๋ํ ๊ฒ์ด๋ค.