1 분 소요

state와 prev

State란, 리액트 컴포넌트에서 데이터를 담기 위한 상자(변수)이다. 이 상자에 담긴 내용은 함수가 모두 끝나고 나면!! 화면에 반영된다. 다음과 같이 숫자를 세는 카운터가 있다.

import { useState } from "react";

export default function New() {
  const [count, setCount] = useState(0);

  function handleClick() {
    setCount(count + 1);
  }

  return (
    <div>
      <h1>{count}</h1>
      <button onClick={handleClick}>state 활용하여 count 증가시키기</button>
    </div>
  );
}

위의 코드를 화면에 출력하면, “state를 활용하여 count 증가시키기” 버튼을 클릭할 때마다 1씩 증가하면서 정상적으로 반영된다. 그런데 setCount(count + 1)을 다섯 번 써주게 되면, count가 다섯 개씩 증가하게 될까??

import { useState } from "react";

export default function New() {
  const [count, setCount] = useState(0);

  function handleClick() {
    setCount(count + 1); // 현재 카운트는 0 + 1이므로 1이 상자에 담김
    setCount(count + 1); // 함수가 종료되기 전이므로 count가 0이라 1이 상자에 담김
    setCount(count + 1); // 위와 동일
    setCount(count + 1); // 위와 동일
    setCount(count + 1); // 위와 동일
  }

  return (
    <div>
      <h1>{count}</h1>
      <button onClick={handleClick}>state 활용하여 count 증가시키기</button>
    </div>
  );
}

그렇지 않다. 맨 위에서 말했듯, 상자에 담긴 내용은 함수가 모두 끝나게 되면 반영되기 때문에 결국 setCount(count + 1)을 한 번 써준 것과 동일한 결과가 나온다. 만약 5가 증가하도록 의도했다면, prev라는 임시 저장 공간을 이용해서 작성해야 한다!

import { useState } from "react";

export default function New() {
  const [count, setCount] = useState(0);

  function handleClick() {
    serCount((prev) => prev + 1); // 임시 저장공간의 0(기본값, prev)에 1을 더한 결과인 1이 상자에 담김
    serCount((prev) => prev + 1); // 임시 저장공간의 1(기본값, prev)에 1을 더한 결과인 2이 상자에 담김
    serCount((prev) => prev + 1); // 임시 저장공간의 2(기본값, prev)에 1을 더한 결과인 3이 상자에 담김
    serCount((prev) => prev + 1); // 임시 저장공간의 3(기본값, prev)에 1을 더한 결과인 4가 상자에 담김
    serCount((prev) => prev + 1); // 임시 저장공간의 4(기본값, prev)에 1을 더한 결과인 5가 상자에 담김
  }

  return (
    <div>
      <h1>{count}</h1>
      <button onClick={handleClick}>state 활용하여 count 증가시키기</button>
    </div>
  );
}

이렇게 prev를 사용하면 임시 저장 공간에 있는 값을 먼저 꺼내오고, 만약 임시 저장 공간에 있는 값이 없다면, 기본값을 불러오게 된다.

댓글남기기