
๐ก๋ ธ๋ง๋์ฝ๋ ๋๊ผฌ์ค์ ๊ฐ์๋ฅผ ๋ณด๋ฉฐ ๊ณต๋ถํ๋ ์๋ฆฌ์ฆ์ ๋๋ค.
props
๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์์์ปดํฌ๋ํธ์ data๋ฅผ ์ ๋ฌํ ์ ์๋ ๋ฐฉ๋ฒ.
"save Changes"๊ธฐ๋ฅ์ btn๊ณผ "confirm"๊ธฐ๋ฅ์ ํ๋ btn์ ๋ง๋ ๋ค๊ณ ํด๋ณด์.
function SaveBtn() {
return <button>save Changes</button>;
}
function ConfirmBtn() {
return <button>Confirm</button>;
}
function App() {
return (
<div>
<SaveBtn />
<ConfirmBtn />
</div>
);
}
const root = document.getElementById("root");
ReactDOM.render(<App />, root);

jsx์์ style์์ฑ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ {{์ค๊ดํธ 2๊ฐ}}์์์ camelCase๋ก ์์ฑํ๋ฉด ๋๋ค.
function SaveBtn() {
return (
<button
style={{
backgroundColor: "tomato",
color: "white",
padding: "19px 20px",
border: "none",
borderRadius: 10,
}}
>
save Changes
</button>
);
}
function ConfirmBtn() {
return (
<button
style={{
backgroundColor: "tomato",
color: "white",
padding: "19px 20px",
border: "none",
borderRadius: 10,
}}
>
Confirm
</button>
);
}
function App() {
return (
<div>
<SaveBtn />
<ConfirmBtn />
</div>
);
}
const root = document.getElementById("root");
ReactDOM.render(<App />, root);
์์๊ฒ ๋๊ธด ํ๋๋ฐ ์ฝ๋๊ฐ ๋๋ฌด ๊ธธ์ด์ง๋ค.
๊ณตํต๋ ์คํ์ผ์ ๊ฐ์ง ํ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด ์ฌ์ฌ์ฉํ๋ฉด ํจ์ฌ ๊ฐ๊ฒฐํ ์ฝ๋๋ฅผ ๊ฐ์ง ์ ์๋ค.
//Btn์ด๋ผ๋ component๋ฅผ ์์ฑํ๊ณ style์์ฑ์ ์ฌ์ฉํ์ฌ ๋์์ธํ๋ค.
function Btn() {
return (
<button
style={{
backgroundColor: "tomato",
color: "white",
padding: "19px 20px",
border: "none",
borderRadius: 10,
}}
></button>
);
}
function App() {
return (
<div>
//์์ฑํ Btn ์ปดํฌ๋ํธ๋ฅผ ์ต์์ ์ปดํฌ๋ํธ์ธ App์ render.
<Btn />
<Btn />
</div>
);
}
const root = document.getElementById("root");
ReactDOM.render(<App />, root);
๋์ผํ ์คํ์ผ์ ๋ฒํผ ๋๊ฐ๊ฐ ๋ง๋ค์ด ์ง ๊ฒ์ ๋ณผ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ฐ ๋ฒํผ์ ์ด๋ฆ์ ์ด๋ป๊ฒ ํํ ํ ์ ์์๊น?
๋ถ๋ชจ ์ปดํฌ๋ํธ์ธ App์์ ์์ ์ปดํฌ๋ํธ์ธ Btn์ ๊ฐ๊ฐ banana, big์ด๋ผ๋ ์ ๋ณด๋ฅผ ๋ง๋ค์ด์ค๋ค.
//๋ถ๋ชจ์์ App
function App() {
return (
<div>
//App์ render๋ ์์์์ Btn.
//banana, big์ ๋ถ๋ชจ์์ App์ด ์์์์์ธ Btn์ ์ ๋ฌํ๊ณ ์ ํ๋ ์ ๋ณด.
<Btn banana="save Changes" big={true} />
<Btn banana="confirm" big={false} />
</div>
);
}
const root = document.getElementById("root");
ReactDOM.render(<App />, root);
๋ถ๋ชจ ์ปดํฌ๋ํธ์์ render๋ ์์ ์ปดํฌ๋ํธ์ ์ ๋ฌํ๊ณ ์ ํ๋ ์ ๋ณด๋ฅผ ์์ฑํ๋ฉด, props๋ฅผ ํตํด ์์์์์ ํด๋น ์ ๋ณด๊ฐ ์ ๋ฌ๋๋ค.
props๋ Btn ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ๋ ์ฒซ๋ฒ์งธ์ด์ ์ ์ผํ argument(์ ๋ฌ์ธ์)์ด๋ค.
function Btn(props) {
console.log(props);
return (
<button
style={{
backgroundColor: "tomato",
color: "white",
padding: "19px 20px",
border: "none",
borderRadius: 10,
fontSize: props.big ? 24 : 16,
}}
>
{props.banana}
</button>
);
}

props๋ ๊ฐ์ฒด๋ก ๋ค์ด์ค๊ธฐ ๋๋ฌธ์, props์ key์ ๋ฐ๋ฅธ value๊ฐ ํ์ํ๋ค๋ฉด props.key๋ก ๊บผ๋ด์ ์ฌ์ฉํด์ผํ๋ค.
์ ์ฒด์ฝ๋
function Btn(props) {
return (
<button
style={{
backgroundColor: "tomato",
color: "white",
padding: "19px 20px",
border: "none",
borderRadius: 10,
fontSize: props.big ? 24 : 16,
}}
>
{props.banana}
</button>
);
}
function App() {
return (
<div>
<Btn banana="save Changes" big={true} />
<Btn banana="confirm" big={false} />
</div>
);
}
const root = document.getElementById("root");
ReactDOM.render(<App />, root);
Short Cut
props.key๋ก ์ ๋ณด๋ฅผ ๊บผ๋ด๋ ๊ฒ์ด ์ซ๋ค๋ฉด props๋ฅผ ์ฒ์๋ถํฐ ๊บผ๋ด์ ๋๊ฒจ์ฃผ๋ฉด ๋๋ค.
function Btn({ banana, big }) {
return (
<button
style={{
backgroundColor: "tomato",
color: "white",
padding: "19px 20px",
border: "none",
borderRadius: 10,
fontSize: big ? 24 : 16,
}}
>
{banana}
</button>
);
}
function App() {
return (
<div>
<Btn banana="save Changes" big={true} />
<Btn banana="confirm" big={false} />
</div>
);
}
const root = document.getElementById("root");
ReactDOM.render(<App />, root);
ํ์ง๋ง ๋๋ shortCut๋ณด๋ค๋ props๊ฐ์ฒด๋ก ๋๊ธฐ๊ณ ์ฌ์ฉํ๋๊ฒ ๋ ์ข๋ค.
text, boolean ๋ง๊ณ ๋ ํจ์๋ props๋ก ์ ๋ฌํ ์ ์๋ค.
function App() {
// ์ด๊ธฐ๊ฐ์ด "save Changes"์ธ useState ์์ฑ.
const [value, setValue] = React.useState("save Changes");
//changeValue๊ฐ ์ด๋ค์๋์ ํด์ผํ ์ง ์ ์ด์ฃผ๊ณ ,
const changeValue = () => {
setValue("revert Changes");
};
return (
<div>
// banana๋ผ๋ ์ธ์์๋ value,
//potato๋ผ๋ ์ธ์์์ changeValue๋ผ๋ ์ ๋ฌ์์๋ฅผ ์ ์ด์ค๋ค.
<Btn banana={value} popato={changeValue} />
<Btn banana="confirm" />
</div>
);
}
์ฌ๊ธฐ์์ popato๊ฐ ๋ฐ๋ก ์์์์์๊ฒ ์ ๋ฌ๋๋ event์ธ๋ฐ ์ด๊ฒ์ด eventListner๋ ์๋๋ค.
์๋ํด์ผํ๋ event๋ฅผ ๋ด๊ณ ์๋ argument์ ๋ฌ์ธ์ ์ผ ๋ฟ์ด๋ค.
//App์ ์์์์์ธ Btn์ App์ด ์ ๋ฌํ๊ณ ์ ํ๋ potato๋ฅผ props๋ก ์ ๋ฌํ๊ณ
function Btn({ banana, popato }) {
return (
<button
//eventListenr์ธ onClick์ popato๋ฅผ ๋ด์์ค๋ค.
onClick={popato}
style={{
backgroundColor: "tomato",
color: "white",
padding: "19px 20px",
border: "none",
borderRadius: 10,
fontSize: 16,
}}
>
{banana}
</button>
);
}

props = ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์์ ์ปดํฌ๋ํธ์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๋ฐฉ์.
๋ถ๋ชจ์ props๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ์ปดํฌ๋ํธ(ํจ์)์ ์ธ์๋ก ๊ฐ์ฒด๊ฐ ๋ค์ด๊ฐ๊ฒ ๋จ.
ํ๋์ ๋ฒํผ์ ๋ง๋ค์ด์ props๋ฅผ ์ด์ฉํด ๋ฒํผ์ ์คํ์ผ์ ๊ด๋ฆฌํด์ ์ฌ์ฌ์ฉ ํ ์ ์๊ฒ๋จ.
๊ทธ๋ฐ๋ฐ ์ฝ์์ ์ฐ์ด๋ณด๋ฉด ์ข ์ด์ํ ๋ถ๋ถ์ด ์๋ค.
react์์๋ ๋ณ๊ฒฝํ state๋ง updateํ๋ค๊ณ ๋ฐฐ์ ๋๋ฐ ๊ทธ๋ ๋ค๋ฉด ์ฝ์๋ ๋ณ๊ฒฝ๋ state๋ง ์ฐํ์ผํ๋ ๊ฒ ์๋๊น? ํ์ง๋ง ์ด๊ฒ์ ๋น์ฐํ๋ค. ๋ถ๋ชจ์์์ธ App์ ๊ธฐ์ค์ผ๋ก ์๊ฐํด๋ณด๋ฉด ๋๋ค. Btn์ ๊ฐ์ธ๊ณ ์๋ ๋ถ๋ชจ์์App์ ์์์์์ธ Btn์ ์ํด ๋ณํ๋ฅผ ๊ฒช๊ฒ ๋๊ธฐ๋๋ฌธ์ ์ ์ฒด๊ฐ ๋ค์ ๊ทธ๋ ค์ง๊ธฐ ๋๋ฌธ์ console๋ํ ๋ณ๊ฒฝ๋์ง ์์ banana๊น์ง ์ฐํ๋ ๊ฒ์ด๋ค.
๊ตณ์ด ๋ณ๊ฒฝ๋์ง ์์ state๊น์ง ๋ค์ ๊ทธ๋ ค์ค์ผํด?
react๋ ๊ทธ ๋ถ๋ถ๋ํ ์๋ฒฝํ๊ฒ ๋ณด์ํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ๋ค.
React.memo()
state๊ฐ ๋ณ๊ฒฝ๋์ง ์๋ component๋ ๋ค์ ๊ทธ๋ ค์ง์ง ์๋๋ก react์๊ฒ ๊ธฐ์ต(Memorize)ํ๋๋ก ๋ช ๋ นํ๋ react Hook.
์ปดํฌ๋ํธ Btn์ React.memo()๋ฅผ ์ด์ฉํด MemorizeBtn๋ผ๋ ์ด๋ฆ์ ์๋ก์ด ์ปดํฌ๋ํธ๋ก ๋ณ๊ฒฝํ๋ค.
function Btn({ banana, popato }) {
console.log(banana, "render๋์");
return (
<button
onClick={popato}
style={{
backgroundColor: "tomato",
color: "white",
padding: "19px 20px",
border: "none",
borderRadius: 10,
fontSize: 16,
}}
>
{banana}
</button>
);
}
const MemorizeBtn = React.memo(Btn);
๋ถ๋ชจ์์App์์ ์์์์Btn๋ํ ์๋ก์ด ์ปดํฌ๋ํธ์ธ MemorizeBtn๋ก ๋ณ๊ฒฝํ๋ค.
function App() {
const [value, setValue] = React.useState("save Changes");
const changeValue = () => {
setValue("revert Changes");
};
return (
<div>
<MemorizeBtn banana={value} popato={changeValue} />
<MemorizeBtn banana="confirm" />
</div>
);
}
๋ณ๊ฒฝ๋ state๋ง console์ ์ฐํ๋ค.

propTypes๋ react๊ฐ ์ ๊ณตํ๋ props์ type์ ์ฒดํฌํ๋ ๊ธฐ๋ฅ์ด๋ค.
//์คํฌ๋ฆฝํธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ
<script src="https://unpkg.com/prop-types@15.8.1/prop-types.js"></script>
function App() {
const [value, setValue] = React.useState("save Changes");
const changeValue = () => {
setValue("revert Changes");
};
return (
<div>
//์ ์์ ์ธ props๊ฐ ๋ด๊ธด Btn
<Btn banana={value} popato={changeValue} fontSize={24} />
//ํ
์คํธ๋ฅผ ์ํด Btn์ props๋ค์ ์๋ชป๋ ํ์
์ผ๋ก ๋ฃ์ด๋ณด์๋ค.
<Btn banana={14} fontSize={"Continue"}/>
</div>
);
}
๋ฌธ์ ์์ด๋ณด์ธ๋ค. ํ์ง๋ง ๋ถ๋ช
ํ ์๋ชป๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
fontSize์ ํ์
์ number์ด๊ณ , banana๋ string์ธ ๊ฒ์ ์ฐ๋ฆฌ๋ ์ ์ ์๋ค. ํ์ง๋ง react๋ ๊ทธ๊ฒ์ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ propTypes์ ์ฌ์ฉํด Props๋ก ์ ๋ฌํ๋ state์ type์ด ๋ฌด์์ธ์ง ํ์ธํ๋ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผํ๋ค.
Btn.propTypes = {
banana: PropTypes.string,
fontSize: PropTypes.number,
};
type์ ๋ง์ง ์๋ ๊ฐ์ ๋ณด๋ด๊ณ ์๋ค๊ณ ๊ฒฝ๊ณ ํ๋ ๋ฉ์ธ์ง๊ฐ ์ถ๋ ฅ๋๋ค.
์ด๋์ ์ด๋ ๋ถ๋ถ์ด ๋ฌธ์ ์ธ์ง ์ฝ ์ง์ด์ฃผ๊ธฐ ๋๋ฌธ์ ํ์ธ ํ ์์ ํ ์ ์๋ค.