์ปดํฌ๋ํธ์ ์์ฑ(property)์ ํด๋นํ๋ฉฐ ์ธ๋ถ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๊ฐ์ด๋ค.
๋ถ๋ชจ(์์) ์ปดํฌ๋ํธ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๊ฐ์ด๋ฉฐ, React ์ปดํฌ๋ํธ๋ JavaScript ํจ์์ ํด๋์ค๋ก, props๋ฅผ ํจ์์ ์ ๋ฌ์ธ์(arguments)์ฒ๋ผ ์ ๋ฌ๋ฐ์ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉด์ ์ด๋ป๊ฒ ํ์๋๋์ง๋ฅผ ๊ธฐ์ ํ๋ React ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐํํ๋ค.
๋ฐ๋ผ์, ์ปดํฌ๋ํธ๊ฐ ์ต์ด ๋ ๋๋ง ๋ ๋ ํ๋ฉด์ ์ถ๋ ฅํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ด๊น๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
๋ชจ๋ ํ์ ์ ๊ฐ์ ์ ๋ฌํ ์ ์๋๋ก ๊ฐ์ฒด์ ํํ๋ฅผ ๊ฐ์ง๋ค.
์ฝ๊ธฐ ์ ์ฉ(read-only)์ด๋ค.(ํจ๋ถ๋ก ๋ณ๊ฒฝ X)
props ์์ ์ ์์ ์ปดํฌ๋ํธ์ ๊ฐ์ ์ํฅ์ ๋ฏธ์น ์ ์๊ธฐ ๋๋ฌธ์, ์๋์น ์์ side effect๋ฅผ ๋ฐฉ์งํ๊ณ ์ ์ฝ๊ธฐ ์ ์ฉ ๊ฐ์ฒด์ ํํ๋ฅผ ๊ฐ์ง๋ค.
1. ํ์ ์ปดํฌ๋ํธ์ ์ ๋ฌํ๊ณ ์ ํ๋ ๊ฐ๊ณผ ์์ฑ์ ์ ์ํ๋ค.
<parent>
, <child>
๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ์ ์ธ ํ, <parent>
์ปดํฌ๋ํธ ์์ <child>
์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ค.function Parent() {
return (
<div className="parent">
<h1>I'm the parent</h1>
<Child />
</div>
);
};
function Child() {
return (
<div className="child"></div>
);
};
HTML์์ ์์ฑ๊ณผ ๊ฐ์ ํ ๋นํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
<a href="www.codestates.com">Click me to visit Code States</a>
React์์ ์์ฑ๊ณผ ๊ฐ์ ํ ๋นํ๋ ๋ฐฉ๋ฒ๋ ์์ ์ ์ฌํ๋, ์ ๋ฌํ๊ณ ์ ํ๋ ๊ฐ์ ์ค๊ดํธ๋ก ๊ฐ์ธ์ค๋ค.
<Child attribute={value} />
๋ฐ๋ก ์์ ๋ฐฉ๋ฒ์ ์ด์ฉํด text
์์ฑ๊ณผ "I'm the eldest child"
๋ผ๋ ๋ฌธ์์ด ๊ฐ์ ํ ๋นํ๋ฉด ์๋์ ๊ฐ๋ค.
<Child text={"I'm the eldest child"} />
2. props๋ฅผ ์ด์ฉํด ์ ์๋ ๊ฐ๊ณผ ์์ฑ์ ์ ๋ฌํ๋ค.
<parent>
์ปดํฌ๋ํธ์์ ์ ๋ฌํ "I'm the eldest child"
๊ฐ์ <child>
์ปดํฌ๋ํธ์์ ๋ฐ๋๋ค.
ํจ์์ ์ธ์๋ฅผ ์ ๋ฌํ๋ฏ์ด React ์ปดํฌ๋ํธ์ props๋ฅผ ์ ๋ฌํ๋ฉด props๊ฐ ํ์ํ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์จ๋ค.
function Child(props) {
return (
<div className="child"></div>
);
};
3. ์ ๋ฌ๋ฐ์ props๋ฅผ ๋ ๋๋งํ๋ค.
props๋ฅผ ๋ ๋๋งํ๊ธฐ ์ํด์๋ JSX์์ ์ง์ ๋ถ๋ฌ์ ์ฌ์ฉํด์ผ ํ๋ค.
๋จ, props๋ ๊ฐ์ฒด์ด๋ฉฐ ์ด ๊ฐ์ฒด์ {key: value}๋ <parent>
์ปดํฌ๋ํธ์์ ์ ์ํ {attribute: value}์ ํํ๋ฅผ ๋บ๋๋ค.
๋ฐ๋ผ์, props์ value๋ฅผ dot notation์ผ๋ก ์ ๊ทผํ๋ค.
function Child(props) {
return (
<div className="child">
<p>{props.text}</p>
</div>
);
};
function Parent() {
return (
<div className="parent">
<h1>I'm the parent</h1>
<Child text={"I'm the eldest child"} />
{/* Child ์ปดํฌ๋ํธ์ ๋ ๋ค๋ฅธ ๋ฌธ์์ด์ props ๋ก ์ ๋ฌํด ๋ณด์ธ์ */}
<Child />
</div>
);
}
function Child(props) {
// console ์ ์ด์ด props ์ ํํ๋ฅผ ์ง์ ํ์ธํ์ธ์.
console.log("props : ", props); //props :
{text: "I'm the eldest child"}
return (
<div className="child">
<p>{props.text}</p>
</div>
);
}
prop๋ฅผ ์ ๋ฌํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก, ์ฌ๋ ํ๊ทธ์ ๋ซ๋ ํ๊ทธ์ ์ฌ์ด์ value๋ฅผ ๋ฃ์ด ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
props.children
์ ์ด์ฉํด ํด๋น value์ ์ ๊ทผํ์ฌ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์คํ ๊ฒฐ๊ณผ๋ ์์ ์์์ ๋์ผํ๋ค.
function Parent() {
return (
<div className="parent">
<h1>I'm the parent</h1>
<Child>I'm the eldest child</Child>
</div>
);
};
function Child(props) {
return (
<div className="child">
<p>{props.children}</p>
</div>
);
};
Q . App
์ปดํฌ๋ํธ์ ์๋ itemOne
๊ณผ itemTwo
๋ฅผ Learn
์ปดํฌ๋ํธ์ props๋ก ์ ๋ฌํ์ฌ, "React๋ฅผ ๋ฐฐ์ฐ๊ณ ์์ต๋๋ค"
๋ผ๋ ๋ฌธ์์ด์ด rendering ๋๋๋ก ์ฝ๋๋ฅผ ์์ฑํ์ธ์.
const App = () => {
const itemOne = "React๋ฅผ";
const itemTwo = "๋ฐฐ์ฐ๊ณ ์์ต๋๋ค.";
return (
<div className="App">
{/* Learn ์ปดํฌ๋ํธ์ itemOne ๊ณผ itemTwo ๋ฅผ
props ๋ก ์ ๋ฌํ์ธ์ */}
<Learn text = {`${itemOne} ${itemTwo}`}/>
</div>
);
};
const Learn = (props) => {
// ์ ๋ฌ๋ฐ์ props ๋ฅผ ์๋ <div> tag ์ฌ์ด์ ์ฌ์ฉํ์ฌ
// "React๋ฅผ ๋ฐฐ์ฐ๊ณ ์์ต๋๋ค" ๋ผ๋ ๋ฌธ์ฅ์ด ๋ ๋๋ง๋๋๋ก ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ์ธ์
return <div className="Learn">
<p>{props.text}</p>
</div>;
};
state๋ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๋ณํ ์ ์๋ ๊ฐ์ด๋ค.
์ค์ ์ ํ๋ฆฌ์ผ์ด์
์ state๋ ์ผํ๋ชฐ ์ฅ๋ฐ๊ตฌ๋๋ฅผ ์๋ก๋ค๋ฉด, ๊ตฌ๋งคํ ๋ฌผ๊ฑด๊ณผ ๋น์ฅ์ ๊ตฌ๋งคํ์ง ์์ ๋ฌผ๊ฑด์ ์ฒดํฌ๋ฐ์ค์ ์ฒดํฌํ์ฌ ๊ตฌ๋ถ ์ง์ ๋, check๋ ์ํ
์ check๋์ง ์์ ์ํ
๋ก ๊ตฌ๋ถํ ์ ์๋ค.
์๋๋ check๋ ์ํ์ ๋ฐ๋ผ ๋ณด์ด๋ ๊ธ์จ๊ฐ ๋ฌ๋ผ์ง๋ ์ฝ๋์ด๋ค.
import React, { useState } from "react";
function CheckboxExample() {
const [isChecked, setIsChecked] = useState(false);
const handleChecked = (event) => {
setIsChecked(event.target.checked);
};
return (
<div className="App">
<input type="checkbox" checked={isChecked} onChange={handleChecked} />
<span>{isChecked ? "Checked!!" : "Unchecked"}</span>
</div>
);
}
์ด๋ฅผ ์ผํ๋ชฐ์ ์ ์ฉํ๋ฉด, ์ฒดํฌ ์ฌ๋ถ์ ๋ฐ๋ผ ๊ตฌ๋งคํ ๋ฌผ๊ฑด์ ๊ฐ์๋ ๊ตฌ๋งค ๊ธ์ก์ด ๋ณ๊ฒฝ๋๊ณ , ์ด์ ๋ฐ๋ผ ์ฌ์ฉ์์ ํ๋ฉด๋ ๋ฌ๋ผ์ง๋ค.
์์ ๊ฐ์ด ์ปดํฌ๋ํธ ๋ด์์ ๋ณํ ์ ์๋ ๊ฐ, ์ฆ ์ํ๋ React state๋ก ๋ค๋ค์ผํ๋ค.
React๋ state๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ก useState
๋ผ๋ ํจ์๋ฅผ ์ ๊ณตํ๋ค.
๋ฐ๋ก ์์์ ๋ค๋ฃฌ ์ฝ๋๋ฅผ ๋ฐํ์ผ๋ก ์ฌ์ฉ ๋ฐฉ๋ฒ๊ณผ ์๋ ๋ฐฉ์์ ์ดํดํด๋ณด์.
useState
๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์๋ import
ํค์๋๋ก React๋ก๋ถํฐ useState
๋ฅผ ๋ถ๋ฌ์์ผ ํ๋ค.import React, { useState } from "react";
์ดํ, useState
๋ฅผ ์ปดํฌ๋ํธ ์์์ ํธ์ถํ๋ค. useState
์ ํธ์ถ์ "state"๋ผ๋ ๋ณ์๋ฅผ ์ ์ธํ๋ ๊ฒ๊ณผ ๊ฐ์ผ๋ฉฐ ๋ณ์๋ช
์ ์์๋ก ์์ฑํ๋ค. ์ด ๋ณ์๋ React์ ์ํด ํจ์๊ฐ ์ข
๋ฃ๋๋ ์ฌ๋ผ์ง์ง ์๋๋ค.
isChecked
, serIsChecked
๋ useState
์ ๋ฆฌํด๊ฐ์ ๊ตฌ์กฐ ๋ถํด ํ ๋นํ ๋ณ์์ด๋ค.
function CheckboxExample() {
// ์๋ก์ด state ๋ณ์๋ฅผ ์ ์ธํ๊ณ , ์ฌ๊ธฐ์๋ ์ด๊ฒ์ isChecked ๋ผ ๋ถ๋ฅด๊ฒ ์ต๋๋ค.
const [isChecked, setIsChecked] = useState(false);
}
์์ ์ฝ๋๋ฅผ ํ์ด์ฐ๋ฉด ์๋์ ๊ฐ๋ค.
function CheckboxExample() {
const stateHookArray = useState(false);
const isChecked = stateHookArray[0];
const setIsChecked = stateHookArray[1];
}
useState
๋ฅผ ํธ์ถํ๋ฉด ๋ฐฐ์ด์ ๋ฐํํ๋ค.
๋ฐฐ์ด์ 0๋ฒ์งธ ์์๋ ํ์ฌ state๋ณ์์ด๊ณ , 1๋ฒ์งธ ์์๋ ๋ณ์๋ฅผ ๊ฐฑ์ ํ ์ ์๋ ํจ์์ด๋ค.
๋ํ, useState
์ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ ๊ฐ์ state์ ์ด๊น๊ฐ์ด๋ค.
const [state ์ ์ฅ ๋ณ์, state ๊ฐฑ์ ํจ์] = useState(์ํ ์ด๊ธฐ ๊ฐ);
์์ ์๋์ฝ๋๋ฅผ ์ค์ ๋ก ์ ์ฉํ๋ฉด ์๋์ ๊ฐ๋ค.
function CheckboxExample() {
const [isChecked, setIsChecked] = useState(false);
// const [state ์ ์ฅ ๋ณ์, state ๊ฐฑ์ ํจ์] = useState(state ์ด๊น๊ฐ);
isChecked
: state๋ฅผ ์ ์ฅํ๋ ๋ณ์
setIsChecked
: state isChecked
๋ฅผ ๋ณ๊ฒฝํ๋ ํจ์
useState
: state hook
false
: state ์ด๊น๊ฐ
state๋ฅผ ๊ฐฑ์ ํ๋ ค๋ฉด state ๋ณ์๋ฅผ ๊ฐฑ์ ํ ์ ์๋ ํจ์๋ฅผ ํธ์ถํ๋๋ฐ, ์์์ ๊ฒฝ์ฐ setIsChecked
๋ฅผ ํธ์ถํ๋ค.
์์์ ๊ฒฝ์ฐ, input[type=checkbox]
JSX ์๋ฆฌ๋จผํธ์ ๊ฐ ๋ณ๊ฒฝ์ ๋ฐ๋ผ์ isChecked
๊ฐ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค. ์ฆ, ๋ธ๋ผ์ฐ์ ์์ checked
๋ก ๊ฐ์ด ๋ณ๊ฒฝ๋์๋ค๋ฉด, React์ isChecked
๋ํ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค.
input[type=checkbox]
์๋ฆฌ๋จผํธ์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด onChange
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋๋ก ํด์ผํ๋ค.
React๋ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ฌ์ฉ์๊ฐ ์ฒดํฌ๋ฐ์ค ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด onChange
์ด๋ฒคํธ๊ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์์ธ handleChecked
๋ฅผ ํธ์ถํ๊ณ , ์ด ํจ์๊ฐ setIsChecked
๋ฅผ ํธ์ถํ๊ฒ ๋๋ค. setIsChecked
๊ฐ ํธ์ถ๋๋ฉด ํธ์ถ๋ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ isChecked
๋ณ์๊ฐ ๊ฐฑ์ ๋๋ฉฐ, React๋ ์๋ก์ด isChecked
๋ณ์๋ฅผ CheckboxExample
์ปดํฌ๋ํธ์ ๋๊ฒจ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋ง ํ๋ค.
function CheckboxExample() {
const [isChecked, setIsChecked] = useState(false);
const handleChecked = (event) => {
setIsChecked(event.target.checked);
};
return (
<div className="App">
<input type="checkbox" checked={isChecked} onChange={handleChecked} />
<span>{isChecked ? "Checked!!" : "Unchecked"}</span>
</div>
);
}
React ์ปดํฌ๋ํธ๋ state๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋กญ๊ฒ ํธ์ถ๋๊ณ ๋ฆฌ๋ ๋๋ง ๋๋ฉฐ, React state๋ ์ํ ๋ณ๊ฒฝ ํจ์ ํธ์ถ๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค.(๊ฐ๋ฐ์์ ์ฝ์!, ์์์ ๊ฒฝ์ฐ setIsChecked
)
๊ฐ์ ๋ก ๋ณ๊ฒฝ์ ์๋ํ ๊ฒฝ์ฐ, ๋ฆฌ๋ ๋๋ง์ด ๋์ง ์๊ฑฐ๋ state๊ฐ ์ ๋๋ก ๋ณ๊ฒฝ๋์ง ์๋๋ค.
Reference: ์ฝ๋์คํ ์ด์ธ