์๋๋ ์์ ๊ฐ์ด ๊ธฐ์ ์คํ๋ช ๋ง ์ถ๋ ฅ์ ํ๋๋ฐ ์ฌ๊ธฐ์ ์์ด์ฝ๋ ์ถ๊ฐํ๊ณ , ์คํ๋ช ๋ฐฐ๊ฒฝ์์ ์์ด์ฝ ๋ฐฐ๊ฒฝ์๊ณผ ๋์ผํ๊ฒ ๊ตฌํํ๊ณ ์ถ์๋ฐ!
// ์๋์ ๊ฐ์ด ๊ธฐ์ ์คํ๋ช
์ ํด๋นํ๋ color ์ ์ธ
const stackBackgrounds = [
{ stack: "Angular", color: "#DD0031" },
{ stack: "Emotion", color: "#E19EDC" },
{ stack: "GraphQL", color: "#E10098" },
{ stack: "NextJS", color: "#000000" },
{ stack: "ReactJS", color: "#61DAFB" },
{ stack: "VueJS", color: "#4FC08D" },
...
];
const ViewStudy = () => {
...
// ๊ธฐ์ ์คํ๋ช
์ ํด๋นํ๋ color๋ฅผ ํํฐ๋งํด์ style์ background ๊ฐ์ผ๋ก ๋๊ฒจ์คฌ๋ค
const pick = (i) => {
const filtered = stackBackgrounds
.filter((el) => el.stack === i)
.map((el) => el.color);
return filtered;
};
return {
<DevStackList>
{data.devStack &&
data.devStack.map((el, idx) => {
return (
// pick()ํจ์๋ฅผ background ๊ฐ์ ํ ๋นํด์ค
<li key={idx} style={{ background: pick(el) }}>
<img ... />
<div>{el}</div>
</li>
);
})}
</DevStackList>
}
}
โจ ์ฝ๋๋ ์ข ๋๋ฝ์ง๋ง,, ์ด์จ๋ ๊ตฌํ ๊ฒฐ๊ณผ
Portal
createPortal
์ ์ฌ์ฉํ์ฌ ํด๋น ์ปดํฌ๋ํธ์ HTML ๋ด์ฉ์ ๋ค๋ฅธ ๊ณณ์ผ๋ก ํฌํธ, ์ฆ ์ด๋์ํฌ ์ ์์- ๋ค๋ง, ๋ ๋๋ง๋๋ ์ค์ DOM ์์์๋ง ๊ฐ๋ฅ!
<div>
๊ฐ <div id="root"></div>
์ ๋ง๊ณ ๋ฐ์ ์์นํ๋๊ฒ ๊ตฌ์กฐ์ ๋ correct!<div id="root"></div>
๋ฐ์ ์์น์ํค๋๊ฒ Portal
!!<!-- index.html -->
...
<body>
...
<div id="backdrop-root"></div> <!-- here -->
<div id="overlay-root"></div> <!-- here -->
<div id="root"></div>
</body>
// ErrorModal.js
import ReactDOM from "react-dom";
...
const Backdrop = (props) => {
return <div className={classes.backdrop} onClick={props.onConfirm} />;
};
const ModalOverlay = (props) => {
return (
<Card className={classes.modal}>
<header className={classes.header}>
<h2>{props.title}</h2>
</header>
<div className={classes.content}>
<p>{props.message}</p>
</div>
<footer className={classes.actions}>
<Button onClick={props.onConfirm}>Okay</Button>
</footer>
</Card>
);
};
const ErrorModal = (props) => {
return (
<React.Fragment>
{ReactDOM.createPortal(
<Backdrop onConfirm={props.onConfirm} />,
document.getElementById("backdrop-root") // ์ปดํฌ๋ํธ๋ฅผ ์์น์ํฌ ์์น
)}
{ReactDOM.createPortal(
<ModalOverlay
title={props.title}
message={props.message}
onConfirm={props.onConfirm}
/>,
document.getElementById("overlay-root")
)}
</React.Fragment>
);
};
์ค๋์ ๋ฆ์ ๋ ์๊ตฌ, ๊ตญ์ทจ์ ๋ง์ง๋ง ์คํ ์๋ด๋์ ์ธ์ถํ๊ตฌ ์๋๋ ์๊ฐ ์์ญ..
๊ณํํ๋๊ฑฐ ๋ค ๋ชป ๋๋ด๊ณ , ๊ณต๋ถํ ๋ด์ฉ์ด ๋ง์ด ์๋,, ๐ฅฒ