์ปดํฌ๋ํธ๋ฅผ ํตํด UI๋ฅผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ๋ณ์ ์ธ ์ฌ๋ฌ ์กฐ๊ฐ์ผ๋ก ๋๋๋ค.
์ปดํฌ๋ํธ๋ ๊ฐ๋ ์ ์ผ๋ก JavaScript ํจ์์ ์ ์ฌํ๋ค. 'props'๋ผ๋ ์ ๋ ฅ์ ๋ฐ์ ํ, ํ๋ฉด์ ์ด๋ป๊ฒ ํ์๋๋์ง ๊ธฐ์ ํ๋ React ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐํํ๋ค.
์๋ฆฌ๋จผํธ๋ ์ผ๋ฐ ๊ฐ์ฒด(plain object)๋ก React ์ฑ์ ๊ฐ์ฅ ์์ ๋จ์๋ค. ์๋ฆฌ๋จผํธ๋ ์ปดํฌ๋ํธ์ '๊ตฌ์ฑ ์์'๋ค.
์ปดํฌ๋ํธ๋ฅผ ์ ์ธํ๋ ๋ฐฉ์์๋ ํจ์ํ ์ปดํฌ๋ํธ์ ํด๋์คํ ์ปดํฌ๋ํธ๊ฐ ์๋ค.
class Welcome extends React.Component {
render() {
return <h1>Hello</h1>;
}
}
ํด๋์คํ ์ปดํฌ๋ํธ๋ React.Component ํด๋์ค๋ฅผ ์์(์ด๋ฏธ ๊ตฌํ๋์ด ์๋ ํด๋์ค์ ๊ธฐ๋ฅ์ ์ถ๊ฐํจ)๋ฐ๋ ๊ฒ์ผ๋ก ๊ธฐ๋ณธ ํํ๋ฅผ ๊ฐ์ถ๋ค.
์ปดํฌ๋ํธ๋ jsx๋ฅผ ๋ฐํํด์ผํ๋๋ฐ, ํด๋์ค๋ return ๋ฌธ์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก, ํด๋์คํ ์ปดํฌ๋ํธ์์๋ JSX๋ฅผ ๋ฐํํ๊ธฐ ์ํด render()
ํจ์๋ฅผ ์ฌ์ฉํ๋ค. ๋ฆฌ์กํธ๋ ํด๋์คํ ์ปดํฌ๋ํธ์ render() ํจ์๋ฅผ ์๋์ผ๋ก ์คํ์ํจ๋ค.
function Welcome(props) {
return <h1>Hello</h1>;
}
ํจ์ํ ์ปดํฌ๋ํธ๋, props๋ก ๋ฐ์ ๊ฐ์ฒด ์ธ์๋ฅผ ์ ์ํ๊ณ , JSX๋ฅผ ๋ฐํํ๋ ๊ฒ์ผ๋ก ๊ธฐ๋ณธ ํํ๋ฅผ ๊ฐ์ถ๋ค.
ํจ์ํ ์ปดํฌ๋ํธ์์๋ return๋ฌธ์์ JSX๋ฅผ ๋ฐํํ ์ ์๋ค.
์ปดํฌ๋ํธ๋, ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ํ๋์ 'props' ๊ฐ์ฒด ์ธ์๋ฅผ ๋ฐ์ ํ React ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐํํ๋ค. ์ด๋ props๋ ์์ฑ์ ๋ํ๋ด๋ ๋ฐ์ดํฐ๋ค.
props๋ ์ปดํฌ๋ํธ์์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ๋ ๋ฐ์ดํฐ๋ค. ์ปดํฌ๋ํธ์ ์์ฑ์ผ๋ก, ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฌ์ ์ฌ์ฉํ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์๋ง ์ค์ ๊ฐ๋ฅํ๋ค.
<ComponentName prop1={propValue1} prop2={propValue2} ... />
ํํ๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฅผ ๋ ํจ๊ป ์ง์ ํ๋ค. ์๋ ์ฝ๋์์๋ Dog ์ปดํฌ๋ํธ์ name prop์ age prop๋ฅผ ์ง์ ํ์๋ค.<Dog name="Ari" age={10} />
<Dog name="Bori" age={7} />
์์ ๊ฐ์ด, ๊ฐ์ ํ์ ์ ์ปดํฌ๋ํธ์ ๋ค๋ฅธ props ๊ฐ์ ์ฃผ์ด, ํจํด์ด ๋ฐ๋ณต๋๋ ํํ๋ก ์ปดํฌ๋ํธ์ ํจ์จ์ ์ธ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
props์๋ ๋ถ๋ฆฌ์ธ ๊ฐ(true, false), ์ซ์, ๋ฐฐ์ด๊ณผ ๊ฐ์ ๋ค์ํ ํํ์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ ์๋ค. ๊ณต๋ฐฑ ๊ตฌ๋ถ์ผ๋ก ์ฌ๋ฌ ๊ฐ๋ฅผ ๋ด๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
๐ก props์ ์๋ ๋ฐ์ดํฐ๋ ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๋ฉด ๋ชจ๋ ์ค๊ดํธ({})๋ก ๊ฐ์ ๊ฐ์ธ์ผ ํ๋ค.
๐ก props๋ ์ฝ๊ธฐ ์ ์ฉ์ด๋ฏ๋ก ์ปดํฌ๋ํธ์ ๋ด๋ถ์์ props๋ฅผ ์์ ํด์๋ ์ ๋๋ค. ์ ๋ ฅ๊ฐ์ ์์ ํ์ง ์๋ ํจ์๋ฅผ ์์ ํจ์๋ผ๊ณ ํธ์นญํ๋ฉฐ, ๋ชจ๋ React ์ปดํฌ๋ํธ๋ ์์ ์ props๋ฅผ ๋ค๋ฃฐ ๋, ์์ ํจ์์ฒ๋ผ ๋์ํด์ผํ๋ค.
props๋ฅผ ๋ฐ๋ ํจ์ํ ์ปดํฌ๋ํธ์ ์ธ์๋ฅผ ์ ์ํ๋ฉด, props๋ฅผ ์์ฑ์ผ๋ก ๊ฐ์ง๋ ๊ฐ์ฒด Object๊ฐ ํด๋น ์ธ์๋ก ์ ๋ฌ๋๋ค. ์ปดํฌ๋ํธ ๋ด๋ถ์์ ์ฌ์ฉ ์, ๊ฐ์ฒด์ ์กด์ฌํ๋ ๊ฐ์ ๊ฐ์ ธ์ค๋ฏ ์ ์ฐ์ฐ์(.)๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ props๋ฅผ ๊บผ๋ด ์ธ ์ ์๊ณ , ์ด๋ฅผ ์ค๊ดํธ๋ก ๊ฐ์ธ { [์ธ์ ์ด๋ฆ].[props ์ด๋ฆ] }
ํํ๋ก ์ฌ์ฉํ๋ค.
// ๊ฐ์ฒด ์ธ์๋ฅผ ํตํด props ๋ฐ์์ค๊ธฐ
function Dog(props) {
return {
<div>{props.name}</div>
<div>{props.age}</div>
}
}
props๋ฅผ ๋ฐ์ ๋, ๊ตฌ์กฐ ๋ถํด ํ ๋น์ ์ฌ์ฉํ์ฌ ์๋์ ๊ฐ์ด ์ ์ฐ์ฐ์ ์ฌ์ฉ์ ์ค์ผ ์ ์๋ค.
'prop-types' ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ์ปดํฌ๋ํธ์ ํน๋ณํ ํ๋กํผํฐ์ธ propTypes๋ฅผ ์ ์ธํ์ฌ ์ปดํฌ๋ํธ๊ฐ ๋ฐ์ props์ ํ์
์ ํ์ธํ๊ฑฐ๋, defaultProps ํ๋กํผํฐ๋ฅผ ํ ๋นํ์ฌ props์ ์ด๊ธฐ๊ฐ์ ์ ์ํ ์ ์๋ค.
Typechecking with Proptypes - React Docs
// ๊ฐ์ฒด ์ธ์๋ฅผ ๊ตฌ์กฐ ๋ถํด ํ ๋นํ์ฌ props ๋ฐ์์ค๊ธฐ
function Dog({ name, age }) {
return {
<div>{name}</div>
<div>{age}</div>
}
}
// ์ปดํฌ๋ํธ props ์ด๊ธฐ๊ฐ ์ง์
Dog.defaultProps = {,
name: '์ด๋ฆ',
age: 0,
}
// ์ปดํฌ๋ํธ props ํ์
ํ์ธ
Dog.propsTypes = {,
name: PropTypes.string.isRequired,
age: PropTypes.number,
}
this.props
๋ก ๋ถ๋ฌ์ ์ฌ์ฉํ๋ค. ํด๋์คํ ์ปดํฌ๋ํธ์์ propTypes๋ defaultProps๋ฅผ ์ฌ์ฉํ ๋๋, ํด๋์ค ๋ด๋ถ์์๋ ์ง์ ํ ์ ์๋ค.// ํด๋์คํ ์ปดํฌ๋ํธ์์ props ์ฌ์ฉํ๊ธฐ
class Dog extends React.Component {
static defaultProps = { ... }; // ์ปดํฌ๋ํธ props ์ด๊ธฐ๊ฐ ์ง์
static propTypes = { ... }; // ์ปดํฌ๋ํธ props ํ์
ํ์ธ
render() {
// ๊ตฌ์กฐ ๋ถํด ํ ๋น์ผ๋ก props ์ฌ์ฉ
const { name, age } = this.props;
return <div>{name}</div>;
}
}
state๋ ์ปดํฌ๋ํธ ๋ด๋ถ์ ๋์ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํ๋ค. props๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์ค์ ํ๋ ๊ฐ์ผ๋ก ์ปดํฌ๋ํธ ์์ ์ props๋ฅผ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก๋ง ์ฌ์ฉํ ์ ์๋ค.
state๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์๋ ์ปดํฌ๋ํธ์ ์ข ๋ฅ์ ๋ฐ๋ผ 2๊ฐ์ง๊ฐ ์๋ค. ํด๋์คํ ์ปดํฌ๋ํธ์์๋ ์ปดํฌ๋ํธ ์์ฒด๊ฐ state๋ฅผ ์ง๋๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ค. ํจ์ํ ์ปดํฌ๋ํธ์์๋ useState๋ผ๋ ํจ์, Hook์ ํตํด ์ฌ์ฉํ๋ค.
์ฌ๋ฌ ๊ฐ์ ์์์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ชจ์ผ๊ฑฐ๋ ๋ ๊ฐ์ ์์ ์ปดํฌ๋ํธ๋ค์ด ์๋ก ํต์ ํ๊ฒ ํ๊ธฐ ์ํด์ ์กฐ์ ์ปดํฌ๋ํธ์ state๋ฅผ ์ ์ํ๋ค. ์กฐ์ ์ปดํฌ๋ํธ๊ฐ props๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ปดํฌ๋ํธ์ state๋ฅผ ๋ค์ ์ ๋ฌํจ์ผ๋ก ์๋ก ๋๊ธฐํํ๋ค.
๋ ์ปดํฌ๋ํธ ๊ฐ state ๊ฐ์ ๋๊ธฐํํ๋ ์ผ, state๋ฅผ ๊ณต์ ํ๋ ์ผ์, ๊ทธ state ๊ฐ์ ํ์๋ก ํ๋ ์ปดํฌ๋ํธ ๊ฐ์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์ ์ปดํฌ๋ํธ๋ก state๋ฅผ ๋์ด์ฌ๋ฆผ์ผ๋ก ๊ฐ๋ฅํ๋ค. ๐ ์ฌ๋ฌ ๊ฐ์ ์ปดํฌ๋ํธ ๊ฐ์ state๋ฅผ ๋๊ธฐํ์ํค๊ธฐ๋ณด๋ค, ๊ณตํต ์กฐ์์ผ๋ก ๋์ด์ฌ๋ ค ํํฅ์ ๋ฐ์ดํฐ ํ๋ฆ์ ์ด์ฉํ์.
Lifting State Up - React Docs
The Data Flows Down - React Docs
this.state
๋ฅผ ํตํด state ๊ฐ์ฒด์ ์ด๊ธฐ๊ฐ์ ์ค์ ํ๊ณ , ์กฐํํ ์ ์๋ค.this.setState
๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก์ด ๊ฐ์ ์ค ์ ์๋ค.class ClassExample extends React.Component {
constructor(props) {
super(props);
// state ์ด๊ธฐ๊ฐ ์ค์
this.state = {
count: 0,
};
}
render() {
const { count } = this.state; // state ์กฐํ
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => {
this.setState({ // this.setState๋ฅผ ํตํด state ์
๋ฐ์ดํธ
count: count + 1
});
}}>
Click me
</button>
</div>
);
}
}
}
Hook์ด React ๋ฒ์ 16.8์ ์๋ก ์ถ๊ฐ๋๋ฉด์, Function Component์์๋ ์ํ ๊ฐ๊ณผ ์ฌ๋ฌ React์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๊ฒ ๋์๋ค.
ํจ์ํ ์ปดํฌ๋ํธ์์ state๋ฅผ ์ฌ์ฉํ๊ฒ ํด์ฃผ๋ useState Hook์ ๋ฐ๋ก ์ ๋ฆฌํ๋ค.