๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ํ”„๋ก ํŠธ์—”๋“œ/React

๋ฆฌ์•กํŠธ Hooks

by alswlfl 2022. 11. 15.

- ๋ฆฌ์•กํŠธ 16.8 ์ด์ „ ๋ฒ„์ „์—์„œ๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์—†์—ˆ์ง€๋งŒ, ๋ฆฌ์•กํŠธ 16.8์—์„œ Hooks๋ผ๋Š” ๊ธฐ๋Šฅ์ด ๋„์ž…๋˜๋ฉด์„œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ ์ƒํƒœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ

์ด๋ฒคํŠธ ์„ค์ •

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;

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

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

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

export default App;

useState

: ์ปดํฌ๋„ŒํŠธ์—์„œ ๋™์ ์ธ ๊ฐ’์„ ์ƒํƒœ(state)๋ผ๊ณ  ๋ถ€๋ฆ„, useStateํ•จ์ˆ˜ ์ด์šฉํ•ด ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ

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>0</h1>
      <button onClick={onIncrease}>+1</button>
      <button onClick={onDecrease}>-1</button>
    </div>
  );
}

export default Counter;

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

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>0</h1>
      <button onClick={onIncrease}>+1</button>
      <button onClick={onDecrease}>-1</button>
    </div>
  );
}

export default Counter;

โญ๏ธ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜

: ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐฉ์‹ ์ค‘ ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ, function ํ‚ค์›Œ๋“œ ๋Œ€์‹  => ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•จ์ˆ˜ ๊ตฌํ˜„

const add =(a,b) =>{
	return a+b;
};

console.log(add(1,2));

input ์ƒํƒœ ๊ด€๋ฆฌ

e.target์€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ DOM์„ ๊ฐ€๋ฆฌํ‚ด

์ด DOM์˜ value ๊ฐ’, ์ฆ‰ e.target.value๋ฅผ ์กฐํšŒํ•˜๋ฉด ํ˜„์žฌ input์— ์ž…๋ ฅํ•œ ๊ฐ’์ด ๋ฌด์—‡์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ์Œ

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;

- input์˜ ์ƒํƒœ ๊ด€๋ฆฌ ์‹œ, input ํƒœ๊ทธ์˜ value ๊ฐ’๋„ ์„ค์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•จ -> ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ input์˜ ๋‚ด์šฉ๋„ ์—…๋ฐ์ดํŠธ ๋จ

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

โ–ธ placeholder: input์˜ ์†์„ฑ ์ค‘ ํ•˜๋‚˜๋กœ, input์ด ๋น„์–ด์ ธ์žˆ์„ ๋•Œ input์— ๋Œ€ํ•œ ์„ค๋ช…์„ ๋ณด์—ฌ์คŒ

 

input์˜ ๊ฐœ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ๋˜์—ˆ์„ ๋•Œ, ๋‹จ์ˆœํžˆ useState๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฌ์šฉํ•˜๊ณ , onChange๋„ ์—ฌ๋Ÿฌ ๊ฐœ ๋งŒ๋“ค์–ด์„œ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์€ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹˜

input์— name์„ ์„ค์ •ํ•˜๊ณ  ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ด ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ์‹์ด ์ข‹์Œ, useState์—์„œ๋Š” ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๊ฐ์ฒด ํ˜•ํƒœ์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ์–ด์•ผ ํ•จ
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;

- ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด์— ๋ณ€ํ™”๋ฅผ ์ฃผ๊ณ , ์ด๋ฅผ ์ƒํƒœ๋กœ ์‚ฌ์šฉํ•ด์ฃผ์–ด์•ผ ํ•จ(๋ฆฌ์•กํŠธ ์ƒํƒœ์—์„œ ๊ฐ์ฒด ์ˆ˜์ •ํ•  ๊ฒฝ์šฐ, inputs[name]=value; ์ด๋ ‡๊ฒŒ ์ง์ ‘ ์ˆ˜์ •ํ•˜๋ฉด ์•ˆ๋จ)

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

- ๋ถˆ๋ณ€์„ฑ์„ ์ง€์ผœ์ฃผ์–ด์•ผ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋์Œ์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๊ณ , ์ด์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ์ง„ํ–‰

- ๋ฆฌ์•กํŠธ์—์„œ๋Š” ๋ถˆ๋ณ€์„ฑ์„ ์ง€์ผœ์ฃผ์–ด์•ผ๋งŒ ์ปดํฌ๋„ŒํŠธ ์—…๋ฐ์ดํŠธ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์ œ๋Œ€๋กœ ํ•  ์ˆ˜ ์žˆ์Œ

โญ๏ธ spread๋ฌธ๋ฒ•

...๋ฌธ๋ฒ•(spread ๋ฌธ๋ฒ•):  ๊ธฐ์กด์˜ ๊ฒƒ์„ ๊ฑด๋“ค์ด์ง€ ์•Š๊ณ , ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ฆ(๊ฐ์ฒด์˜ ๋‚ด์šฉ์„ ๋ชจ๋‘ ํŽผ์ณ์„œ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌ)

const animals=['๊ฐœ','๊ณ ์–‘์ด','์ฐธ์ƒˆ'];
const anotherAnimals=[...animals, '๋น„๋‘˜๊ธฐ'];
console.log(animals);
console.log(anotherAnimals);