Props & State

๋‚ด์Šนํ˜„ยท2022๋…„ 3์›” 27์ผ
0

๐Ÿ“Œ props
์ปดํฌ๋„ŒํŠธ๋Š”, ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ ํ•˜๋‚˜์˜ 'props' ๊ฐ์ฒด ์ธ์ž๋ฅผ ๋ฐ›์€ ํ›„ React ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋•Œ props๋Š” ์†์„ฑ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ์ดํ„ฐ๋‹ค.

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

๐ŸŒฑ props ์ง€์ •ํ•˜๊ธฐ
props๋Š” <ComponentName prop1={propValue1} prop2={propValue2} ... /> ํ˜•ํƒœ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ€๋ฅผ ๋•Œ ํ•จ๊ป˜ ์ง€์ •ํ•œ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ์—์„œ๋Š” Dog ์ปดํฌ๋„ŒํŠธ์— name prop์™€ age prop๋ฅผ ์ง€์ •ํ•˜์˜€๋‹ค.


์œ„์™€ ๊ฐ™์ด, ๊ฐ™์€ ํƒ€์ž…์˜ ์ปดํฌ๋„ŒํŠธ์— ๋‹ค๋ฅธ props ๊ฐ’์„ ์ฃผ์–ด, ํŒจํ„ด์ด ๋ฐ˜๋ณต๋˜๋Š” ํ˜•ํƒœ๋กœ ์ปดํฌ๋„ŒํŠธ์˜ ํšจ์œจ์ ์ธ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

props์—๋Š” ๋ถˆ๋ฆฌ์–ธ ๊ฐ’(true, false), ์ˆซ์ž, ๋ฐฐ์—ด๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค. ๊ณต๋ฐฑ ๊ตฌ๋ถ„์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋‹ด๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
๐Ÿ’ก props์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ฌธ์ž์—ด์ธ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๋ฉด ๋ชจ๋‘ ์ค‘๊ด„ํ˜ธ({})๋กœ ๊ฐ’์„ ๊ฐ์‹ธ์•ผ ํ•œ๋‹ค.

๐ŸŒฑ props ๋ฐ›์•„ ์‚ฌ์šฉํ•˜๊ธฐ
๐Ÿ’ก props๋Š” ์ฝ๊ธฐ ์ „์šฉ์ด๋ฏ€๋กœ ์ปดํฌ๋„ŒํŠธ์˜ ๋‚ด๋ถ€์—์„œ props๋ฅผ ์ˆ˜์ •ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. ์ž…๋ ฅ๊ฐ’์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋ฅผ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ผ๊ณ  ํ˜ธ์นญํ•˜๋ฉฐ, ๋ชจ๋“  React ์ปดํฌ๋„ŒํŠธ๋Š” ์ž์‹ ์˜ props๋ฅผ ๋‹ค๋ฃฐ ๋•Œ, ์ˆœ์ˆ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋™์ž‘ํ•ด์•ผํ•œ๋‹ค.

props๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์— ์ธ์ž๋ฅผ ์ •์˜ํ•˜๋ฉด, props๋ฅผ ์†์„ฑ์œผ๋กœ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด Object๊ฐ€ ํ•ด๋‹น ์ธ์ž๋กœ ์ „๋‹ฌ๋œ๋‹ค. ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ ์‹œ, ๊ฐ์ฒด์— ์กด์žฌํ•˜๋Š” ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋“ฏ ์  ์—ฐ์‚ฐ์ž(.)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” props๋ฅผ ๊บผ๋‚ด ์“ธ ์ˆ˜ ์žˆ๊ณ , ์ด๋ฅผ ์ค‘๊ด„ํ˜ธ๋กœ ๊ฐ์‹ธ { [์ธ์ž ์ด๋ฆ„].[props ์ด๋ฆ„] } ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

// ๊ฐ์ฒด ์ธ์ž๋ฅผ ํ†ตํ•ด props ๋ฐ›์•„์˜ค๊ธฐ
function Dog(props) {
return {

	<div>{props.name}</div>
	<div>{props.age}</div>
}

}
props๋ฅผ ๋ฐ›์„ ๋•Œ, ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น์„ ์‚ฌ์šฉํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์ด ์  ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

'prop-types' ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ์˜ ํŠน๋ณ„ํ•œ ํ”„๋กœํผํ‹ฐ์ธ propTypes๋ฅผ ์„ ์–ธํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐ›์€ props์˜ ํƒ€์ž…์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜, defaultProps ํ”„๋กœํผํ‹ฐ๋ฅผ ํ• ๋‹นํ•˜์—ฌ props์˜ ์ดˆ๊ธฐ๊ฐ’์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
Typechecking with Proptypes - React Docs

// ๊ฐ์ฒด ์ธ์ž๋ฅผ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹นํ•˜์—ฌ props ๋ฐ›์•„์˜ค๊ธฐ
function Dog({ name, age }) {
return {

	<div>{name}</div>
	<div>{age}</div>
}

}

// ์ปดํฌ๋„ŒํŠธ props ์ดˆ๊ธฐ๊ฐ’ ์ง€์ •

Dog.defaultProps = {,
	name: '์ด๋ฆ„',
    age: 0,
}
// ์ปดํฌ๋„ŒํŠธ props ํƒ€์ž… ํ™•์ธ
Dog.propsTypes = {,
	name: PropTypes.string.isRequired,
    age: PropTypes.number,
}

ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ props๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” this.props๋กœ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉํ•œ๋‹ค. ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ propTypes๋‚˜ defaultProps๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š”, ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

// ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ props ์‚ฌ์šฉํ•˜๊ธฐ

class Dog extends React.Component {
	static defaultProps = { ... };	// ์ปดํฌ๋„ŒํŠธ props ์ดˆ๊ธฐ๊ฐ’ ์ง€์ •
	static propTypes = { ... };	// ์ปดํฌ๋„ŒํŠธ props ํƒ€์ž… ํ™•์ธ
	render() {
		// ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น์œผ๋กœ props ์‚ฌ์šฉ
		const { name, age } = this.props;	
		return <div>{name}</div>;
    }
}

๐Ÿ“Œ state
state๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์˜ ๋™์  ๋ฐ์ดํ„ฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. props๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์„ค์ •ํ•˜๋Š” ๊ฐ’์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ์ž์‹ ์€ props๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

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

์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž์‹์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์œผ๊ฑฐ๋‚˜ ๋‘ ๊ฐœ์˜ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์„œ๋กœ ํ†ต์‹ ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์กฐ์ƒ ์ปดํฌ๋„ŒํŠธ์— state๋ฅผ ์ •์˜ํ•œ๋‹ค. ์กฐ์ƒ ์ปดํฌ๋„ŒํŠธ๊ฐ€ props๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— state๋ฅผ ๋‹ค์‹œ ์ „๋‹ฌํ•จ์œผ๋กœ ์„œ๋กœ ๋™๊ธฐํ™”ํ•œ๋‹ค.
๋‘ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ state ๊ฐ’์„ ๋™๊ธฐํ™”ํ•˜๋Š” ์ผ, state๋ฅผ ๊ณต์œ ํ•˜๋Š” ์ผ์€, ๊ทธ state ๊ฐ’์„ ํ•„์š”๋กœ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณตํ†ต ์กฐ์ƒ ์ปดํฌ๋„ŒํŠธ๋กœ state๋ฅผ ๋Œ์–ด์˜ฌ๋ฆผ์œผ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค. ๐Ÿ‘‰ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ state๋ฅผ ๋™๊ธฐํ™”์‹œํ‚ค๊ธฐ๋ณด๋‹ค, ๊ณตํ†ต ์กฐ์ƒ์œผ๋กœ ๋Œ์–ด์˜ฌ๋ ค ํ•˜ํ–ฅ์‹ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ด์šฉํ•˜์ž.
Lifting State Up - React Docs
The Data Flows Down - React Docs

๐ŸŒฑ Class Component์—์„œ state ์‚ฌ์šฉํ•˜๊ธฐ

ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ state๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๊ฐ์ฒด ํ˜•์‹์˜ this.state๋ฅผ ํ†ตํ•ด state ๊ฐ์ฒด์˜ ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•˜๊ณ , ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
state ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ, this.setState๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

class ClassExample extends React.Component {
  constructor(props) {
    super(props);
    // state ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •
    this.state = {
      count: 0,
    };
  }

  render() {
    const { count } = this.state;		// state ์กฐํšŒ
      return (
        <div>
          <p>You clicked {count} times</p>
          <button onClick={() => {
            this.setState({		// this.setState๋ฅผ ํ†ตํ•ด state ์—…๋ฐ์ดํŠธ
              count: count + 1
            });
          }}>
            Click me
          </button>
        </div>
      );
    }
  }
}

๐ŸŒฑ Function Component์—์„œ state ์‚ฌ์šฉํ•˜๊ธฐ
Hook์ด React ๋ฒ„์ „ 16.8์— ์ƒˆ๋กœ ์ถ”๊ฐ€๋˜๋ฉด์„œ, Function Component์—์„œ๋„ ์ƒํƒœ ๊ฐ’๊ณผ ์—ฌ๋Ÿฌ React์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ state๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” useState Hook์€ ๋”ฐ๋กœ ์ •๋ฆฌํ•œ๋‹ค.

profile
์•„ํ† ์–ธ๋‹ˆ์˜ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ์„œ์˜ ๊ธฐ๋ก

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