๐
Today's Goal
- props์ ๊ฐ๋
์ ํ ๋ฌธ์ฅ์ผ๋ก ์ค๋ช
ํ๊ธฐ
- props์ ๊ฐ๋
์ผ๋ก ๋ถ๋ชจ ์์์ state๋ฅผ ์์ ์์์์ ์ด๋ป๊ฒ ๋ฐ์์ํฌ ์ ์์๊น?
- props์ ๊ฐ๋
์ผ๋ก ์์์์ ์ผ์ด๋ ์ด๋ฒคํธ๋ก ๋ถ๋ชจ์ state ๊ฐ์ ์ด๋ป๊ฒ ๋ฐ๊ฟ ์ ์์๊น?
props
- properties(์์ฑ)
- ๋์ ๊ด๋ จ๋ ํน์ง๋ค์ด ์์ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด
๋๋ ์ฌ์์ด๋ค.
, ๋๋ ์๋น ์ ์ผ๊ตด์ ๋ฎ์๋ค.
๋ด๊ฐ ๊ฐ์ง๊ณ ์๋ ์ด๋ฐ ์์ฑ๋ค์ ๋ถ๋ชจ๋์๊ฒ์ ํ์ด๋๋ฉด์ ๊ฐ์ง๊ณ ์๋ ์์ฑ๋ค์ด๊ณ ๋ด๊ฐ ์ค์ค๋ก ๋ฐ๊ฟ ์ ์๋ค.
- props๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์ ๋ฌ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ง๋๊ณ ์๋ ๊ฐ์ฒด์ด๋ค.
- props๋ฅผ ํตํด์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์์ ์ปดํฌ๋ํธ์๊ฒ state์ ์ํ๊ฐ๊ณผ event handler๋ฅผ ๋๊ฒจ์ค ์ ์๋ค.
- ๋ถ๋ชจ์๊ฒ์ ์๋ฌด๋ฐ ์์ฑ๋ ๋ฐ์ง ์์ Child component์์ console.log๋ก ์ถ๋ ฅํด๋ณด๋ฉด ์๋ฌด ๊ฐ๋ ๋ํ๋์ง ์๋๋ค. ์์ ์ปดํฌ๋ํธ์์ props๋ฅผ ์ถ๋ ฅํ๊ณ ์ถ๋ค๋ฉด ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ props๋ฅผ ์ ๋ฌํด์ค์ผ ํ๋ค.
Child ์ปดํฌ๋ํธ์ props๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ
<\Child message="๋๋ ์ด์ฝ๋ฆฟ์ ๋งค์ฐ ์ข์ํฉ๋๋ค." />
Child ์ปดํฌ๋ํธ์์ ์ ๋ฌ๋ props๋ฅผ ๋ณด์ฌ์ค ๋
console.log({this.props.message});
- props๋ javascript ์๋ฃํ์ด ๋ฌด์์ด๋ ์ง ๋ค ๋๊ฒจ์ค ์ ์๋ค.(๊ฐ์ฒด, ๋ฐฐ์ด, ํจ์, Number ๋ฑ๋ฑ...)
๐ค ๋ถ๋ชจ์ state์ ์๋ ๋ฐ์ดํฐ๋ฅผ Child ์ปดํฌ๋ํธ์๊ฒ props๋ก ๋๊ธฐ๋ ๋ฐฉ๋ฒ
import React from 'react';
import Child from '../pages/Child/Child';
class Parent extends React.Component {
constructor() {
super();
this.state = {
color: 'red';
}
}
render() {
return (
<div>
<h1>Parent Component</h1>
<Child />
</div>
);
}
}
export default Parent;
- ๋ถ๋ชจ์ state์๋
color: 'red'
๊ฐ ์ ์ฅ๋์ด ์๋ค.
- ์ด๊ฒ์ Child ์ปดํฌ๋ํธ์๊ฒ props๋ฅผ ํตํด ๋๊ฒจ๋ณด์
import React from 'react';
import Child from '../pages/Child/Child';
class Parent extends React.Component {
constructor() {
super();
this.state = {
color: 'red'
};
}
render() {
return(
<div>
<h1>Parent Component</h1>
<Child titleColor={this.state.color} />
</div>
);
}
}
- titleColor๋ผ๋ ์์ฑ์ ๊ฐ์ผ๋ก this.state.color ๊ฐ์ ์ ๋ฌํด์ฃผ์๋ค.
- ์ฆ, ๋ถ๋ชจ ์ปดํฌ๋ํธ์ state ๊ฐ์ฒด ์ค์์ color์ ๊ฐ์ Child ์ปดํฌ๋ํธ์๊ฒ ์ ๋ฌํด์ค ๊ฒ์ด๋ค.
๐ค Child ์ปดํฌ๋ํธ ๋ด๋ถ์์ ์ ๋ฌ ๋ฐ์ props๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ ๊น?
import React from 'react';
class Child extends React.Component {
render() {
retun (
<div>
<h1 style={{color: this.props.titleColor}}>Child Component</h1>
</div>
);
}
}
export default Child;
h1
ํ๊ทธ์ ๊ธ์์์ ๋ค๋ฅธ ์์ผ๋ก ๋ฐ๊พธ๊ณ ์ถ๋ค.
- ์๊น ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์ํ๋ฅผ ๊ฐ์ผ๋ก ๊ฐ์ง๊ณ ์๋
titleColor
๋ผ๋ ์์ฑ์ Child ์ปดํฌ๋ํธ์๊ฒ ์ ๋ฌํด์คฌ๋ค.
- ํ์ฌ Child ์ปดํฌ๋ํธ๋ props ๊ฐ์ฒด ์ค์์ titleColor ๊ฐ์ ๊ฐ์ง๊ณ ์๋ค.
h1
ํ๊ทธ์ ์์์ ๋ฐ๊ฟ์ฃผ๊ธฐ ์ํด์ style์ ์ธ๋ผ์ธ์ผ๋ก css์ ์์ฑ ์ค color๋ผ๋ ์์ฑ์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ๋ฐ์์จ props.titleColor
๋ก ์ค์ ํด์คฌ๋ค.
props๋ฅผ ํตํ Event Handler ์ ๋ฌ
import React from 'react';
import Child from '../pages/Child/Child';
class Parent extends React.Component {
constructor() {
super();
this.state = {
color: 'red'
}
}
handleColor = () => {
this.setState({
color: 'blue'
});
}
render() {
retun (
<div>
<h1>Parent Component</h1>
<Child titleColor={this.state.color} changeColor={this.handleColor} />
</div>
);
}
}
- ์ด๋ฒคํธ ํธ๋ค๋ฌ
handleColor()
๋ฅผ props ๊ฐ์ฒด๋ฅผ ํตํด Child ์ปดํฌ๋ํธ์๊ฒ ์ ๋ฌํ ์ ์๋ค.
import React from 'react';
class Child extends React.Component {
render() {
return (
<div>
<h1 style={{color: this.props.titleColor}}>Child Component</h1>
<button onClick={this.props.changeColor}>Click</button>
</div>
);
}
}
export default Child;
<button>
์์์์ onClick ์ด๋ฒคํธ ๋ฐ์
- ์ด๋ฒคํธ ๋ฐ์ ์
this.props.changeColor
์คํ
- props ๊ฐ์ฒด์
changeColor
= ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ handleColor
ํจ์ ์คํ
handleColor
ํจ์ ์คํ ์ setState
ํจ์ ํธ์ถ - state์ color ๊ฐ์ 'blue'๋ก ๋ณ๊ฒฝ
- render ํจ์ ํธ์ถ
- Child ์ปดํฌ๋ํธ์ ๋ณ๊ฒฝ๋ state ๋ฐ์ดํฐ(
this.state.color
) ์ ๋ฌ
this.props.titleColor
๋ฅผ ๊ธ์ ์์์ผ๋ก ์ง์ ํ๋ h1
ํ์ดํ ์์ ๋ณ๊ฒฝ