๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
JavaScript/React

[React] props ์‚ฌ์šฉํ•˜๊ธฐ #1

by soy๋ฏธ๋‹ˆ 2021. 10. 13.

 

๐Ÿ’ก Props ๋ž€?

react ์—์„œ props ๋Š” ์ „์—ญ๋ณ€์ˆ˜๋กœ, component ๊ฐ„์— ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ์ˆ˜๋‹จ์ด๋‹ค. app.js (๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ)์—์„œ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ(์ž์‹ ์ปดํฌ๋„ŒํŠธ)๋กœ ์–ด๋– ํ•œ ๊ฐ’์„ ์ „๋‹ฌํ•  ๋•Œ props ๊ฐ์ฒด์— ๋‹ด์•„์„œ ๋ณด๋‚ด๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

1. React props ์ž๋ฃŒํ˜• ์„ ์–ธํ•˜๊ธฐ

์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ props ์— ๋Œ€ํ•œ ์ž๋ฃŒํ˜•์„ ์„ ์–ธํ•ด๋†“์œผ๋ฉด, ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋„˜์–ด์˜ค๋Š” props ๋ณ€์ˆ˜๋“ค์˜ ์ž๋ฃŒํ˜•๊ณผ ๋น„๊ตํ•ด์„œ ์ž๋ฃŒํ˜•์ด ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฒฝ๊ณ  ๋ฉ”์„ธ์ง€๋ฅผ ์•Œ๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

1. App.js ์ˆ˜์ •ํ•˜๊ธฐ

 

import './App.css';
import PropsDatatype from './R018_PropsDatatype';

function App() {
  return (
    <div>
      <h1>Start React 200!</h1>
      <p>CSS ์ ์šฉํ•˜๊ธฐ</p>
      <PropsDatatype
      String="react"
      Number={200}
      Boolean={1==1}
      Array={[0, 1, 8]}
      ObjectJson={{react:"๋ฆฌ์•กํŠธ", twohundred:"200"}}
      Function={console.log("FunctionProps: function!")}
      />
    </div>
  );
}

export default App;

 

 

 

2. PropsDataType ํŒŒ์ผ ์ž‘์„ฑํ•˜๊ธฐ

 

import React, { Component } from 'react'
import datatype from 'prop-types';

class R018_PropsDatatype extends Component {
    render() {
        let {
            String, Number, Boolean, Array, ObjectJson, Function
        } = this.props;
        return (
            <div style={{padding: "0px"}}>
                <p>StringProps: {String}</p>
                <p>NumberProps: {Number}</p>
                <p>BooleanProps: {Boolean.toString()}</p>
                <p>ArrayProps: {Array.toString()}</p>
                <p>Object JsonProps: {JSON.stringify(ObjectJson)}</p>
                <p>FunctionProps: {Function}</p>
            </div>
        )
    }
}

// props ์ž๋ฃŒํ˜• ์„ ์–ธ
R018_PropsDatatype.propTypes = {
    String: datatype.string,
    Number: datatype.number,
    Boolean: datatype.bool,
    Array: datatype.array,
    ObjectJson: datatype.object,
    Function: datatype.func,
}

export default R018_PropsDatatype;

 

 

๋งŒ์•ฝ props type ์„ ์–ธ๊ณผ ์ž…๋ ฅ๋˜๋Š” props ํƒ€์ž…์ด ๋‹ค๋ฅผ ๊ฒฝ์šฐ์— warning ๋ฉ”์„ธ์ง€๊ฐ€ ์ฝ˜์†”์— ๋œฌ๋‹ค.

 

 

 

 

2. React props ๊ฐ์ฒดํ˜•์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ

 

 

 

1. App.js ์ˆ˜์ •ํ•˜๊ธฐ

 

import './App.css';
import PropsBoolean from './R019_PropsBoolean';

function App() {
  return (
    <div>
      <h1>Start React 200!</h1>
      <p>CSS ์ ์šฉํ•˜๊ธฐ</p>
      <PropsBoolean BooleanTrueFalse={false} />
      <PropsBoolean BooleanTrueFalse />{/* default true */}
    </div>
  );
}

export default App;

 

 

2. Prop ํŒŒ์ผ ์ž‘์„ฑํ•˜๊ธฐ

 

import React, { Component } from 'react'

class R019_PropsBoolean extends Component {
    render() {
        let {
            BooleanTrueFalse
        } = this.props
        return (
            <div style={{padding: "0px"}}>
                {BooleanTrueFalse ? '2. ' : '1. '}
                {BooleanTrueFalse.toString()}
            </div>
        )
    }
}

export default R019_PropsBoolean;

 

 

 

3. ์›น ์‹คํ–‰

 

 

 

๐Ÿณ React ์—์„œ ์ƒ๋ช…์ฃผ๊ธฐ๋ž€?

 

Component์˜ ์ƒ์„ฑ, ๋ณ€๊ฒฝ, ์†Œ๋ฉธ์˜ ๊ณผ์ •์„ ๋œปํ•œ๋‹ค.

์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ ๊ณผ์ • : render(), constructor(), getDerivedStateFormProps(), componentDidMount() 

์ปดํฌ๋„ŒํŠธ ๋ณ€๊ฒฝ ๊ณผ์ • : shouldComponentUpdate()

 

 

 

 

3. React ์ƒ๋ช…์ฃผ๊ธฐ ํ•จ์ˆ˜ render() ์‚ฌ์šฉํ•˜๊ธฐ - ์ƒ์„ฑ

 

1. App.js ์ˆ˜์ •ํ•˜๊ธฐ

 

import './App.css';
import React, { Component } from 'react';

function App() {
  return (
    <div>
      <h1>Start React 200!</h1>
      <p>CSS ์ ์šฉํ•˜๊ธฐ</p>
      <Bpp></Bpp>
      </div>
  );
}

class Bpp extends Component {
  render() {
    console.log('3. render call');
    return (
      <h2>[THIS IS RENDER FUNCTION]</h2>
    );
  }
}

export default App;

 

  • render() ๋Š” return ๋˜๋Š” html ํ˜•์‹์˜ ์ฝ”๋“œ๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค.
  • ํ™”๋ฉด ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•  ์‹œ์ ์— ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค.

 

 

 

4. React ์ƒ๋ช…์ฃผ๊ธฐ ํ•จ์ˆ˜ constructor(props) ์‚ฌ์šฉํ•˜๊ธฐ - ์ƒ์„ฑ

 

 

1. App.js ์ž‘์„ฑํ•˜๊ธฐ

 

import './App.css';
import React, { Component } from 'react';

function App() {
  return (
    <div>
      <h1>Start React 200!</h1>
      <p>CSS ์ ์šฉํ•˜๊ธฐ</p>
      <Bpp tiger="ํ˜ธ๋ž‘์ด" lion="์‚ฌ์ž"></Bpp>  {/* Bpp ์ปดํฌ๋„ŒํŠธ๋กœ tiger, lion ๋ณ€์ˆ˜ ์ „๋‹ฌ */}
    </div>
  );
}

class Bpp extends Component {
  constructor(props){  // ์ƒ๋ช…์ฃผ๊ธฐ ํ•จ์ˆ˜ ์ค‘ ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰๋œ๋‹ค. ์ฒ˜์Œ ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค.
    super(props);
    this.state={};   // ๋ณ€์ˆ˜ props ๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ์‚ฌ์šฉ
    console.log('1. Call');  // ์ฒซ ๋ฒˆ์งธ๋กœ ์‹คํ–‰
  }
  render() {
    console.log(2, this.props.tiger);  // ๋‘ ๋ฒˆ์งธ๋กœ ์‹คํ–‰
    console.log(3, this.props.lion);  // ์„ธ ๋ฒˆ์งธ๋กœ ์‹คํ–‰
    return (
      <div></div>
    );
  }
}

export default App;

 

 

  • constructor(props) ํ•จ์ˆ˜๋Š” ์ƒ๋ช…์ฃผ๊ธฐ ํ•จ์ˆ˜ ์ค‘ ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰๋˜๊ณ , ์ฒ˜์Œ ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค.

 

 

 

 

 

 

 

5. React ์ƒ๋ช…์ฃผ๊ธฐ ํ•จ์ˆ˜ static getDerivedStateFormProps(props, state) ์‚ฌ์šฉํ•˜๊ธฐ - ์ƒ์„ฑ

 

 

1. App.js ์ž‘์„ฑํ•˜๊ธฐ

 

import './App.css';
import React, { Component } from 'react';

function App() {
  return (
    <div>
      <h1>Start React 200!</h1>
      <p>CSS ์ ์šฉํ•˜๊ธฐ</p>
      <Bpp prop_value='FromApp.js'/>
      </div>
  );
}

class Bpp extends Component {
  static getDerivedStateFromProps(props, state){
    console.log('2. getDerivedStateFromProps Call :'+props.prop_value);
    return {};
  }
  
  constructor(props){
    super(props);
    this.state={};
    console.log('1. constructor Call');
  }

  render() {
    console.log('3. render call');
    return (
      <h2>[THIS IS RENDER FUNCTION]</h2>
    );
  }
}

export default App;

 

  • App function ์—์„œ prop_value ๋ฅผ Bpp ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌํ•œ๋‹ค.
  • Bpp ์ปดํฌ๋„ŒํŠธ์—์„œ getDerivedStateFromProps() ํ•จ์ˆ˜๊ฐ€ constructor() ํ•จ์ˆ˜ ๋‹ค์Œ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒˆ๋กœ์šด props ๋ฅผ ๋ฐ›๊ฒŒ ๋˜์—ˆ์„ ๋•Œ state ๋ฅผ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.
  • props.prop_value ๋กœ App function ์—์„œ ์ „๋‹ฌํ•œ prop_value ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•ด์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

6. React ์ƒ๋ช…์ฃผ๊ธฐ ํ•จ์ˆ˜ componentDidMount() ์‚ฌ์šฉํ•˜๊ธฐ - ์ƒ์„ฑ

 

 

1. App.js ์ž‘์„ฑํ•˜๊ธฐ

 

import './App.css';
import React, { Component } from 'react';

function App() {
  return (
    <div>
      <h1>Start React 200!</h1>
      <p>CSS ์ ์šฉํ•˜๊ธฐ</p>
      <Bpp prop_value='FromApp.js'/>
      </div>
  );
}

class Bpp extends Component {
  static getDerivedStateFromProps(props, state){
    console.log('2. getDerivedStateFromProps Call :'+props.prop_value);
    return {tmp_state:props.prop_value};
  }
  
  constructor(props){
    super(props);
    this.state={};
    console.log('1. constructor Call');
  }

  componentDidMount(){
    console.log('4. componentDidMount Call');
    console.log('5. tmp_state: '+this.state.tmp_state);
  }
  
  render() {
    console.log('3. render call');
    return (
      <h2>[THIS IS COMPONENTDIDMOUNT FUNCTION]</h2>
    );
  }
}

export default App;

 

  • componentDidMount() ํ•จ์ˆ˜๋Š” ์ƒ์„ฑ ๋‹จ๊ณ„์˜ ์ƒ๋ช…์ฃผ๊ธฐ ํ•จ์ˆ˜ ์ค‘ (์ž‘์„ฑํ•œ ํ•จ์ˆ˜๋“ค ์ค‘) ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.
  • render() ํ•จ์ˆ˜๊ฐ€ return ๋˜๋Š” html ํ˜•์‹์˜ ์ฝ”๋“œ๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ ค์ค€ ํ›„ ์‹คํ–‰๋˜๋ฉฐ, ํ™”๋ฉด์ด ๋ชจ๋‘ ๊ทธ๋ ค์ง„ ํ›„์— ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋‚˜ ์ดˆ๊ธฐํ™” ๋“ฑ์— ๊ฐ€์žฅ ๋งŽ์ด ํ™œ์šฉ๋˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

 

 

 

 

7. React ์ƒ๋ช…์ฃผ๊ธฐ ํ•จ์ˆ˜ shouldComponentUpdate() ์‚ฌ์šฉํ•˜๊ธฐ - ๋ณ€๊ฒฝ

 

 

1. App.js ์ž‘์„ฑํ•˜๊ธฐ

 

import './App.css';
import React, { Component } from 'react';

function App() {
  return (
    <div>
      <h1>Start React 200!</h1>
      <p>CSS ์ ์šฉํ•˜๊ธฐ</p>
      <Bpp prop_value='FromApp.js'/>
      </div>
  );
}

class Bpp extends Component {
  static getDerivedStateFromProps(props, state){
    console.log('2. getDerivedStateFromProps Call :'+props.prop_value);
    return {tmp_state:props.prop_value};
  }
  constructor(props){
    super(props);
    this.state={};
    console.log('1. constructor Call');
  }

  componentDidMount(){
    console.log('4. componentDidMount Call');
    console.log('5. tmp_state: '+this.state.tmp_state);
    this.setState({tmp_state2 : true});
  }

  shouldComponentUpdate(props, state){
    console.log('6. shouldComponentUpdate Call  / tmp_state2 = ' + state.tmp_state2);
    return state.tmp_state2;
  }

  render() {
    console.log('3. render call');
    return (
      <h2>[THIS IS shouldComponentUpdate FUNCTION]</h2>
    );
  }
}

export default App;

 

  • props, state ์˜ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋ณ€๊ฒฝ ๋‹จ๊ณ„์˜ ์ƒ๋ช…์ฃผ๊ธฐ ํ•จ์ˆ˜์ธ shouldComponentUpdate() ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
  • setState() ํ•จ์ˆ˜๋กœ tmp_state2 ๋ณ€์ˆ˜์— true ๋ผ๋Š” boolean ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์„ธํŒ…ํ–ˆ๋‹ค.
  • setState() ํ•จ์ˆ˜๋Š” ๋ณ€์ˆ˜์˜ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•œ๋‹ค.
  • componentDidMount() ๊ฐ€ ์ƒ์„ฑ ๋‹จ๊ณ„์˜ ์ƒ๋ช…์ฃผ๊ธฐ ํ•จ์ˆ˜ ์ค‘ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹คํ–‰๋˜๋Š”๋ฐ componentDidMount() ํ•จ์ˆ˜์—์„œ tmp_state2 ๋ณ€์ˆ˜์˜ state ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๋‹ค์Œ์œผ๋กœ ๋ณ€๊ฒฝ ๋‹จ๊ณ„์˜ ์ƒ๋ช…์ฃผ๊ธฐ ํ•จ์ˆ˜์ธ shouldComponentUpdate() ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
  • shouldComponentUpdate() ๊ฐ€ ์‹คํ–‰๋˜์–ด์„œ boolean ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  return ๊ฐ’์ด true ์ผ ๋•Œ render() ํ•จ์ˆ˜๋ฅผ ํ•œ๋ฒˆ ๋” ํ˜ธ์ถœํ•œ๋‹ค.
  • shouldComponentUpdate() ์˜ ๋ฐ˜ํ™˜ ๊ฐ’์— ๋”ฐ๋ผ render() ํ•จ์ˆ˜๋ฅผ ์žฌ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. (๋ฆฌํ„ด๊ฐ’์ด false ์ผ ๊ฒฝ์šฐ render() ์žฌ์‹คํ–‰์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.)

 

 

 

 

 

*์ฐธ๊ณ  : ๋ณธ ํฌ์ŠคํŒ…์€ ๋„์„œ [์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ ๋ฆฌ์•กํŠธ 200์ œ] ๋กœ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ด๋‹ค.

๋Œ“๊ธ€