React #3 props & state
by JiwonDev#1 props (Property)
์์ ์ปดํฌ๋ํธ์ ์์ฑ์ ๋ณ์์ฒ๋ผ ๊ฐ์ ธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ปดํฌ๋ํธ ๋ด๋ถ์ ๋ถ๋ณํ ๋ฐ์ดํฐ (Immutable Data)๋ฅผ ์ฌ์ฉํ ๋ ์ด์ฉํฉ๋๋ค.
this.props.์์ฑ์ด๋ฆ ์ผ๋ก ์ ๊ทผ ํ ์ ์์ผ๋ฉฐ
์์ฑ ๋ง๊ณ ํ๊ทธ ์ฌ์ด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ถ๋ค๋ฉด this.props.children ์ ํตํด ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
this.props.children์๋ <Cpnt> ์ฌ๊ธฐ์ ์๋ ๊ฐ </Cpnt> ์ด ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค.
์๋
ํ์ธ์ name prop์์ ์ฌ๊ธฐ๊ฐ children ๊ฐ์ ๋๋ค |
class Hello extends React.Component{
render() {
return(
<div>
<h1> ์๋
ํ์ธ์ {this.props.name}</h1>
<div> {this.props.children} </div>
</div>
)
}
}
class App extends React.Component{
render() {
return(
<Hello name="name prop์์"> ์ฌ๊ธฐ๊ฐ children ๊ฐ์
๋๋ค. </Hello>
);
}
}
์ฐธ๊ณ ๋ก App ๊ฐ์ฒด์์๋ props๋ฅผ ์ฌ์ฉ ํ ์ ์์ต๋๋ค.
class App extends React.Component{
render() {
return(
<Hello name={this.props.name}> {this.props.children} </Hello>
);
}
}
ReactDOM.render(<App name="์๋ฝ"> ์ฌ๊ธฐ๋ children </App>.document.getElementById('root'));
#1-1 defaultProps
์ปดํฌ๋ํธ์์ .defaultProps = { } ๋ฅผ ์ด์ฉํด default ์์ฑ ๊ฐ์ ์ง์ ํ ์ ์์ต๋๋ค.
class App extends React.Component{
render() {
return(
<Hello name={this.props.value}> {this.props.str} </Hello>
);
}
}
App.defaultProps = {
value : 0,
str : "Hello"
}
# 1-2 propTypes
๋ํดํธ ๊ฐ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, ๊ธฐ๋ณธ ํ์ ์ ์ค์ ํ์ฌ ์๋ชป๋ ๊ฐ์ด ๋ค์ด์์ ๋ ๋ ๋๋ง ๊ฒฝ๊ณ ๋ฅผ ๋์ธ ์ ์์ต๋๋ค.
๋จ์ํ string, number๊ฐ์ ํ์ ์ง์ ์ด์ธ์๋ ๋ค์ํ๊ฒ ๊ธฐ๋ณธ ์ ๋ ฅ ํ์์ ์ค์ ๊ฐ๋ฅํฉ๋๋ค.
App.prototype = {
value: React.PropType.string,
value2:React.PropType.number,
value3:React.PropType.any.isRequired // ํ์์
๋ ฅ. ์ด๋ฐ ๊ธฐ๋ฅ๋ ์์ต๋๋ค.
}
#2 State
์ปดํฌ๋ํธ์์ ์ ๋์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ๋ ์ฌ์ฉํฉ๋๋ค.
{ this.state.name } ์ผ๋ก ์ฌ์ฉํ๋ฉฐ ์์ฑ์( constructor( ) )์์ ์ด๊ธฐ๊ฐ ์ค์ ์ด ํ์์ ๋๋ค.
์ปดํฌ๋ํธ ๋ด๋ถ์์ ๊ฐ์ ๋ณ๊ฒฝํ๊ณ ์ถ๋ค๋ฉด this.setState( {...} ) ๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ด๊ธฐ๊ฐ์ด ์๋ค๋ฉด ๋๋๋ง ์ค๋ฅ๊ฐ ๋น๋๋ค.
๋ฌผ๋ก ๋๋๋ง ์ดํ์ this.state = "~" ๋ก ๊ฐ์ ๋ก ๊ฐ์ ๋ณ๊ฒฝํ ์๋ ์์ง๋ง
๊ทธ๋ฌ๋ฉด ๋ฆฌ์กํธ์ ๊ฐ์DOM์ ์ฌ์ฉํ๋ ์ด์ ๊ฐ ์์ด์ง๋ฏ๋ก ์์ฑ์ ๋ฐ์์๋ ์ ๋ ์ฌ์ฉํด์๋ ์๋๋ ๋ฐฉ๋ฒ์ ๋๋ค.
class Counter extends React.Component{
constructor(props) {
// ์์ฑ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ ๊ฒฝ์ฐ, super(props)๋ฅผ ์ ๋ฌํด์ค์ผ this.props๊ฐ ์ ์ ์๋๋ฉ๋๋ค.
super(props);
this.state = {
value:0 // state๋ ์ด๊ธฐํํ์ง ์์ผ๋ฉด ๋๋๋ง ๋์ง ์์ต๋๋ค.
}
}
render() {
return(
<div>
<h2>{this.state.value}</h2>
</div>
)
}
}
# 2-1 ์ด๋ฒคํธ ์ฐ๊ฒฐ
์๋ฐ์คํฌ๋ฆฝํธ์ ์ด๋ฒคํธ์ ๋์ผํฉ๋๋ค.
์ปดํฌ๋ํธ ๊ฐ์ฒด ์์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ๋ฉ์๋๋ฅผ ๋ง๋ค๊ณ ํด๋น ํ๊ทธ์ ์ด๋ฒคํธ ์์ฑ์ ์ฐ๊ฒฐ ํ ํ
state๊ฐ์ this.setState( {key:value} ) ๋ก ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋ฉ๋๋ค.
๋ค๋ง, ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฉ์๋์์ this.state๋ฅผ ์ฌ์ฉํ๋ฉด object.state๋ก ์ทจ๊ธ๋๊ธฐ์ ์ฌ์ฉ ํ ์ ์์ต๋๋ค.
์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ์ด๋ฒคํธ ์์ฑ์ ์ฐ๊ฒฐํ ๋ { this.๋ฉ์๋.bind(this) } ๋ก ์ง์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
class Counter extends React.Component{
constructor(props) {
super(props);
this.state = {
value:0
}
}
handleClick(){ // ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ๋ฉ์๋๋ ์ปดํฌ๋ํธ ๊ฐ์ฒด์์ ์์ฑํฉ๋๋ค.
// this.state = "value" ๋ก ๋ณ๊ฒฝํด์๋ ์๋ฉ๋๋ค. ๊ฐ๋ฅ์ ํ์ง๋ง ๊ฐ์DOM์ ์ฐ๋ ์๋ฏธ๊ฐ ์์ด์ง๋๋ค.
this.setState({
value:this.state.value + 1 // this๋ฅผ bind์์ผ์ค์ผ ์ฌ์ฉ๊ฐ๋ฅํฉ๋๋ค.
});
}
render() {
return(
<div>
<h2>{this.state.value}</h2>
<button onClick={this.handleClick}>ํด๋ฆญ!</button>
<button onClick={this.handleClick.bind(this)}> this์ฌ์ฉ๊ฐ๋ฅ ํด๋ฆญ! </button>
</div>
)
}
}
๋ค๋ง bind๋ ์์ฑ์(constructor)์๋ ๊ฐ๋ฅํ๋ฏ๋ก, ์์ฑ์์ ํ๋๊ฒ ์ปจ๋ฒค์ ์ ๋ณด๊ธฐ์ ์ข์ต๋๋ค.
class Counter extends React.Component{
constructor(props) {
super(props);
this.state = {
value:0
}
this.handleClick = this.handleClick.bind(this);
}
/* ... ์ดํ ์ฝ๋ ์๋ต ... */
}
'๐ผFront > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฆฌ์กํธ์ Virtual DOM (0) | 2021.04.16 |
---|---|
React #5 create-react-app (0) | 2021.04.05 |
React #4 ํ๋ก์ ํธ ์์ฑ ๋ฐ ์ปดํฌ๋ํธ์ ์ดํด (0) | 2021.04.05 |
React #2 ๋ฆฌ์กํธ.JS (0) | 2021.04.05 |
React #1 ๊ฐ๋ (0) | 2021.03.29 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev