[ React ] React Hook ๐Ÿ’ป / useState, useEffect, UseReducer

seunghyoยท2023๋…„ 4์›” 27์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
5/5
post-thumbnail

React Hook?
React ์—์„œ ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ Class๋ฅผ ์ด์šฉํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด,
state์™€, ์—ฌ๋Ÿฌ React ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • ๊ฐ™์€ Hook์„ ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋น„๋™๊ธฐ ํ•จ์ˆ˜(async ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์€ ํ•จ์ˆ˜)๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

๐Ÿ’ก UseState

์ปดํฌ๋„ŒํŠธ์˜ state(์ƒํƒœ)๋ฅผ ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋‹ค. React์—์„œ ์‚ฌ์šฉ์ž์˜ ๋ฐ˜์‘์— ๋”ฐ๋ผ, ํ™”๋ฉด์„ ๋ฐ”๊ฟ”์ฃผ๊ธฐ(๋ Œ๋”๋ง) ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํŠธ๋ฆฌ๊ฑฐ ์—ญํ• ์„ ํ•˜๋Š” ๋ณ€์ˆ˜์ด๋‹ค. React๊ฐ€ state๋ฅผ ๊ฐ์‹œํ•˜๊ณ , ๋ฐ”๋€ ์ •๋ณด์— ๋”ฐ๋ฅธ ํ™”๋ฉด์„ ํ‘œ์‹œํ•ด์ค€๋‹ค. setValue๋Š” value์˜ ๋ฐ”๋€ ๊ฐ’์„ ๋‹ด๋Š”๋‹ค. useState๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ state๊ฐ’์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉ๋จ. ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์ฒ˜๋Ÿผ state๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด, Hook์„ ์‚ฌ์šฉํ•ด์„œ state์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ค€๋‹ค. ํ•˜๋‚˜์˜ useState ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ์ƒํƒœ ๊ฐ’๋งŒ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์–ด ๋งŒ์•ฝ์— ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ด€๋ฆฌํ•ด์•ผํ•  ์ƒํƒœ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด useState๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

export default function App(){
  const [value1, setValue1] = useState()
  const [value2, setValue2] = useState()
  return {
    <div>
      <div>{value1}</div>
      <div>{value2}</div>
    </div>
  }
}

//์˜ˆ์‹œ 2

import React, { useState } from 'react';

function Example() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        // ํด๋ฆญ์‹œ count +1
        Click me
      </button>
    </div>
  );
}

๐Ÿ’ก UseEffect

useEffect() ํ•จ์ˆ˜๋Š” React component๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ํŠน์ • ์ž‘์—…(Sied effect)์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฆฌ์•กํŠธ Hook์ด๋‹ค. ์—ฌ๊ธฐ์„œ Side effect๋Š” component๊ฐ€ ๋ Œ๋”๋ง ๋œ ์ดํ›„์— ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๋Š” ๋ถ€์ˆ˜์ ์ธ ํšจ๊ณผ๋“ค์„ ๋œปํ•œ๋‹ค.

useEffect(function, deps)
  • function : ์‹คํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ํ•จ์ˆ˜
  • deps : ๋ฐฐ์—ด ํ˜•ํƒœ. function์„ ์‹คํ–‰์‹œํ‚ฌ ์กฐ๊ฑด.
  • deps์— ํŠน์ •๊ฐ’์„ ๋„ฃ๊ฒŒ ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ mount ๋  ๋•Œ, ์ง€์ •ํ•œ ๊ฐ’์ด ์—…๋ฐ์ดํŠธ๋  ๋•Œ useEffect๋ฅผ ์‹คํ–‰
useEffect(() => {
    console.log("๋ Œ๋”๋ง ๋ ๋•Œ๋งˆ๋‹ค ์‹คํ–‰");
  });
useEffect(() => {
    console.log("๋งจ ์ฒ˜์Œ ๋ Œ๋”๋ง๋  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰");
  },[]);
useEffect(() => {
    console.log(name);
    console.log("name์ด๋ผ๋Š” ๊ฐ’์ด ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งŒ ์‹คํ–‰");
  },[name]);

๐Ÿ’ก UseReducer

useReducer๋Š” State(์ƒํƒœ)๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•˜๋Š” Hook์ธ useState๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” Hook์ด๋‹ค. useReducer๋Š” useState์ฒ˜๋Ÿผ State๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋Š” Hook์ด๋‹ค. useState์™€ ๋‹ค๋ฅธ ์ ์€ ํ•œ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ State๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋กœ์ง ๋ถ€๋ถ„์„ ์ปดํฌ๋„ŒํŠธ๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌ์‹œํ‚ค๋Š” ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

์—ฌ๋Ÿฌ ๊ฐœ์˜ Reducer๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, Redux์˜ combineReducers ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•˜๋‚˜์˜ Reducer๋กœ ํ•ฉ์ณ์ค„ ์ˆ˜ ์žˆ๋‹ค.

import { combineReducers } from 'redux';

const rootReducer = combineReducers({
  counterReducer,
  anyReducer,
  ...
});

useReducer ํ•จ์ˆ˜๋Š” reducer ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์œผ๋กœ state๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

const [state, dispatch] = useReducer(reducer, initialState, init);
  • state: ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•  State(์ƒํƒœ).
  • dispatch: reducer ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉฐ, ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ state์˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์ผ์œผํ‚ค๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜.
  • reducer: ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์—์„œ state๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” ํ•จ์ˆ˜. ํ˜„์žฌ์˜ state์™€ action ๊ฐ์ฒด๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„์„œ, ๊ธฐ์กด์˜ state๋ฅผ ๋Œ€์ฒดํ•  ์ƒˆ๋กœ์šด State๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
  • initialState: ์ดˆ๊ธฐ State
  • init: ์ดˆ๊ธฐ ํ•จ์ˆ˜

0๊ฐœ์˜ ๋Œ“๊ธ€