๐Ÿ” ๋ฆฌ์•กํŠธ Hooks

  • ๋ฆฌ์•กํŠธ์—์„œ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘์— Hooks๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  • Hooks๋Š” ๊ธฐ์กด์— ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•  ์ˆ˜ ์—†์—ˆ๋˜ ์ƒํƒœ ๊ด€๋ฆฌ๋‚˜, ๋ Œ๋”๋ง ํ›„ ์ž‘์—…์„ ์„ค์ •ํ•˜๋Š” ๊ธฐ๋Šฅ ๋“ฑ์˜ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
  • ์ƒํƒœ(State)๋ž€ ?
    • ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ’ props๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋กœ๋ถ€ํ„ฐ ๋„˜๊ฒจ ๋ฐ›์œผ๋ฏ€๋กœ, ์ปดํฌ๋„ŒํŠธ ์ž์‹ ์€ props๋ฅผ ๋ฐ”๊พธ์ง€ ๋ชปํ•˜๋Š” ํŠน์„ฑ์ด ์žˆ๋Š” ๊ฒƒ๊ณผ๋Š” ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

useState

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ ์ƒํƒœ(state)๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ฃผ๋Š” Hook ์ž…๋‹ˆ๋‹ค. ์นด์šดํ„ฐ ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๊ฑฐ๋‚˜ ๊ฐ์†Œ์‹œํ‚ค๋Š” ์นด์šดํ„ฐ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ง ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์นด์šดํ„ฐ ๊ฐ’์ด ๋  ์ƒํƒœ ๊ฐ’์„ useState ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๋ณ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์งค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Step1 ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ state๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก useState import ํ•˜๊ณ 

import { useState } from "react";

const Counter = () => {
  const [value, setValue] = useState(0);

  return <div></div>;
};

export default Counter;
  • useState ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ ค๋ฉด import์— {useState}๋ฅผ ํ•„ํžˆ ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ•จ์ˆ˜ body์— const [value, setValue] = useState(0); ๋ผ๊ณ  ์“ด ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฒ˜์Œ ์ƒํƒœ๊ฐ’ (value)์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ๊ทธ ์ƒํƒœ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” setter ํ•จ์ˆ˜๋ฅผ setValue๋ผ๊ณ  ์ง€์ •ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

step2 return๋ฌธ์— ์ƒํƒœ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„ํŠผ์„ ๋„ฃ๊ธฐ

import { useState } from "react";

const Counter = () => {
  const [value, setValue] = useState(0);
  return (
    <div>
      <p>
        ํ˜„์žฌ ์นด์šดํ„ฐ ๊ฐ’์€ <b>{value} ์ž…๋‹ˆ๋‹ค.</b>
      </p>
      <button onClick={() => setValue(value + 1)}>+1</button>
      <button onClick={() => setValue(value - 1)}>-1</button>
    </div>
  );
};
export default Counter;
  • ๋ฒ„ํŠผ onClick ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๊ณ , ๊ทธ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—, useState ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ง€์ •ํ–ˆ๋˜ setter ํ•จ์ˆ˜์ธ setValueํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ ํ•ฉ๋‹ˆ๋‹ค.
  • ์œ„ ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•œ ํ˜•์‹์€ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์‚ฌ์ „์— ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ์ง€์ •ํ•˜๊ณ  ๊ทธ ํ•จ์ˆ˜ ์ด๋ฆ„์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ ๋„ ๋‹จ์ˆœํ•˜๊ฒŒ ํ•จ์ˆ˜ body๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋ฌธ๋ฒ•์€ () => {โ€ฆbody} ์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜๋Š”๋ฐ, ์œ„์ฒ˜๋Ÿผ body์— ๋“ค์–ด๊ฐˆ ๋‚ด์šฉ์ด ํ•˜๋‚˜ ๋ฟ์ด๋ผ๋ฉด {, } ๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

useState๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉํ•˜๊ธฐ

useState ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ์ƒํƒœ ๊ฐ’๋งŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ด€๋ฆฌํ•ด์•ผ

const [value, setValue] = useState(0);

ํ•  ์ƒํƒœ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด useState๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

const [name, setName] = useState("");
const [nickname, setNickname] = useState("");

const onChangeName = (e) => {
  setName(e.target.value);
};
const onChangeNickname = (e) => {
  setNickname(e.target.value);
};

  • name, nickname ์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • input ์—์„œ ๋ฌด์–ธ๊ฐ€ ๊ฐ’์„ ์ž…๋ ฅ ๋ฐ›์„ ๋•Œ, onChange ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง์„ ์œ„ํ•ด onChangeName ๋“ฑ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋‘” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋งŒ์•ฝ input ์š”์†Œ์—์„œ onChnage ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง์„ ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž๊ฐ€ input๋ž€์— ๋ฌด์—‡์„ ์ž…๋ ฅํ•˜๋”๋ผ๋„ ์นธ์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ณด์ด์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด ๊ธ€์€ ๊น€๋ฏผ์ค€(velopert)๋‹˜์˜ ๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ ์„์ฐธ์กฐ ํ•˜์—ฌ ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.