Props์™€ State

Dev.Jayยท2021๋…„ 7์›” 21์ผ
1

React

๋ชฉ๋ก ๋ณด๊ธฐ
3/3
post-thumbnail

๋ชฉ์ฐจ

  1. Props
  2. State
  3. ์š”์•ฝ

Props

  • properties์˜ ์ค„์ž„๋ง๋กœ, ์ปดํฌ๋„ŒํŠธ ์†์„ฑ์„ ์„ค์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์š”์†Œ์ด๋‹ค.

  • props์˜ ๊ฐ’์€ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ณผ์ •์—์„œ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์„ค์ •ํ•˜๋Š” ๊ฐ’.
    • ์ปดํฌ๋„ŒํŠธ ์ž์‹ ์€ ํ•ด๋‹น props๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • props๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ๋ถ€๋ชจ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ”๊พธ์–ด ์ค˜์•ผํ•œ๋‹ค.
  • props ๊ฐ’์€ ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„ ์™€์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Examples.js (ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ ์ด์šฉ)

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

class Examples extends Component {
  // ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ defaultProps์™€ propTypes ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•.
  static defaultProps = {
    name: '๊ธฐ๋ณธ ์ด๋ฆ„',
  };

  static propTypes = {
    name: PropTypes.string,
    favoriteNumber: PropTypes.number.isRequired,
  };
  render() {
    const { name, children, favoriteNumber } = this.props;
    return (
      <div>
        ์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ด๋ฆ„์€ {name} ์ž…๋‹ˆ๋‹ค. <br />
        children ๊ฐ’์€ {children} ์ž…๋‹ˆ๋‹ค. <br />
        ์ œ๊ฐ€ ์ข‹์•„ํ•˜๋Š” ์ˆซ์ž๋Š” {favoriteNumber} ์ž…๋‹ˆ๋‹ค.
      </div>
    );
  }
}
//  ํด๋ž˜์Šค ๋ฐ–์—์„œ defaultProps ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•.
// 
// Examples.defaultProps = {
//   name: '๊ธฐ๋ณธ ์ด๋ฆ„',
// };

// Examples.propTypes = {
//   name: PropTypes.string,
//   favoriteNumber: PropTypes.number.isRequired,
// };
export default Examples;

Example.js (ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ)

import React from 'react';
import PropTypes from 'prop-types';

const Example = ({ name, children, favoriteNumber }) => { 
  return (
    <div>
      ์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ด๋ฆ„์€ {name} ์ž…๋‹ˆ๋‹ค. <br />
      children ๊ฐ’์€ {children} ์ž…๋‹ˆ๋‹ค. <br />
      ์ œ๊ฐ€ ์ข‹์•„ํ•˜๋Š” ์ˆซ์ž๋Š” {favoriteNumber} ์ž…๋‹ˆ๋‹ค.
    </div>
  );
};

Example.defaultProps = {
  name: '๊ธฐ๋ณธ ์ด๋ฆ„',
};

Example.propTypes = {
  name: PropTypes.string,
  favoriteNumber: PropTypes.number.isRequired,
};

export default Example;
  • defaultProps : props ๊ฐ’์„ ๋”ฐ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์•˜์„ ๋•Œ ๋ณด์—ฌ ์ค„ ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •ํ•˜๋Š” ๋…€์„
  • children : ์ปดํฌ๋„ŒํŠธ ํƒœ๊ทธ ์‚ฌ์ด์˜ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ฃผ๋Š” props

App.js

import React from 'react';
import Example from './Example';

const App = () => {
	return 
  	<>
       <MyComponent name="React" favoriteNumber={3}>
        ๋ฆฌ์•กํŠธ
      </MyComponent>
      <hr />
      <MyComponents name="react" favoriteNumber={7}>
        ๋ฆฌ์—‘ํŠธ
      </MyComponents>
  	</>
};

export default App;
  • ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น

    ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด props ๊ฐ’์„ ์กฐํšŒํ•  ๋•Œ๋งˆ๋‹ค, props.name, props.children์ฒ˜๋Ÿผ props. ์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์ฃผ๊ณ  ์žˆ๋‹ค.

import React from 'react';

const Example = props => {
	return ( 
		<div>
			์•ˆ๋…•ํ•˜์„ธ์š” {props.name} ์ž…๋‹ˆ๋‹ค. <br/>
			children ๊ฐ’์€ {props.children} ์ž…๋‹ˆ๋‹ค. 
		</div>
	)
}

export default Example;

์ด๋ฅผ ๋” ํŽธํ•˜๊ฒŒ ํ•˜๊ธฐ์œ„ํ•ด์„œ ES6์˜ ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•ด์„œ ๋‚ด๋ถ€ ๊ฐ’์„ ๋ฐ”๋กœ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

import React from 'react';

const Example = props => {
	const {name, children} = props;
	return (
		<div>
			์•ˆ๋…•ํ•˜์„ธ์š” {name} ์ž…๋‹ˆ๋‹ค. <br/>
			children ๊ฐ’์€ {children} ์ž…๋‹ˆ๋‹ค. 
		</div>
	)
}

export default Example;

์ด๋ฅผ ๋”์šฑ ๊ฐ„์†Œํ™” ํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

import React from 'react';

const Example = ({name, children}) => {
	return (
		<div>
			์•ˆ๋…•ํ•˜์„ธ์š” {name} ์ž…๋‹ˆ๋‹ค. <br/>
			children ๊ฐ’์€ {children} ์ž…๋‹ˆ๋‹ค. 
		</div>
	)
}

export default Example;

์ด์ฒ˜๋Ÿผ, ๊ฐ์ฒด์—์„œ ๊ฐ’์„ ์ถ”์ถœํ•˜๋Š” ๋ฌธ๋ฒ•์„ ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น (destructuring assignment) ๋ผ๊ณ  ํ•œ๋‹ค.

ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ถ€๋ถ„์—์„œ๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋ฉฐ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๊ฐ์ฒด์ผ ๊ฒฝ์šฐ, ๊ทธ ๊ฐ’์„ ๋ฐ”๋กœ ๋น„๊ตฌ์กฐํ™” ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Props ๊ฒ€์ฆ

    ์ปดํฌ๋„ŒํŠธ์˜ ํ•„์ˆ˜ props๋ฅผ ์ง€์ •ํ•˜๊ฑฐ๋‚˜, props ํƒ€์ž…์„ ์ง€์ •ํ•  ๋•Œ๋Š” propTypes๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    ์šฐ์„  ๋ชจ๋“ˆ prop-types๋ฅผ ์„ค์น˜ํ•ด์ฃผ์ž.

    $ yarn add prop-types

    ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ด์ฃผ๋ฉด, name์˜ ๊ฐ’์€ ๋ฌด์กฐ๊ฑด ๋ฌธ์žํ˜ˆ ํ˜•ํƒœ๋กœ ์ „๋‹ฌ๋˜์•ผ ํ•œ๋‹ค.

    • propTypes๋ฅผ import ํ•ด์ฃผ๊ณ  ์ปดํฌ๋„ŒํŠธ์˜ propTypes๋ฅผ ์ง€์ •ํ•ด๋ณด์ž.
    import React from 'react';
    import PropTypes from 'prop-types';
    
    const Example = ({name, children}) => {
    	return (...); // ์ƒ๋žต
    }
    
    Example.propTypes = {
    	name: PropTypes.string
    };
    
    export default Example;

    propTypes๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์•˜์„ ๋•Œ ๊ฒฝ๊ณ ๋ฉ”์„ธ์ง€๋ฅผ ์ฃผ๋ ค๋ฉด propTypes ๋’ค์— isRequired๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค.

    import React from 'react';
    import PropTypes from 'prop-types';
    
    const Example = ({name, children, favNumber}) => {
    	return 
    	<div>
    		(...) // ์ƒ๋žต
    		์ œ๊ฐ€ ์ข‹์•„ํ•˜๋Š” ์ˆซ์ž๋Š” {favNumber} ์ž…๋‹ˆ๋‹ค.
    	</div>
    }
    
    Example.propTypes = {
    	name: PropTypes.string
    	favNumber: PropTypes.number.isRequired
    };
    
    export default Example;

    name์— ๋ฌธ์ž์—ด ์ด์™ธ์˜ ํƒ€์ž…์ด ์ „๋‹ฌ๋˜๊ฑฐ๋‚˜ favNumber์— propType๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ฝ˜์†”์—์„œ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

    ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ์˜ ํ™œ์šฉ์€ ์ƒ๋žตํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

    • PropTypes์™€ defaultProps ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ํ•„์ˆ˜ ์‚ฌํ•ญ์€ ์•„๋‹ˆ์ง€๋งŒ, ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์‹œ ํ˜‘์—…์„ ํ•œ๋‹ค๋ฉด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์— ์–ด๋–ค props๊ฐ€ ํ•„์š”ํ•œ ์ง€ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ์–ด ํšจ์œจ์ ์ผ ๊ฒƒ์ด๋‹ค !

State

  • state๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋ฐ”๋€”์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค.
  • state๋Š” ๋‘๊ฐ€์ง€์˜ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.
    1. ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์ง€๋Š” state
    2. ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ useState ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•˜๋Š” state
  • ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์ง€๋Š” state

    import React, { Component } from 'react';
    
    class Counter extends Component {
         constructor(props) {
         super(props);
           
         this.state = {
           number: 0,
           fixedNumber: 0,
         };
       }

    ๋‹ค์Œ๊ณผ ๊ฐ™์ด constructor์„ ์‚ฌ์šฉํ•ด์„œ state์˜ ์ดˆ๊ธฐ๊ฐ’์„ ์ง€์ •ํ•ด์ค€๋‹ค.

    • ์ปดํฌ๋„ŒํŠธ์— state๋ฅผ ์„ค์ •ํ•  ๋•Œ, constructor ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์„ค์ •ํ•ด์ค€๋‹ค.
    • constructor๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ super(props)๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ์ž.
      • super(props) ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ, ํ˜„์žฌ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์ธ Counter ์ปดํฌ๋„ŒํŠธ๊ฐ€, ์ƒ์†๋ฐ›๊ณ  ์žˆ๋Š” ๋ฆฌ์•กํŠธ์˜ ์ปดํฌ๋„ŒํŠธ ํด๋ž˜์Šค๊ฐ€ ์ง€๋‹Œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์ค€๋‹ค.
    • ์ปดํฌ๋„ŒํŠธ์˜ state๋Š” ๊ฐ์ฒดํ˜•์‹์ด๋‹ค.
    • state ๊ฐ์ฒด ์•ˆ์—๋Š” ์—ฌ๋Ÿฌ๊ฐ’์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.
    render() {
        const { number, fixedNumber } = this.state; // state ์กฐํšŒ ์‹œ this.state๋กœ ์กฐํšŒํ•œ๋‹ค.
        return (
          <div>
            <h1>{number}</h1>
            <h2>๋ฐ”๋€Œ์ง€ ์•Š๋Š” ๊ฐ’ : {fixedNumber}</h2>
            <button
              // onClick์„ ํ†ตํ•ด ๋ฒ„ํŠผ์ด ํด๋ฆญ๋˜์—ˆ์„ ๋•Œ ํ˜ธ์ถœํ•  ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค.
              // onClick์€ ๋ฒ„ํŠผ ์•ˆ์— props๋กœ ๋“ค์–ด๊ฐ„๋‹ค. ์ด๊ฒƒ์€ ๋ฒ„ํŠผ์ด ํด๋ฆญ๋  ๋•Œ ํ˜ธ์ถœ์‹œํ‚ฌ ํ•จ์ˆ˜๋ฅผ ์„ค์ •ํ•ด์ค€๋‹ค. => ์ด๊ฒƒ์„ ์ด๋ฒคํŠธ ์„ค์ •์ด๋ผ๊ณ  ํ•œ๋‹ค.
              onClick={() => {
                // ์ด๋ฒคํŠธ ์„ค์ •์€ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฌธ๋ฒ•์œผ๋กœ ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค.
                // this.setState๋ฅผ ์‚ฌ์šฉํ•ด์„œ state์— ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. (state๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค, state ๊ฐ’ ์—…๋ฐ์ดํŠธ)
                this.setState({ number: number + 1 });
                this.setState({ number: this.state.number + 1 });
              }}>
              + 1
            </button>
          </div>
        );
      }

    render ํ•จ์ˆ˜์—์„œ ํ˜„์žฌ state๋ฅผ ์กฐํšŒํ•˜๊ณ , ์ด๋ฒคํŠธ๋ฅผ ์„ค์ •ํ•ด์ฃผ์ž.

    • ํ˜„์žฌ state ์กฐํšŒ ์‹œ this.state ์กฐํšŒ
    • button ๋‚ด๋ถ€ onClick์ด๋ผ๋Š” ๊ฐ’์„ props๋กœ ๋„ฃ์–ด ์ค€๋‹ค.
      • ๋ฒ„ํŠผ์ด ํด๋ฆญ๋  ๋•Œ ํ˜ธ์ถœ์‹œํ‚ฌ ํ•จ์ˆ˜๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. => ์ด๋ฒคํŠธ ์„ค์ •
      • ์ด๋ฒคํŠธ ์„ค์ •ํ•  ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด์ค„๋•Œ๋Š” ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.
    • onClick ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this.setState ํ•จ์ˆ˜๊ฐ€ state ๊ฐ’์„ ๋ฐ”๊ฟ€์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
    • this.setState ํ•จ์ˆ˜๋Š” ์ธ์ž๋กœ ์ „๋‹ฌ๋œ ๊ฐ์ฒด ๋‚ด๋ถ€์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’๋งŒ ๋ฐ”๊พธ์–ด ์ค€๋‹ค.
  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด state๋ฅผ constructor์—์„œ ๊บผ๋‚ด์„œ state ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

    import React, {Component} from 'react';
    
    class Counter extends Component{
    	state ={
    		number: 0,
    		fixedNumber: 0
    	};
    	render() {
    		const {number, fixedNumber} = this.state;
    		return ~~;
    	}
    }
    
    export default Counter;
  • this.setState ์‚ฌ์šฉ ์‹œ, ๊ฐ์ฒด ๋Œ€์‹  ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋„ฃ์–ด์ฃผ๋Š” ๋ฐฉ์‹

    • this.setState์˜ ์ธ์ž๋กœ ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด ์ค„ ๋•Œ ๋‹ค์Œ๊ณผ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค.
    this.setState ((prevState, props) => {
    	return {
    		// ์—…๋ฐ์ดํŠธ ๋‚ด์šฉ
    	}
    });
    • prevState : ๊ธฐ์กด ์ƒํƒœ
    • props : ํ˜„์žฌ ์ง€๋‹ˆ๊ณ  ์žˆ๋Š” props (๋งŒ์•ฝ ์—…๋ฐ์ดํŠธ๊ณผ์ •์—์„œ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋ฉด ์ƒ๋žต ๊ฐ€๋Šฅ)
  • ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์—์„œ ๊ฐ’์„ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” { }์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.

    this.setState(prevState => ({
    	number: prevState.number + 1
    }));
  • this.setState ํ›„์— ํŠน์ • ์ž‘์—… ์‹คํ–‰

    this.setState(
    	{
    		number: number + 1
    	},
    	() => {
    		console.log('setState ํ˜ธ์ถœ๋˜์—ˆ๋‹ค.');
    	}
    )
    • setState ๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ  ๋‚œ ๋’ค, ํŠน์ • ์ž‘์—…์„ ํ•˜๊ณ ์‹ถ์„ ๋•Œ setState์˜ ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ callback ํ•จ์ˆ˜๋ฅผ ๋“ฑ๋กํ•ด์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ state ์‚ฌ์šฉํ•˜๊ธฐ

    • ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” state๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ์ง€๋งŒ, 16.8๋ฒ„์ „ ์ดํ›„๋ถ€ํ„ฐ useState ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ state๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.
    • Hooks๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

    ๋ฐฐ์—ด ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น

    • ๋ฐฐ์—ด ์•ˆ์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’์„ ์‰ฝ๊ฒŒ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•
    const arr = [1, 2];
    const first = arr[0];
    const second = arr[1];

    ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐฐ์—ด arr์— ์žˆ๋Š” ๊ฐ’์„ first, second์— ๋‹ด์•„์ค€๋‹ค.

    ์ด๋ฅผ ์‰ฝ๊ฒŒ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐ์—ด ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น์„ ์‚ฌ์šฉํ•ด๋ณด์ž.

    const arr = [1, 2];
    const [first, second] = arr;

    ๊น”-๋”

useState ์‚ฌ์šฉ

import React, {useState} from 'react';

const Example = () => {
	const[msg, setMsg] = useState('');
	const onClickEnter = () => setMsg('hi !');
	const onClickLeave = () => setMsg('bye ~');
	
	return (
		<div>
      <button onClick={onClickEnter}>enter</button>
      <button onClick={onClickLeave}>leave</button>
      <h2>{msg}</h2>
		</div>
	)
}

export default Example;
  • useState ํ•จ์ˆ˜์˜ ์ธ์ž์—๋Š” ์ƒํƒœ์˜ ์ดˆ๊ธฐ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค.
  • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด [msg, setMsg] ๋ฐฐ์—ด์ด ๋ฐ˜ํ™˜๋œ๋‹ค.
    • ์ฒซ ๋ฒˆ์งธ ์›์†Œ msg๋Š” ํ˜„์žฌ ์ƒํƒœ
    • ๋‘ ๋ฒˆ์งธ ์›์†Œ setMsg๋Š” ์ƒํƒœ๋ฅผ ๋ฐ”๊พธ์–ด์ฃผ๋Š” ํ•จ์ˆ˜ = setter ํ•จ์ˆ˜
  • ๋ฐฐ์—ด ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น์„ ํ†ตํ•ด์„œ ์ž์œ ๋กญ๊ฒŒ ์ด๋ฆ„์„ ์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • State ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

    • state ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๋•Œ๋Š” setState or useState๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋ฐ›์€ setter ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

    • ๋ฐฐ์—ด ํ˜น์€ ๊ฐ์ฒด๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ๋•Œ

      • ๋ฐฐ์—ด ํ˜น์€ ๊ฐ์ฒด์˜ ์‚ฌ๋ณธ์„ ๋งŒ๋“ ๋‹ค
      • ๊ทธ ์‚ฌ๋ณธ์— ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค
      • ์‚ฌ๋ณธ์˜ ์ƒํƒœ๋ฅผ setState ๋˜๋Š” setter ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
      // ๊ฐ์ฒด
      const obj = {a: 1, b: 2, c: 3};
      const afterObj = {...obj, b: 2}; // ์‚ฌ๋ณธ ์ƒ์„ฑ ํ›„ b๊ฐ’๋งŒ ๋ฎ์–ด์“ด๋‹ค. 
      // ... ์€ spread ์—ฐ์‚ฐ์ž์ด๋ฉฐ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์‚ฌ๋ณธ์„ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
      
      // ๋ฐฐ์—ด
      const arr = [
      	{id: 1, value: true},
      	{id: 2, value: false},
      	{id: 3, value: false},
      ];
      
      let nextArr = arr.concat({id:4}); // ์ƒˆ ํ•ญ๋ชฉ ์ถ”๊ฐ€
      nextArr.filter(item => item.id != = 2); // id๊ฐ€ 2์ธ ํ•ญ๋ชฉ ์ œ๊ฑฐ
      nextArr.map(item => (item.id === 1 ? {...item, value: false} : item));
      // id๊ฐ€ 1์ธ ํ•ญ๋ชฉ์˜ value๋ฅผ false๋กœ ์„ค์ •.

์š”์•ฝ

  • props๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์„ค์ •ํ•œ๋‹ค.
  • state๋Š” ์ปดํฌ๋„ŒํŠธ ์ž์ฒด์ ์œผ๋กœ ์ง€๋‹Œ ๊ฐ’์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • props๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ด์„œ ๊ฐ’์ด ๋ฌด์กฐ๊ฑด ๊ณ ์ •์ ์ธ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
    • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ state -> ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ props๋กœ ์ „๋‹ฌ
    • ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ, ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ
    • ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ props๋ฅผ ์œ ๋™์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ, useState๋ฅผ ์‚ฌ์šฉํ•˜์ž.
  • Hooks ์‚ฌ์šฉ์ด ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ ๋ฐฉ์‹์ด ๋ ๊ฒƒ์ด๋‹ค..!

์ถœ์ฒ˜

  • ๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ  - ๊น€๋ฏผ์ค€
profile
๐Ÿ‘€

0๊ฐœ์˜ ๋Œ“๊ธ€