์ƒˆ์†Œ์‹

React

[React] # ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ VS ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ

  • -

๐Ÿ“ข https://daradarav.tistory.com/ ๋กœ ์ด์ „์ค‘์ž…๋‹ˆ๋‹ค. 

 

DaraDaraV

 

daradarav.tistory.com

3์žฅ์—์„œ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉฐ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. ์„ ์–ธ ๋ฐฉ์‹๊ณผ ์ปดํฌ๋„ŒํŠธ์˜ ์ฐจ์ด์™€ props, state ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ฝ”๋“œ์™€ ์„ค๋ช…์€ ๋‹ค์Œ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

https://jiyesmoon.tistory.com/19?category=969102 

 

[React] 03. ์ปดํฌ๋„ŒํŠธ

๐Ÿ“Œ. ์ปดํฌ๋„ŒํŠธ ์•ž์„  ํฌ์ŠคํŠธ์—์„œ ์ปดํฌ๋„ŒํŠธ(component)๋Š” ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ์—์„œ ํŠน์ • ๋ถ€๋ถ„์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ธธ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์„ ์–ธ์ฒด๋ผ๊ณ  ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํด๋ž˜์Šคํ˜• ์ปด

jiyesmoon.tistory.com

 
์ด๋ฒˆ ์ฑ•ํ„ฐ์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ดํ›„ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ์ฐจ์ด๋ฅผ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ ๋ชฉ์ ์— ๋”ฐ๋ผ ๋‚˜๋ˆ„๋Š” ๊ฒฝ์šฐ๋„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ๋ฆฌ์•กํŠธ๋กœ ๋งŒ๋“ค์–ด์ง„ ์•ฑ์„ ์ด๋ฃจ๋Š” ์ตœ์†Œํ•œ์˜ ๋‹จ์œ„
  • UI๋ฅผ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐœ๋ณ„์ ์ธ ์—ฌ๋Ÿฌ ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ๊ฐ ์กฐ๊ฐ์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์Œ
  • ํŠน์ • ๋ถ€๋ถ„์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ธธ์ง€ ์ •ํ•˜๋Š” ์„ ์–ธ์ฒด
  • ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ API, ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ปดํฌ๋„ŒํŠธ ํ•˜๋‚˜์— ์ƒ๊น€์ƒˆ์™€ ์ž‘๋™ ๋ฐฉ์‹์„ ์ •์˜
  • JavaScript ํ•จ์ˆ˜์™€ ์œ ์‚ฌ, "props"๋ผ๊ณ  ํ•˜๋Š” ์ž„์˜์˜ ์ž…๋ ฅ์„ ๋ฐ›๊ณ  ํ•จ์ˆ˜์— ์–ด๋–ป๊ฒŒ ํ‘œ์‹œํ•˜๋Š”์ง€๋ฅผ ์—˜๋ฆฌ๋จผํŠธ์— ๋ฐ˜ํ™˜ํ•จ
  • ์ปดํฌ๋„ŒํŠธ์˜ ์ด๋ฆ„์€ ๋ฐ˜๋“œ์‹œ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘๋จ

 

 

(1) ํ”„๋ ˆ์  ํ…Œ์ด์…”๋„ ์ปดํฌ๋„ŒํŠธ

  • View ๋งŒ์„ ๋‹ด๋‹นํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ
  • ํ”„๋ ˆ์  ํ…Œ์ด์…˜๋„ ์ปดํฌ๋„ŒํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ ์ปดํฌ๋„ŒํŠธ ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • props๋กœ๋งŒ ๋ฐ์ดํ„ฐ๋‚˜ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ
  • state๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ UI์— ๋Œ€ํ•œ state์—ฌ์•ผํ•จ
  • ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋กœ ์ž‘์„ฑ๋จ

(2) ์ปจํ…Œ์ด๋„ˆ ์ปดํฌ๋„ŒํŠธ

  • ๋‹ค๋ฅธ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ์ปดํฌ๋„ŒํŠธ๋‚˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ด€๋ฆฌ
  • ๋‚ด๋ถ€์— DOM ์—˜๋ฆฌ๋จผํŠธ(UI)๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์Œ
  • ์Šคํƒ€์ผ์„ ๊ฐ€์ง€์ง€ ์•Š์Œ, ์Šคํƒ€์ผ์€ ๋ฐ˜๋“œ์‹œ ํ”„๋ ˆ์  ํ…Œ์ด์…”๋„ ์ปดํฌ๋„ŒํŠธ์— ์ž‘์„ฑ๋  ๊ฒƒ

๋ฆฌ์•กํŠธ v16.8 ์—…๋ฐ์ดํŠธ๋กœ Hooks๊ฐ€ ๋„์ž…๋˜์—ˆ๊ณ  ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋„ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์™€ ๊ฐ™์ด ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ ๊ณต์‹ ๋งค๋‰ด์–ผ์—์„œ๋Š” ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ+Hooks๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ „์˜ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋“ค์˜ ์œ ์ง€ ๋ฐ ๋ณด์ˆ˜๋ฅผ ์œ„ํ•˜์—ฌ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋„ ๋ฐ˜๋“œ์‹œ ์•Œ์•„๋‘์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.


(1) ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ

import {Component} from "react";

class App extends Component {
    render() {
        const cType = 'ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ';
        return <div'> {cType} </div>;
    }
}

export default App;
  • ์ž๋ฐ”๋‚˜ ํŒŒ์ด์ฌ ๊ฐ™์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด์˜ class ๋™์ผ
  • class ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•˜๊ณ  React.component๋ฅผ ์ƒ์†ํ•˜์—ฌ exportํ•จ
  • render( ) ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š”, ๋ฆฌ์•กํŠธ์˜ ์ƒ๋ช… ์ฃผ๊ธฐ ์ค‘ ํ•˜๋‚˜์ž„
  • state, lifCycle ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ์ž„์˜์˜ ๋ฉ”์†Œ๋“œ ์ •์˜ ๊ฐ€๋Šฅ
  • ๋ฉ”๋ชจ๋ฆฌ ์ž์›์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋งŽ์ด ์†Œ๋ชจ๋˜๊ณ  ๋ฌธ๋ฒ•์ด ๋ณต์žกํ•จ

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

function App() {
    const cType = "ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ";
    return <div> {cType} </div>;
}

export default App;
  • ํ•จ์ˆ˜(function)์„ exportํ•œ ํ˜•ํƒœ
  • state๋‚˜ lifeCycle ๊ด€๋ จ ๊ธฐ๋Šฅ์€ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅ
  • ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ณด๋‹ค ์„ ์–ธํ•˜๊ธฐ ํŽธ๋ฆฌ
  • ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ ์ž์›์„ ๋œ ์‚ฌ์šฉํ•˜๊ณ , ์‹ค์ œ ๋ฐฐํฌํ•  ๋•Œ๋„ ๊ฒฐ๊ณผ๋ฌผ์˜ ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ๋” ์ž‘์Šต๋‹ˆ๋‹ค.
  • ๋ฆฌ์•กํŠธ v16.8 ์—…๋ฐ์ดํŠธ๋กœ Hook์„ ํ†ตํ•œ state์™€ ๋ผ์ดํ”„์‚ฌ์ดํด API๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ

(1) props

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

(2) ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ

import { Component } from "react";

class NewComponent extends Component {
    render() {
            const cType = "ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ";
    		const {write} = this.props;
            return <div> {cType}์—์„œ {write}์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค</div>;
    }
}
  • render ํ•จ์ˆ˜์—์„œ this.props๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Œ
  • defaultProps์™€ propTypes๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ๋™์ผํ•˜๊ฒŒ ์„ ์–ธ, class ๋‚ด๋ถ€์—์„œ๋„ ์ง€์ • ๊ฐ€๋Šฅ

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

const App = ({write}) => {
    const cType = "ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ";

    return (
        <div>
             {cType}์—์„œ {write}์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค
        </div>
    )
}
  • props๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ํ•„์š” ์—†์ด ๋ฐ”๋กœ ํ˜ธ์ถœ ๊ฐ€๋Šฅ
  • props ๊ฐ’์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ์ฐธ์กฐ

(1) state

 

  • state๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ์˜๋ฏธ
  • state๋Š” ์ปดํฌ๋„ŒํŠธ ์ž์ฒด์ ์œผ๋กœ ์ง€๋‹Œ ๊ฐ’์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ์Œ
  • ์ผ๋ฐ˜ ๋ณ€์ˆ˜๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ html์— ์ž๋™ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์ง€๋งŒ, state๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด html์— ์žฌ๋žœ๋”๋ง ํ•ด์คŒ
    => ๊ฐ’์˜ ๋ณ€ํ™”๊ฐ€ ์ž์ฃผ ์žˆ์„ ๋•Œ state๋ฅผ ์‚ฌ์šฉ
  • ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” state, ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” useState๋ฅผ ์‚ฌ์šฉ

 

(2) ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ

import { Component } from "react";

class Counter extends Component {
    constructor(props) {
        super(props);

        this.state = {
            number: 0 
        };
    }
    render() {
        const cType = "ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ";
        const {number} = this.state; 
        return (
            <div>
                <h1> {cType} </h1>
                <h1> {number} </h1>
                <button
                    onClick = {() => {
                        this.setState( {number: number +1 } );
                    }}
                >
                    +1
                </button> 
            </div>
        );
    }
}

export default Counter;
  • ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Œ
  • ์š”์†Œ์— ๊ฐ’์„ ์ ์šฉํ•  ๋•Œ this.์„ ๋ถ™์—ฌ์„œ ์ ‘๊ทผํ•ด์•ผํ•จ

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

import { useState } from "react";

const Say = () => {
    const [message, setMessage] = useState('');
    const onClickEnter = () => setMessage("์•ˆ๋…•ํ•˜์„ธ์š”!");
    const onClickLeave = () => setMessage("์•ˆ๋…•ํžˆ๊ฐ€์„ธ์š”!");

    return (
        <div>
            <button onClick={onClickEnter}>์ž…์žฅ</button>
            <button onClick={onClickLeave}>ํ‡ด์žฅ</button>
            <h1> {message} </h1>
        </div>
    );
};

export default Say;

 

  • const + ํ•จ์ˆ˜ ํ˜•ํƒœ๋กœ ์„ ์–ธ
  • this์—†์ด ์š”์†Œ์— ์ ์šฉ ๊ฐ€๋Šฅ
  • ํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ useState ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • useState ํ•จ์ˆ˜ ์ธ์ž์—๋Š” ์ƒํƒœ์˜ ์ดˆ๊นƒ๊ฐ’์„ ์ง€์ •, ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ์–ด๋„ ๊ดœ์ฐฎ์Œ
  • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฐฐ์—ด์ด ๋ฐ˜ํ™˜
    *  ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋Š” ํ˜„์žฌ ์ƒํƒœ
    *  ๋ฐฐ์—ด์˜ ๋‘ ๋ฒˆ์งธ ์›์†Œ๋Š” ์ƒํƒœ๋ฅผ ๋ฐ”๊พธ์–ด์ฃผ๋Š” ํ•จ์ˆ˜,  setter ํ•จ์ˆ˜

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” Life Cycle๊ณผ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง์—์„œ๋„ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ด€๋ จ๋œ ํฌ์ŠคํŠธ๋ฅผ ์ž‘์„ฑ ํ›„ ๋‹ค์‹œ ์†Œ๊ฐœํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋ณด๋‹ค ๋’ค์— ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. Hooks์˜ ๋“ฑ์žฅ์œผ๋กœ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์–ด ๊ณต์‹ React์—์„œ๋„ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ + Hooks๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ์•Œ์•„๋‘˜ ํ•„์š”์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ”๊ฟ€ ํ•„์š”๋Š” ์—†์ง€๋งŒ ๋ณด์ˆ˜ํ•˜๊ฑฐ๋‚˜ ์œ ์ง€ํ•  ๋•Œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. React ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์ง€์›ํ•  ์˜ˆ์ •์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

 

 

 

 

 

 

 

 

 

Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.