https://chan4im.tistory.com/190

 

<frontend> {14} </React_part 1>

๐Ÿค” React ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ...? JS๋ฅผ ์‚ฌ์šฉํ•ด HTML๋กœ ๊ตฌ์„ฑ๋œ UI๋ฅผ ์ œ์–ดํ–ˆ๋‹ค๋ฉด, DOM ๋ณ€ํ˜•์„ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ณผ์ •์„ ๋”ฐ๋ฅธ๋‹ค. 1. Selector API๋ฅผ ์‚ฌ์šฉํ•ด ํŠน์ • DOM์„ ์„ ํƒ 2. ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ ์‹œ, ๋ณ€ํ™”๋ฅผ ์ฃผ๋„๋ก ์„ค

chan4im.tistory.com

์•ž์„  ๊ณผ์ •์—์„œ react ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ, ๋™์ ์ธ ๋ถ€๋ถ„์€ ํ•˜๋‚˜๋„ ์—†์—ˆ๋‹ค.

์ฆ‰, ๊ฐ’์ด ๋ฐ”๋€Œ๋Š” ์ผ์ด ์—†์—ˆ์ง€๋งŒ, ์ด๋ฒˆ์—๋Š” ์‚ฌ์šฉ์ž์˜ interaction์— ๋”ฐ๋ฅธ ๋ณ€ํ™”๊ฐ€ ํ•„์š”ํ•  ๋•Œ, ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

 

Ex. ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ˆซ์ž๊ฐ€ ๋ฐ”๋€Œ๋Š” Counter ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•ด๋ณด์ž!

Counter.js

import React from 'react';

function Counter() {
  return (
    <div>
      <h1>0</h1>
      <button>+1</button>
      <button>-1</button>
    </div>
  );
}

export default Counter;
App.js

import React from 'react';
import Counter from './Counter';

function App() {
  return (
    <Counter />
  );
}

export default App;

 

๐Ÿ“Œ ์ด์ œ, Counter์—์„œ ๋ฒ„ํŠผ์ด ํด๋ฆญ๋˜๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด?

→ ํŠน์ • ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋„๋ก ์„ค์ •ํ•ด๋ณด์ž.

์—ฌ๊ธฐ์„œ onIncrease ์™€ onDecrease ๋Š” ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด button์˜ onClick ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ์—ˆ๋‹ค.

์ฆ‰, react์—์„œ element์— ์ด๋ฒคํŠธ ์„ค์ •์‹œ, ๋‹ค์Œ์˜ ํ˜•ํƒœ๋กœ ์„ค์ •ํ•œ๋‹ค.

on์ด๋ฒคํŠธ์ด๋ฆ„ = {์‹คํ–‰ํ•˜๊ณ ์‹ถ์€ ํ•จ์ˆ˜}
Counter.js

import React from 'react';

function Counter() {
  const onIncrease = () => {
    console.log('+1')
  }
  const onDecrease = () => {
    console.log('-1');
  }
  return (
    <div>
      <h1>0</h1>
      <button onClick={onIncrease}>+1</button>
      <button onClick={onDecrease}>-1</button>
    </div>
  );
}

export default Counter;

cf. =>ํ•จ์ˆ˜ ์ฐธ๊ณ 

์ขŒ์ธก์—๋Š” ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ, ํ™”์‚ดํ‘œ์˜ ์šฐ์ธก์—๋Š” ์ฝ”๋“œ ๋ธ”๋ก์ด ๋“ค์–ด์˜จ๋‹ค.

(https://learnjs.vlpt.us/basics/05-function.html#%ED%99%94%EC%82%B4%ED%91%9C-%ED%95%A8%EC%88%98)

 

05. ํ•จ์ˆ˜ · GitBook

ํ•จ์ˆ˜๋Š”, ํŠน์ • ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๋ช…๋ น์œผ๋กœ ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ, ์šฐ๋ฆฌ๊ฐ€ ํŠน์ • ๊ฐ’๋“ค์˜ ํ•ฉ์„ ๊ตฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ•œ๋ฒˆ, ์ด ์ž‘์—…์„ ํ•จ์ˆ˜๋กœ ๋งŒ

learnjs.vlpt.us

 

 

 

๐Ÿค” ๋™์ ์ธ ๊ฐ’์— ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ ์ƒํƒœ๊ด€๋ฆฌ, useState..?

Ex. ์•„๋ž˜ ์ฝ”๋“œ๋Š” react ํŒจํ‚ค์ง€์—์„œ useState๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
์ด๋•Œ, Setterํ•จ์ˆ˜๋Š” param์—์„œ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์„ ์ตœ์‹ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
Counter.js

import React, { useState } from 'react';

function Counter() {
  const [number, setNumber] = useState(0);

  const onIncrease = () => {
    setNumber(number + 1);
  }

  const onDecrease = () => {
    setNumber(number - 1);
  }

  return (
    <div>
      <h1>{number}</h1>
      <button onClick={onIncrease}>+1</button>
      <button onClick={onDecrease}>-1</button>
    </div>
  );
}

export default Counter;

 

 

 

 

 

 


 

InputSample.js

import React from 'react';

function InputSample() {
  return (
    <div>
      <input />
      <button>์ดˆ๊ธฐํ™”</button>
      <div>
        <b>๊ฐ’: </b>
      </div>
    </div>
  );
}

export default InputSample;โ€‹
App.js

import React from 'react';
import InputSample from './InputSample';

function App() {
  return (
    <InputSample />
  );
}

export default App;โ€‹


์—ฌ๊ธฐ์— ๋Œ€ํ•ด, input์— ์ž…๋ ฅํ•˜๋Š” ๊ฐ’์ด ์•„๋ž˜์— ๋‚˜ํƒ€๋‚˜๊ณ , ์ดˆ๊ธฐํ™”๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด input ๊ฐ’์ด ๋น„์›Œ์ง€๋„๋ก ๊ตฌํ˜„ํ•ด๋ณด์ž.

useState๋ฅผ ์‚ฌ์šฉ, input์˜ onChange ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ,
์ด๋ฒคํŠธ์— ๋“ฑ๋กํ•˜๋Š” ํ•จ์ˆ˜์—์„œ๋Š” ์ด๋ฒคํŠธ ๊ฐ์ฒด e ๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„์™€์„œ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๊ณ ,
์ด ๊ฐ์ฒด์˜ 
e.target ์€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ DOM ์ธ input DOM ์„ ๊ฐ€๋ฅดํ‚ค๊ฒŒ ๋œ๋‹ค.
์ด DOM ์˜ 
value ๊ฐ’, ์ฆ‰ e.target.value ๋ฅผ ์กฐํšŒํ•˜๋ฉด ํ˜„์žฌ input ์— ์ž…๋ ฅํ•œ ๊ฐ’์ด ๋ฌด์—‡์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฐ’์„ useState๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

InputSample.js

import React, { useState } from 'react';

function InputSample() {
  const [text, setText] = useState('');

  const onChange = (e) => {
    setText(e.target.value);
  };

  const onReset = () => {
    setText('');
  };

  return (
    <div>
      <input onChange={onChange} value={text}  />
      <button onClick={onReset}>์ดˆ๊ธฐํ™”</button>
      <div>
        <b>๊ฐ’: {text}</b>
      </div>
    </div>
  );
}

export default InputSample;

 

 

 

 

 

 

 


 

๐Ÿค” useRef๋กœ ํŠน์ • DOM ์„ ํƒํ•˜๊ธฐ
JS์—์„œ ํŠน์ • DOM์„ ์„ ํƒํ•ด์•ผํ•  ๋•Œ, getElementId, querySelector ๊ฐ™์€ DOM Selectorํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด DOM์„ ์„ ํƒํ•œ๋‹ค.

React์—์„œ๋„ ๊ฐ€๋” DOM์„ ์ง์ ‘ ์„ ํƒํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์ด๋•Œ ref๋ผ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•œ๋‹ค.
ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ref์‚ฌ์šฉ ์‹œ, useRef๋ผ๋Š” Hookํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.


Ex) ์ดˆ๊ธฐํ™” ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ, ์ด๋ฆ„ input์— ํฌ์ปค์Šค๊ฐ€ ์žกํžˆ๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„
InputSample.js


import React, { useState, useRef } from 'react';

function InputSample() {
  const [inputs, setInputs] = useState({
    name: '',
    nickname: ''
  });
  const nameInput = useRef();

  const { name, nickname } = inputs; // ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น์„ ํ†ตํ•ด ๊ฐ’ ์ถ”์ถœ

  const onChange = e => {
    const { value, name } = e.target; // ์šฐ์„  e.target ์—์„œ name ๊ณผ value ๋ฅผ ์ถ”์ถœ
    setInputs({
      ...inputs, // ๊ธฐ์กด์˜ input ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•œ ๋’ค
      [name]: value // name ํ‚ค๋ฅผ ๊ฐ€์ง„ ๊ฐ’์„ value ๋กœ ์„ค์ •
    });
  };

  const onReset = () => {
    setInputs({
      name: '',
      nickname: ''
    });
    nameInput.current.focus();
  };

  return (
    <div>
      <input
        name="name"
        placeholder="์ด๋ฆ„"
        onChange={onChange}
        value={name}
        ref={nameInput}
      />
      <input
        name="nickname"
        placeholder="๋‹‰๋„ค์ž„"
        onChange={onChange}
        value={nickname}
      />
      <button onClick={onReset}>์ดˆ๊ธฐํ™”</button>
      <div>
        <b>๊ฐ’: </b>
        {name} ({nickname})
      </div>
    </div>
  );
}

export default InputSample;

useRef() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Ref ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ , ์ด ๊ฐ์ฒด๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ์„ ํƒํ•˜๊ณ  ์‹ถ์€ DOM ์— ref ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด์ฃผ๋ฉด, Ref ๊ฐ์ฒด์˜ .current ๊ฐ’์€ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” DOM ์„ ๊ฐ€๋ฅดํ‚ค๊ฒŒ ๋œ๋‹ค.

+ Recent posts