JiwonDev

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);
    }
/* ... ์ดํ•˜ ์ฝ”๋“œ ์ƒ๋žต ... */
}

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ