SlowButSteady
새로운 시작
SlowButSteady
전체 방문자
오늘
어제
  • 분류 전체보기
    • 개발
      • 멋쟁이사자처럼 프론트엔드 스쿨 4기
      • Today I Learned
      • Weekly I Learned
      • 간단 TIL
      • Etc
      • 이노베이션 캠프 회고록
    • AUS
    • 주절주절

블로그 메뉴

  • 홈
  • 개발
  • 태그
  • 미디어로그

최근 글

티스토리

hELLO · Designed By 정상우.
SlowButSteady

새로운 시작

[TIL] React Hooks :: useState의 기본형과 함수형
개발/Today I Learned

[TIL] React Hooks :: useState의 기본형과 함수형

2022. 9. 6. 22:57
728x90

useState의 기본 형태

const [state, setState] = useState(initialState);

 

함수형 업데이트

// 기존에 사용하던 방식
setState(number + 1);

// 함수형 업데이트 
setState(() => {});

 

위 코드와 같이 setState의 ( ) 안에 수정할 값이 아니라, 함수를 넣을 수 있다. 그리고 그 함수의 인자에서는 현재의 state을 가져올 수 있고, { } 안에서는 이 값을 변경하는 코드를 작성할 수 있다.

// 현재 number의 값을 가져와서 그 값에 +1을 더하여 반환한 것
setState((currentNumber)=>{ return currentNumber + 1 });

 

두 방식의 차이점

일반 업데이트 방식으로 onClick안에서 setNumber(number + 1) 를 3번 호출하면 number가 1씩 증가한다.

// src/App.js

import { useState } from "react";

const App = () => {
  const [number, setNumber] = useState(0);
  return (
    <div>
			{/* 버튼을 누르면 1씩 플러스된다. */}
      <div>{number}</div> 
      <button
        onClick={() => {
          setNumber(number + 1); // 첫번째 줄 
          setNumber(number + 1); // 두번쨰 줄
          setNumber(number + 1); // 세번째 줄
        }}
      >
        버튼
      </button>
    </div>
  );
}

export default App;

 

함수형 업데이트 방식으로 동일하게 작동시키면 number가 3씩 증가한다.

// src/App.js

import { useState } from "react";

const App = () => {
  const [number, setNumber] = useState(0);
  return (
    <div>
			{/* 버튼을 누르면 3씩 플러스 된다. */}
      <div>{number}</div>
      <button
        onClick={() => {
          setNumber((previousState) => previousState + 1);
          setNumber((previousState) => previousState + 1);
          setNumber((previousState) => previousState + 1);
        }}
      >
        버튼
      </button>
    </div>
  );
}

export default App;

 

왜 다르게 동작할까?

일반 업데이트 방식은 버튼을 클릭했을 때 첫번째 줄 ~ 세번째 줄의 있는 setNumber가 각각 실행되는 것이 아니라, 배치(batch)로 처리한다. 즉 우리가 onClick을 했을 때 setNumber 라는 명령을 세번 내리지만, 리액트는 그 명령을 하나로 모아 최종적으로 한번만 실행시킨다. 그래서 setNumber을 3번 명령하든, 100번 명령하든 1번만 실행된다.

반면에 함수형 업데이트 방식은 3번을 동시에 명령을 내리면, 그 명령을 모아 순차적으로 각각 1번씩 실행시킨다. 0에 1더하고, 그 다음 1에 1을 더하고, 2에 1을 더해서 3이라는 결과가 나오게 된다.

저작자표시 비영리 변경금지 (새창열림)

'개발 > Today I Learned' 카테고리의 다른 글

[eslint] Plugin "react" was conflicted between "package.json » eslint-config-react-app  (0) 2022.11.03
[ React Error ] Failed to load config "react-app" to extend from.  (0) 2022.10.21
[TIL] React와 불변성  (0) 2022.09.05
[TIL] [GIT] Conflict 상황에서 강제로 Pull 하는 방법  (0) 2022.08.31
[TIL] Warning: validateDOMNesting(...): <form> cannot appear as a descendant of <form>  (0) 2022.08.30
    '개발/Today I Learned' 카테고리의 다른 글
    • [eslint] Plugin "react" was conflicted between "package.json » eslint-config-react-app
    • [ React Error ] Failed to load config "react-app" to extend from.
    • [TIL] React와 불변성
    • [TIL] [GIT] Conflict 상황에서 강제로 Pull 하는 방법
    SlowButSteady
    SlowButSteady
    하루하루는 성실하게, 인생 전체는 되는대로

    티스토리툴바