Component?๐Ÿš€

miniยท6์ผ ์ „
1
post-thumbnail

Component ๊ธฐ๋ฐ˜์˜ ๊ตฌ์กฐ์ด๋ฉฐ, ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ Component ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ณ  ํ•˜๋‚˜์˜ Component ๋˜ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Component ์กฐํ•ฉ์œผ๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค.
์ด๋Ÿฌํ•œ Component๋“ค์„ ๋งˆ์น˜ ๋ ˆ๊ณ  ๋ธ”๋ก์„ ์กฐ๋ฆฝํ•˜๋“ฏ ๋ผ์›Œ ๋งž์ถฐ ์ƒˆ๋กœ์šด Component ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
Componentย : ์ž…๋ ฅ(props)์„ ๋ฐ›์•„ ์ถœ๋ ฅ(Element) ํ•˜๋Š” ์—ญํ• 

React Component๋Š” ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค.

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ (Function Component)
ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ (Class Component)

โ€ปํ˜„์žฌ๋Š” ํ•จ์ˆ˜ํ˜•์„ ๋งŽ์ด ์“ฐ์ง€๋งŒ ๊ทธ๋ž˜๋„ ํด๋ž˜์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€๋Š” ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜๋‹ˆ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค.

1. ๐Ÿ›ฌํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ (Class Component)

ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ Class Component
React์˜ ์ดˆ๊ธฐ ๋ฒ„์ „์—์„œ ์‚ฌ์šฉ๋˜๋˜ ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ ๋ฐฉ๋ฒ•
ES6 ํด๋ž˜์Šค ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ •์˜ํ•˜๊ณ , React์—์„œ ์ œ๊ณตํ•˜๋Š” render() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด UI๋ฅผ ๋ Œ๋”๋ง ํ•œ๋‹ค.
์žฅ์ ์œผ๋กœ๋Š” ์ƒํƒœ(state)์™€ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ•˜์ง€๋งŒ React 16.8์—์„œ ํ›…(Hooks)์ด ๋„์ž…๋œ ์ดํ›„๋กœ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ(Function Component๊ฐ€ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
์˜ˆ์ „ ์ฝ”๋“œ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋Š” ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ์•„์ง ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์œผ๋‹ˆ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ดํ•ด๋Š” ํ•˜๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

ํŠน์ง•

  • ์ƒํƒœ ๊ด€๋ฆฌ: ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” this.state๋ฅผ ์‚ฌ์šฉ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌ
  • ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ: ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ(๋งˆ์šดํŠธ, ์–ธ๋งˆ์šดํŠธ, ์—…๋ฐ์ดํŠธ ๋“ฑ)๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • render() ๋ฉ”์„œ๋“œ: React.Component์˜ ํ•˜์œ„ class์—์„œ ๋ฐ˜๋“œ์‹œ ์ •์˜ํ•ด์•ผ ํ•˜๋Š” ๋ฉ”์„œ๋“œ
  • ๊ณ ์ •์ : ์ปดํฌ๋„ŒํŠธ ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•˜๋Š”๊ฒŒ ์•„๋‹Œ ํ•ฉ์„ฑ์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•ฉ

์ƒํƒœ ๊ด€๋ฆฌ (this.state์™€ this.setState)
์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด, ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž(constructor)์—์„œ this.state๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ๋Š” this.setState() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ

import React, { Component } from 'react';

class Counter extends Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0,
    };
  }

  plus = () => {
    this.setState({ count: this.state.count + 1 });
  }

  minus = () => {
    this.setState({ count: this.state.count - 1 });
  }

  render() {
    return (
      <div>
        <button onClick={this.plus}>+1</button>
        <button onClick={this.minus}>-1</button>
		<p>Count: {this.state.count}</p>
      </div>
    );
  }
}

export default Counter;
  • this.state๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๊ณ  this.setState()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ๋œ๋‹ค.
  • setState()๋Š” ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋ง ๋œ๋‹ค.

2. ๐Ÿ›ซํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ (Function Component)

React 16.8๋ถ€ํ„ฐ Hooks๊ฐ€ ๋„์ž…๋˜๋ฉด์„œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
์ƒํƒœ(state)๋‚˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ(lifecycle methods)๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด useState, useEffect ๋“ฑ์˜ ํ›…์„ ์‚ฌ์šฉ์žˆ๋‹ค.
์ด ๋ฐฉ์‹์€ JavaScript ํ•จ์ˆ˜๋กœ ์ž‘์„ฑ UI๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
React 16.8์ด์ „์—๋Š” ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ์ง€๋งŒ, ํ˜„์žฌ๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ›จ์”ฌ ๋” ์„ ํ˜ธ๋˜๊ณ  ์žˆ๋‹ค.

ํŠน์ง•

1)๋‹จ์ˆœํ•จ: ํ•จ์ˆ˜ํ˜•์ด ํด๋ž˜์Šคํ˜•๋ณด๋‹ค ์ฝ์‹œ ์‰ฝ๊ณ  ๊ฐ„๊ฒฐ
2)์ƒํƒœ์™€ ์ดํŽ™ํŠธ ๊ด€๋ฆฌ: useState, useEffect์™€ ๊ฐ™์€ React ํ›…(Hook)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ ๊ด€๋ฆฌ์™€ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ
3)์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ์„ฑ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ์™€ ์‰ฝ๊ฒŒ ๊ฒฐํ•ฉ ๋ฐ ์žฌ์‚ฌ์šฉ์— ์šฉ์ด

์žฅ์ 

๊ฐ„๊ฒฐ์„ฑ: ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฌ์šฐ๋ฉฐ, ์‹œ๊ฐ„ ๋‹จ์ถ• ๋ฐ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ด.
์„ฑ๋Šฅ: ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ตœ์ ํ™”
Hooks๋ฅผ ํ†ตํ•œ ๊ธฐ๋Šฅ ํ™•์žฅ: useState, useEffect, useContext, useReducer ๋“ฑ ๋‹ค์–‘ํ•œ ํ›…์„ ํ†ตํ•ด ์ƒํƒœ ๊ด€๋ฆฌ, ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ์ฒ˜๋ฆฌ, ๋ฐ์ดํ„ฐ ๊ณต์œ , ๋“ฑ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

Hooks์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ๊ณ  ์‹ถ์œผ๋ฉด ์•„๋ž˜ ์ฐธ๊ณ 


๐Ÿ’บComponent ์ฃผ์˜์‚ฌํ•ญ

1.์ด๋ฆ„๊ทœ์น™

  • ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š”๊ฒƒ์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ DOMํƒœ๊ทธ๋กœ ์ธ์‹ํ•˜๊ธฐ ๋–„๋ฌธ์— ํ•ญ์ƒ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘

์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋ฉด html div ํƒœ๊ทธ๋กœ ์ธ์‹

const element = <div/>;

Welcome ์ด๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ ๋Œ€๋ฌธ์ž๋กœ ํ•˜์—ฌ๊ธˆ ๋ฆฌ์•กํŠธ Component๋กœ ์ธ์‹

cosnt element = <Welcome name="ํ™๊ธธ๋™"/>

2.JSX ๋‚ด ์ค‘๊ด„ํ˜ธ{} ์‚ฌ์šฉ

  • JavaScript ์ฝ”๋“œ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ค‘๊ด„ํ˜ธ {}๋ฅผ ์‚ฌ์šฉ
const name = 'mini';
return <h1>Hello, {name}!</h1>;  // "Hello, mini" ์ถœ๋ ฅ

3.์ƒํƒœ(state) ๋ณ€๊ฒฝ์€ ๋น„๋™๊ธฐ์ 

  • ์ƒํƒœ๊ฐ€ ์ฆ‰์‹œ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ƒํƒœ ๋ณ€๊ฒฝ ํ›„ ๋ฐ”๋กœ ์ƒํƒœ๋ฅผ ์ฝ์„ ๋•Œ๋Š” ์˜ˆ์ƒํ•œ ๊ฐ’์ด ์•„๋‹ ์ˆ˜ ์žˆ๋‹ค.
  • ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์—ฐ์†์ ์œผ๋กœ ํ•  ๋•Œ๋Š” ํ•จ์ˆ˜ํ˜• setState๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

4.์ปดํฌ๋„ŒํŠธ๋Š” ๋‹จ์ผ

  • ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ์ž…๋ ฅ๊ฐ’(props)์— ์˜ํ•ด์„œ๋งŒ ๊ฒฐ์ •๋œ ์ถœ๋ ฅ๊ฐ’(JSX)์„ ๋ฐ˜ํ™˜
    ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ง์ ‘ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€์— ์˜์กด์ ์ธ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค์–ด, ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์™ธ๋ถ€ ๋ณ€์ˆ˜๋‚˜ API ํ˜ธ์ถœ์„ ์ง์ ‘ ๋‹ค๋ฃฌ๋‹ค๋ฉด, ์ด๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ˆœ์ˆ˜ํ•˜์ง€ ์•Š๊ฒŒ ๋˜์–ด ๊ฒฐ๊ณผ์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

5.๋ Œ๋”๋ง ์ตœ์ ํ™”

  • ์ƒํƒœ๋‚˜ props๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ๋ฆฌ๋ Œ๋”๋ง์„ ํ•œ๋‹ค. (๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”)

6.Props๋Š” ์ฝ๊ธฐ ์ „์šฉ

  • props๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ „๋‹ฌ๋œ ๊ฐ’์ด๋ฏ€๋กœ, ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ง์ ‘ ์ˆ˜์ •ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
    props๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋ฉด ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ , ๊ทธ์— ๋”ฐ๋ผ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋œ props๋ฅผ ๋ฐ›๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

7.๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง ์‹œ key ์‚ฌ์šฉ

  • ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์„ ๋ Œ๋”๋งํ•  ๋•Œ๋Š” ๊ฐ ํ•ญ๋ชฉ์— ๊ณ ์œ ํ•œ key ๊ฐ’์„ ์ง€์ •
  • key๊ฐ€ ์—†์œผ๋ฉด ๋ฆฌ๋ Œ๋”๋ง ์‹œ React๊ฐ€ ๊ฐ ํ•ญ๋ชฉ์„ ์žฌ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ๋ถˆํ•„์š”ํ•œ ๋น„์šฉ์ด ๋ฐœ์ƒ

8.๋ถˆ๋ณ€์„ฑ ์œ ์ง€

*์ƒํƒœ๋‚˜ props๋Š” ๋ถˆ๋ณ€์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์˜ ์ƒํƒœ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ƒํƒœ๋ฅผ ๋ฐฐ์—ด๋กœ ๋‹ค๋ฃฐ ๋•Œ push() ๋Œ€์‹  concat()์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์ƒํƒœ๊ฐ€ ์ง์ ‘ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๊ธฐ๋–„๋ฌธ

// ๋ถˆ๋ณ€์„ฑ ์œ„๋ฐ˜ (์ž˜๋ชป๋œ)
this.state.items.push(newItem);

// ๋ถˆ๋ณ€์„ฑ ์œ ์ง€ (์˜ฌ๋ฐ”๋ฅธ)
this.setState({ items: [...this.state.items, newItem] });

๐Ÿš€๊ฒฐ๋ก 

React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์œ„์™€ ๊ฐ™์€ ์ฃผ์˜์‚ฌํ•ญ๋“ค์„ ์ง€ํ‚ค๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์„ฑ๋Šฅ ์ตœ์ ํ™”, ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ, ์—๋Ÿฌ ๋ฐฉ์ง€ ๋“ฑ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž˜ ๊ตฌ์กฐํ™”ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ!

  • ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹จ์œ„๋กœ ์ž‘์„ฑํ•˜๋Š”๊ฒŒ ์ œ์ผ ์ข‹๋‹ค.
  • ์žฌ์‚ฌ์šฉ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ๋นจ๋ผ์ง„๋‹ค.

โ€ป ๋ณธ ํฌ์ŠคํŒ…์€ ์ธํ”„๋Ÿฐ ๊ฐ•์˜์™€ ๋ฆฌ์•กํŠธ ํŽ˜์ด์ง€๋ฅผ ๋ณด๋ฉฐ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

profile
ํ•  ์ˆ˜ ์žˆ๋‹ค!

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