์คํ์ผ์ด ๋๋ถ๋ถ ๊ฒน์น๊ณ ์ฝ๋์ ๋ฐ๋ณต์ด ์ผ์ด๋ ๋ ๊ณตํต layout์ ๋ถ๋ฆฌํ ์ ์๋ค.
props๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์์ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์๊ฒ ํด์ค๋ค.
function Btn(props) {
return <button>{props.text}</button>;
}function Btn({ text }) {
return <button>{text}</button>;
}์๋ ์ฝ๋๋ property๋ฅผ ์ค๋ธ์ ํธ๋ก๋ถํฐ ๊บผ๋ธ ์ฝ๋๋ค. props๋ ์ค๋ธ์ ํธ์ด๊ธฐ ๋๋ฌธ์ props ์์ text๊ฐ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ ๊ฐ์ด ์ธ ์ ์๋ค.
function Btn({ text, big }) {
return (
<button
style={{
fontSize: big ? 18 : 16,
}}
>
{text}
</button>
);
}
function App() {
return (
<div>
<Btn text="Save Changes" big={true} />
<Btn text="Continue" big={false} />
</div>
);
}๋ Btn์ ๊ฐ์ ๊ฐ์์ ์ธ์๋ฅผ ๊ฐ๊ณ ์์ง๋ง ๋ด์ฉ์ ๋ค๋ฅด๋ค. props๋ฅผ ๊ธฐ๋ฐ์ผ๋ก style์์์ if else๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
function Btn({ text, onClick }) {
return <button onClick={onClick}>{text}</button>;
}
function App() {
const [value, setValue] = React.useState("Save Changes");
const changeValue = () => setValue("Revert Changes");
return (
<div>
<Btn text={value} onClick={changeValue} />
<Btn text="Continue" />
</div>
);
}onClick์ ์ปค์คํ ์ปดํฌ๋ํธ์ ๋ฃ๋๋ค๋ฉด ์ด๊ฒ์ ๋จ์ง ํ๋์ prop์ผ ๋ฟ ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ ์๋๋ค. ์ฌ๊ธฐ์ onClick์ ๋จ์ํ props์ ์ด๋ฆ์ด๋ค. prop๋ค์ ์๋์ ์ผ๋ก return๋ฌธ ์์ผ๋ก ๋ค์ด๊ฐ์ง ์๊ณ ์ง์ prop๋ค์ ๋ฃ์ด์ค์ผ ํ๋ค.
React Memo๋ ์ปดํฌ๋ํธ์ props๊ฐ ๋ฐ๋์ง ์์๋ค๋ฉด ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ์ฌ ์ปดํฌ๋ํธ์ ๋ฆฌ๋ ๋๋ง ์ฑ๋ฅ ์ต์ ํ๋ฅผ ํด์ค ์ ์๊ฒ ํ๋ ํจ์์ด๋ค. ์ฆ ํ์ํ ์ํฉ์์๋ง ๋ฆฌ๋ ๋๋ง์ ํ๋๋ก ์ค์ ํ๋ค.
React.memo()์์ ์ปดํฌ๋ํธ(์ฌ๊ธฐ์๋ ํจ์)๋ฅผ ์ธ์๋ก ๋ฃ๋๋ค.
function Btn({ text, onClick }) {
return <button onClick={onClick}>{text}</button>;
}
const MemorizedBtn = React.memo(Btn);
function App() {
const [value, setValue] = React.useState("Save Changes");
const changeValue = () => setValue("Revert Changes");
return (
<div>
<MemorizedBtn text={value} onClick={changeValue} />
<MemorizedBtn text="Continue" />
</div>
);
}MemorizedBtn์ memorized version์ Btn์ด๋ค. ๋ง์ฝ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์ด๋ ํ state์ ๋ณ๊ฒฝ์ด ์๋ค๋ฉด ๋ชจ๋ ์์๋ค์ ๋ค์ re-render๋๋ค. ์ด ์ ์ด ์ถํ์ ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋๋ ค์ง๋ ์์ธ์ด ๋ ์ ์๋ค.
MemorizedBtn์ ์ด์ฉํด props๊ฐ ๋ณ๊ฒฝ๋์ง ์๋๋ค๋ฉด ๋ค์ ๊ทธ๋ฆด ํ์๊ฐ ์๋ค๊ณ ์ ํด์ฃผ์๋ค. ๋ฐ๋ผ์ ์ ์ฝ๋๋ฅผ ์คํํ๋ฉด Save Changes๋ฅผ ํด๋ฆญํ์ ๋ ๋จ ํ ๋ฒ๋ง re-render๋๋ค.
PropType์ ์ด๋ค ํ์ ์ prop์ ๋ฐ๊ณ ์๋์ง๋ฅผ ์ฒดํฌํด์ค๋ค. ๊ฐ๊ธฐ ๋ค๋ฅธ ํ์ ๋ค์ ๊ฒ์ฌํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
Prop Types ๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉด array, boolean, function, number, object ๋ฑ ์ด์ธ์ ๊ฒ๋ค๋ ํ ์คํธํ ์ ์๋ค๊ณ ๋์์๋ค. ์ปดํฌ๋ํธ ํด๋์ค์ instanve์ธ์ง๋ ํ์ธ ๊ฐ๋ฅํ๋ค.
Btn.propTypes = {
text: PropTypes.string,
fontSize: PropTypes.number,
};
function App() {
return (
<div>
<Btn text="Save Changes" fontSize={18} />
<Btn text={14} fontSize={"Continue"} /> // ์๋ชป๋ ๋ถ๋ถ
</div>
);
}์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ์ ํจํ ์ฝ๋์ด๊ธฐ ๋๋ฌธ์ ReactJS๋ ui์์ ์๋ฌ๋ฅผ ๋ณด์ฌ์ฃผ์ง ์๋๋ค. ๊ทธ๋ฌ๋ propTypes๋ฅผ ์ง์ ํด์ค์ผ๋ก์จ prop๋ค์ type์ด ์ด๋ป๊ฒ ๋๋์ง React์๊ฒ ๋งํด์ฃผ๋ ๊ฒ์ด๋ค.
Btn.propTypes = {
text: PropTypes.string.isRequired,
fontSize: PropTypes.number.isRequired,
};isRequired์ ์ธ์ ๋ ๋๊ตฐ๊ฐ๊ฐ Btn ์ปดํฌ๋ํธ๋ฅผ renderํ๋ค๋ฉด text์ fontSize๋ ๋ฐ๋์ ์กด์ฌํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ๋ง์ฝ ๋ ์ค ํ๋๋ผ๋ ์๋ค๋ฉด "required(ํ์)๋ผ๊ณ ํ์๋์ด ์์ง๋ง ์ค์ ๊ฐ์ undefined๋ค."๋ผ๊ณ ์ฝ์์ ๊ฒฝ๊ณ ๊ฐ ๋จ๊ฒ ๋๋ค.
function Btn({ text, fontSize = 16 }) {
return (
<button
style={{
backgroundColor: "tomato",
color: "white",
padding: "10px 20px",
border: 0,
borderRadius: 10,
fontSize,
}}
>
{text}
</button>
);
Btn.propTypes = {
text: PropTypes.string.isRequired,
fontSize: PropTypes.number,
};
function App() {
return (
<div>
<Btn text="Save Changes" fontSize={18} />
<Btn text={"Continue"} />
</div>
);
}
}๋ง์ฝ fontSize๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด(undefined) ๊ฐ์ ์ค ์ ์๋ค. fontSize์ default๊ฐ์ 16์ผ๋ก ์ง์ ํด์ฃผ์๋ค. ์ด๊ฒ์ fontSize๊ฐ prop์ผ๋ก์ ์ค์ ๋์ง ์์ ๋ ๋ฒ์งธ Btn์๋ง ํด๋น๋๋ค. ์ฆ ์ ์๋์ง ์์ ๋ณ์์ ๊ดํ ๊ธฐ๋ณธ๊ฐ์ ์ค ์ ์๋ค. (Javascript ๋ฌธ๋ฒ)
์ด๋ค prop๋ค์ ๋ฐ์ ์ ์๋ Btn ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด ๋ณต๋ถํ ํ์๊ฐ ์๋ค. prop๋ค์ ๋ ๋๋ง๋๊ณ ์๋ Btn ์ปดํฌ๋ํธ์ ๋ถ๋ชจ๋ก๋ถํฐ ์ ๋ฌ๋๊ณ ์๋ค. text์ fontSize ๋ prop์ ๋ฐ๊ณ ์๊ณ ์ด Btn ์ปดํฌ๋ํธ์ ์ด prop๋ค์ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ Btn ์ปดํฌ๋ํธ ํจ์์ ์ฒซ ๋ฒ์งธ ์ธ์ ์์์ ๊ฐ๋ฅํ๋ค. ์ฒซ ๋ฒ์งธ ์ธ์ ์์์ ์ ๋ฌ๋ ๋ชจ๋ prop๋ค์ ํ๋์ ์ค๋ธ์ ํธ๋ก์ ๋ฐ๋๋ค.