๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT/React

[React] ReactJS๋กœ ์˜ํ™” ์›น ์„œ๋น„์Šค ๋งŒ๋“ค๊ธฐ (STATE #1)

by YeonBu 2024. 2. 22.
728x90

 

* ๋…ธ๋งˆ๋“œ์ฝ”๋” ๊ฐ•์˜ ์ •๋ฆฌ ๊ธ€ ์ž…๋‹ˆ๋‹ค.

 

ReactJS๋กœ ์˜ํ™” ์›น ์„œ๋น„์Šค ๋งŒ๋“ค๊ธฐ – ๋…ธ๋งˆ๋“œ ์ฝ”๋” Nomad Coders

React for Beginners

nomadcoders.co

 

 

 

STATE 1

- ์ด์ „ ๊ฐ•์˜์— ์ด์–ด์„œ ๊ณ„์†

- ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ˆซ์ž๊ฐ€ ์นด์šดํŠธ ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ๋Š” ์ค‘

 

 

 

 1. React.js (๋ฆฌ๋ Œ๋”๋ง ํ•˜๋Š” ๋ฐฉ๋ฒ•)

- ์šฐ๋ฆฌํ•œํ…Œ ์–ด๋–ค๊ฒŒ ํ•„์š”ํ•˜๊ณ , ์–ด๋–ค๊ฑธ ํ•ด์•ผํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์•ˆ ์ข‹์€ ๋ฐฉ๋ฒ•๋ถ€ํ„ฐ ์‹œ์ž‘

 

<!DOCTYPE html>
<html>
    <body>
        <div id="root"></div>
    </body>
    <script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
    <script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
    <script type="text/babel">

        const root = document.getElementById("root");

        let counter = 0;

        function countUp() {
            counter = counter + 1;
        }

        const Container = () => (
            <div>
                <h3>Total clicks : {counter}</h3>
                <button onClick = {countUp}>Click me</button>
            </div>
        );

        ReactDOM.render(<Container />, root);
        
    </script>
    
</html>

 

 

- ์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์งœ๊ณ  ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด

   ์‹ค์ œ๋กœ counter์˜ ๊ฐ’์€ ์ฆ๊ฐ€ํ•˜์ง€๋งŒ UI๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์ง€ ์•Š์•„ 0์œผ๋กœ ๋ณด์ธ๋‹ค.

   (์ด์œ ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹จ ํ•œ ๋ฒˆ๋งŒ ๋ Œ๋”๋ง ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ)

 

- ๋™์ž‘์„ ์‚ดํŽด๋ณด๋ฉด, 

   1. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ โž” ํŽ˜์ด์ง€ ๋กœ๋“œ

   2. countUp(), Container()๋Š” ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ 

       ReactDOM.render(<Container />, root); ๋ผ์ธ์ด ์‹คํ–‰๋จ

       (์ด ๋•Œ counter๋Š” 0์ด๊ธฐ ๋•Œ๋ฌธ์— 0์„ ๋กœ๋“œํ•œ๋‹ค)

   3. ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด counter๋ฅผ 1์”ฉ ์ฆ๊ฐ€ ์‹œํ‚จ๋‹ค.

   4. countUp() ํ•จ์ˆ˜๊ฐ€ ๋™์ž‘ํ•˜๊ณ  ๋‚˜๋ฉด, 

       ๋ฆฌ๋ Œ๋”๋ง์ด ํ•„์š”ํ•œ๋ฐ ์–ด๋””์—๋„ ํ•˜๋Š” ๊ณณ์ด ์—†๋‹ค.

 

 

 

function countUp() {
    counter = counter + 1;
    render();
}

function render() {
    ReactDOM.render(<Container />, root);
}

 

- render()์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ , countUp()์—์„œ ์‹คํ–‰ ์‹œ์ผœ์ฃผ๋„๋ก ์ˆ˜์ •ํ•˜์˜€๋‹ค.

- ์ด์ œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์€ ๋‹ค๋ฅธ ํ•จ์ˆ˜๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด,

   ๊ฑฐ๊ธฐ์„œ๋„ ๊ณ„์† render๋ฅผ ํ•ด์ฃผ์–ด์•ผํ•˜๋ฏ€๋กœ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๋‹ค.

 

 

 

๐Ÿ“Œ ์šฐ์„  ์ด๋ ‡๊ฒŒ๋งŒ ํ•ด๋ณด๊ณ  ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋ณด๋ฉด JS์™€ React๋Š” ๋…ธ๋“œ ๋ณ€๊ฒฝ ์ฒ˜๋ฆฌ ๊ณผ์ •์ด ๋‹ค๋ฅด๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์Œ.

      (์„ค๋ช…์€ ๊ฐ•์˜ ์ฝ”๋ฉ˜ํŠธ ์ฐธ๊ณ  - soonseok๋‹˜)

 

 

* JS์—์„œ ๋ฒ„ํŠผ ํด๋ฆญ *

 

* Vanilla JavaScript๋Š” DOM๋ณ€๊ฒฝ์„ ์ง์ ‘ ์ฒ˜๋ฆฌํ•œ๋‹ค.

DOM ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋ฉด, ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ณ€๊ฒฝ๋œ DOM ํŠธ๋ฆฌ๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๊ณ ,

๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•œ ํ›„ ํ™”๋ฉด์— ๊ทธ๋ฆฐ๋‹ค.

์ด ๊ณผ์ •์€ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์—ฐ์‚ฐ์œผ๋กœ, ์ž์ฃผ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋ฉด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

* React์—์„œ ๋ฒ„ํŠผ ํด๋ฆญ *

 

* ReactJS๋Š” DOM ๋ณ€๊ฒฝ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์ƒ DOM(Virtual DOM)์ด๋ผ๋Š” ๊ฐœ๋…์„ ๋„์ž…ํ•œ๋‹ค.

์ƒํƒœ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ€์ƒ DOM ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ ,

์ด์ „์˜ ๊ฐ€์ƒ DOM ํŠธ๋ฆฌ์™€ ๋น„๊ตํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„์„ ํŒŒ์•…ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ํŒŒ์•…๋„๋‹ˆ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋งŒ ์‹ค์ œ DOM์— ๋ฐ˜์˜ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

๊ฐ€์ƒ DOM์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ, ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์š”์†Œ๋งŒ ์‹ค์ œ DOM์— ๋ฐ˜์˜๋˜๊ธฐ ๋•Œ๋ฌธ์—

๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ์„ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

2. React.JS (useState ์‚ฌ์šฉ)

<!DOCTYPE html>
<html>
    <body>
        <div id="root"></div>
    </body>
    <script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
    <script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
    <script type="text/babel">

        const root = document.getElementById("root");
        
        const App = () => {
            const [counter, setCounter] = React.useState(0);
            const onClick = () => {
                setCounter(counter + 1);
            }
            return (
                <div>
                    <h3>Total clicks : {counter}</h3>
                    <button onClick={onClick}>Click me</button>
                </div>
            )
        };

        ReactDOM.render(<App />, root);

    </script>
    
</html>

 

- useState๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒํƒœ๊ฐ’์ด ๋ณ€๊ฒฝ๋์„ ๋•Œ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•˜๊ณ  ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๊ฐ€ ํ™”๋ฉด์— ๋ฐ˜์˜๋จ.

 

 

 

๐Ÿ“Œ useState

const data = React.useState(0);
console.log(data);

 

* useState๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ƒํƒœ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ Hook์ด๋‹ค.

* console์„ ๋ณด๋ฉด useState์— ์ดˆ๊ธฐ๊ฐ’๊ณผ ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  data์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด์„œ data[0] ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•จ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•  ๋• data[1] ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

* ๋งค๋ฒˆ data[0], data[1] ๋กœ ๊บผ๋‚ด๋Š” ๊ฒƒ ๋ณด๋‹ค๋Š” ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜์—ฌ ๊บผ๋‚ด์ฃผ๋Š”๊ฒŒ ์ข‹์€ ๋ฐฉ๋ฒ•์ผ ๊ฒƒ์ด๋‹ค.

   ๊ทธ๋ž˜์„œ state๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•œ๋‹ค.

const [counter, setCounter] = React.useState(0);

 

* ์•„๋ž˜๋Š” ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น ๋ฌธ๋ฒ• ์˜ˆ์‹œ์ด๋‹ค.

๋”๋ณด๊ธฐ

const numbers = [1,2,3];

console.log(numbers[0]) // 1

console.log(numbers[1]) // 2

console.log(numbers[2]) // 3

 

const [a,b,c] = numbers;

console.log(a) // 1

console.log(b) // 2

console.log(c) // 3

 

๋‹ค์Œ ๊ฐ•์˜์— ๊ณ„์†!

๋ฐ˜์‘ํ˜•