[React] Component์™€ props, state

soyiยท2021๋…„ 3์›” 30์ผ
8

React ๋ฆฌ์•กํŠธ

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

๐Ÿš€ Component, props, state


๐Ÿ“Œ Component

  • ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•ด UI๋ฅผ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐœ๋ณ„์ ์ธ ์—ฌ๋Ÿฌ ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.

  • ์ปดํฌ๋„ŒํŠธ๋Š” ๊ฐœ๋…์ ์œผ๋กœ JavaScript ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•˜๋‹ค. 'props'๋ผ๋Š” ์ž…๋ ฅ์„ ๋ฐ›์€ ํ›„, ํ™”๋ฉด์— ์–ด๋–ป๊ฒŒ ํ‘œ์‹œ๋˜๋Š”์ง€ ๊ธฐ์ˆ ํ•˜๋Š” React ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • ์—˜๋ฆฌ๋จผํŠธ๋Š” ์ผ๋ฐ˜ ๊ฐ์ฒด(plain object)๋กœ React ์•ฑ์˜ ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„๋‹ค. ์—˜๋ฆฌ๋จผํŠธ๋Š” ์ปดํฌ๋„ŒํŠธ์˜ '๊ตฌ์„ฑ ์š”์†Œ'๋‹ค.

  • ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐฉ์‹์—๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋‹ค.

๐ŸŒฑ Class Component

	class Welcome extends React.Component {
		render() {
			return <h1>Hello</h1>;
		}
	}
  • ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” React.Component ํด๋ž˜์Šค๋ฅผ ์ƒ์†(์ด๋ฏธ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ํด๋ž˜์Šค์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•จ)๋ฐ›๋Š” ๊ฒƒ์œผ๋กœ ๊ธฐ๋ณธ ํ˜•ํƒœ๋ฅผ ๊ฐ–์ถ˜๋‹ค.

  • ์ปดํฌ๋„ŒํŠธ๋Š” jsx๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผํ•˜๋Š”๋ฐ, ํด๋ž˜์Šค๋Š” return ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” JSX๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด render() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋ฆฌ์•กํŠธ๋Š” ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์˜ render() ํ•จ์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ์‹คํ–‰์‹œํ‚จ๋‹ค.

๐ŸŒฑ Function Component

	function Welcome(props) {
		return <h1>Hello</h1>;
	}
  • ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š”, props๋กœ ๋ฐ›์„ ๊ฐ์ฒด ์ธ์ž๋ฅผ ์ •์˜ํ•˜๊ณ , JSX๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ธฐ๋ณธ ํ˜•ํƒœ๋ฅผ ๊ฐ–์ถ˜๋‹ค.

  • ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” return๋ฌธ์—์„œ JSX๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ props

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

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

๐ŸŒฑ props ์ง€์ •ํ•˜๊ธฐ

  • props๋Š” <ComponentName prop1={propValue1} prop2={propValue2} ... /> ํ˜•ํƒœ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ€๋ฅผ ๋•Œ ํ•จ๊ป˜ ์ง€์ •ํ•œ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ์—์„œ๋Š” Dog ์ปดํฌ๋„ŒํŠธ์— name prop์™€ age prop๋ฅผ ์ง€์ •ํ•˜์˜€๋‹ค.
<Dog name="Ari" age={10} />
<Dog name="Bori" age={7} />
  • ์œ„์™€ ๊ฐ™์ด, ๊ฐ™์€ ํƒ€์ž…์˜ ์ปดํฌ๋„ŒํŠธ์— ๋‹ค๋ฅธ 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์€ ๋”ฐ๋กœ ์ •๋ฆฌํ•œ๋‹ค.



References

profile
ใƒพ(^โ–ฝ^*)))

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