๐ฉโ๐ฆฑ๋ถ๋ชจ ์ปดํฌ๋ํธ์ DOM ๊ณ์ธต ๊ตฌ์กฐ ๋ฐ๊นฅ์ ์๋
DOM ๋ ธ๋๋ก ๐ฉโ์์์ ๋ ๋๋งํ๋ ์ต๊ณ ์ ๋ฐฉ๋ฒ์ ์ ๊ณต๐คฉReactDom.createPortal(child, container)์ฒซ ๋ฒ์งธ ์ธ์(child)โก์๋ฆฌ๋จผํธ, ๋ฌธ์์ด ํน์ fragment์
๊ฐ์ ์ด๋ค ์ข ๋ฅ์ด๋ ๋ ๋๋ง ํ ์ ์๋ React ์์๐ฉโ




<div style={higherIndexWrapperStyle}>
Z-Index 2
</div>






๐กbackgroundColor: 'rgba(0, 0, 0, 0.7)'

ํ๋ฉด ์งค๋ ค์ ๊ทธ๋ฌ๋๋ฐ ๋ฑ ์์ ์ ์ค์์ ๋ฐฐ์น ๋ ๊ฒโconst [isModalOpen, setIsModalOpen] = useState(false);
.
{/* ๋ชจ๋ฌ */}
<TestModal
open={isModalOpen}
onclose={() => setIsModalOpen(false)}
>
๋ชจ๋ฌ ๋ด์ฉ
</TestModal>
.
<div style={modalWrapperStyle}>
<button
onClick={() => setIsModalOpen(true)}
>
๋ชจ๋ฌ ์ด๊ธฐ
</button>
โฌ




๋ชจ๋ฌ์ฐฝ ์ฌ๋ผ์ง๐



๊ฐ์ ๊ณ์ธต์ ์์

๐ฅ๋ฅํฐ ์คํธ๋ ์ธ์ง๐ฌ
์ ํฌ ์ค ๋ถ๋ฆฌํ๋ฉด ํฌํ ๋ง๋ค์ด ์ํฉ์ ๋น ์ ธ๋๊ฐ
์ ๋น์ ํฌํธ๋ก ๋ฃ์ด ์์๊ฐ์ ์ํฉ ์ข ๋ฃ ์์ผ ๋ฒ๋ฆผ
๊น๊น๐
๋ฆฌ์กํธ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ด๋์ํค๋ ๊ธฐ๋ฅ์ ์ ๊ณตโ
ํํ์ด ์กฐ๊ธ ์์ํ๊ธด ํ์ง๋ง
์ดํ๋ฆฌ์ผ์ด์ ์ด ๋ง์ดํธ ๋๋ ์์น๋ฅผ ์ด๋ํ๋ค๋ ์๋ฏธ๐ฑโ๐
๋ฃจํธ ๋ ํธ๋ฆฌ๋ฅผ ๋ฒ์ด๋ ๋์์
์ดํ๋ฆฌ์ผ์ด์ ์ ์ผ๋ถ๋ถ์ ๊ทธ๋ฆด ์ ์์๐โ

root๋ ์ด๊ณณ์ ์์
์ต์ง๋ก ์์ฑํด ๋์์
๋ชจ๋ฌ์ root ์์์ ๋ ๋๋ง ํ๋ ๊ฒ ์๋๋ผ
๐คทโโ๏ธ์ ๋ถ๋ถ์ portal ์์ ๋ฃ๊ณ ์ถ์๋ฐ ์ด๋ป๊ฒ ํด์ผํ ๊นโ

์ฌ๊ธฐ๋ค๊ฐ ์ด๋๋ค ๋ฃ์๊ฑด์ง ์ง์ ํด์ฃผ๊ธฐ

์ div ์์์ ์๋
์์๋ค์
์ด ์๋
๋ค์์ ์ด๋ฒคํธ ๋ฐ์ํ์ ๋
์๋ก ๋ฒ๋ธ๋ง์ด ๋ฐ์ํ ๊นโ ์ํ ๊นโ<div style={modalWrapperStyle}
onClick={() => console.log('clicked')}>
// ...
์๋
ํด๋ฆญํด๋ clicked๊ฐ ๋ธ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง ๋๋ ๊ฑธ ํ์ธ ํ ์ ์์๐โโ๏ธ