๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

โœ๏ธ/React

React ๊ณต๋ถ€ํ•˜๊ธฐ(1) - ์ƒํƒœ๊ด€๋ฆฌํŽธ

๐Ÿ‡ ๋ฒจ๋กœํผํŠธ์™€ ํ•จ๊ป˜ํ•˜๋Š” ๋ชจ๋˜ ๋ฆฌ์•กํŠธ

 

์•„๋ž˜์— ๊ธฐ๋Šฅ๋“ค์€ ๋ชจ๋‘ React Hooks์ค‘ ํ•˜๋‚˜

 

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

 

7. useState๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ”๋€Œ๋Š” ๊ฐ’ ๊ด€๋ฆฌํ•˜๊ธฐ

 

<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;

(์ž์„ธํžˆ ๋ณด๊ธฐ) ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ๋ Œ๋”๋ง๋˜๋Š” ์‹œ์ ์—์„œ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฒ„๋ฆผ

onClick={onIncrease()}

 

(์ž์„ธํžˆ ๋ณด๊ธฐ) useState

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

์ƒํƒœ์˜ ๊ธฐ๋ณธ๊ฐ’์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„ฃ์–ด์„œ ํ˜ธ์ถœ

ํ˜ธ์ถœํ•˜๋ฉด ๋ฐฐ์—ด์ด ๋ฐ˜ํ™˜๋˜๋Š”๋ฐ, ์ฒซ๋ฒˆ์งธ ์›์†Œ๋Š” ํ˜„์žฌ ์ƒํƒœ / ๋‘๋ฒˆ์งธ ์›์†Œ๋Š” Setter ํ•จ์ˆ˜

[ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ]

<counter.js>

import React, { useState } from 'react';

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

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

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

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

export default Counter;

onIncrease, onDecrease setNumber์—์„œ ๊ทธ ๋‹ค์Œ ์ƒํƒœ๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„ฃ์–ด์ค€ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ,

๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด์คŒ

=> for ์ตœ์ ํ™” (๋‚˜์ค‘์— ์•Œ์•„๋ณด์ž)

 

8. input ์ƒํƒœ ๊ด€๋ฆฌํ•˜๊ธฐ - onChange

 

<App.js>

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

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

export default App;

<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;

e.target : ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ DOM => input DOM

e.target.value : input ๊ฐ’

(์ž์„ธํžˆ๋ณด๊ธฐ)

<input onChange={onChange} value={text} />

input์—๋„ value๋ฅผ ์„ค์ •ํ•ด์ค˜์•ผ, ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ input์˜ ๋‚ด์šฉ๋„ ์—…๋ฐ์ดํŠธ ๋จ

 

9. ์—ฌ๋Ÿฌ๊ฐœ์˜ input ์ƒํƒœ ๊ด€๋ฆฌํ•˜๊ธฐ

 

<InputSample.js>

import React, { useState } from 'react';

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

  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: '',
    })
  };


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

export default InputSample;

(์ž์„ธํžˆ๋ณด๊ธฐ) โญโญโญ ๋ถˆ๋ณ€์„ฑ โญโญโญ

๊ฐ’ ์ง์ ‘ ๋ฐ”๊พธ๊ธฐ XXX

inputs[name] = value;

... spread ๋ฌธ๋ฒ• OOO

setInputs({
  ...inputs,
  [name]: value
});

... spread ๋ฌธ๋ฒ• : ๊ฐ์ฒด์˜ ๋‚ด์šฉ์„ ๋ชจ๋‘ "ํŽผ์ณ์„œ" ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌ

=> ๊ธฐ์กด ๊ฐ์ฒด ์ง์ ‘ ์ˆ˜์ • X ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ฆ

=> ๋ถˆ๋ณ€์„ฑ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด

=> ๋ถˆ๋ณ€์„ฑ์„ ์ง€์ผœ์ฃผ์–ด์•ผ๋งŒ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋์Œ์„ ๊ฐ์ง€ํ•ด์„œ ๋ฆฌ๋ Œ๋”๋ง ๋จ

 

10. useRef๋กœ ํŠน์ • DOM ์„ ํƒํ•˜๊ธฐ

<inputSample.js> ์ดˆ๊ธฐํ™” ๋ฒ„ํŠผ ํด๋ฆญํ•˜๋ฉด input์— ํฌ์ปค์Šค๊ฐ€ ์žกํžˆ๋„๋ก

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;