useState 딥다이브

2023. 6. 4. 13:18·React

안녕하세요 웹 프론트엔드 개발자 설탕시럽입니다.
React의 함수형 컴포넌트에서 상태관리 함수 "useState"에 대해 학습한 내용을 공유하려고 합니다.

 

 

useState?

useState는 React에서 상태 관리를 위해 React Hooks에서 제공되는 함수입니다. 이전까지는 클래스 기반 컴포넌트에서 this.state 를 통해 상태를 관리했었지만, 함수 기반 컴포넌트가 활성화 되고 React Hooks를 통해서 클래스 기반 컴포넌트처럼 상태를 관리할 수 있게 되었습니다.

useState는 배열을 반환하며, 반환하는 배열의 값은 다음과 같습니다.

  • 첫 번째 원소 : 상태값을 저장할 변수
  • 두 번째 원소 : 해당 상태값을 업데이트할 때 사용하는 함수
const [state, setStateFn] = useState(initialState);

여기서 주의해야할 점은, setStateFn 이 단순히 상태를 변경시키는 함수가 아니라는 점입니다. const로 선언된 상태가 변경되는 로직은 불가능 하기때문에 내부적으로 다른 방식으로 useState는 동작하게 됩니다.

 

 

원리

function useState(initialState) {
	var dispatcher = resolveDispatcher();
    return dispatcher.useState(initialState);
}

useState를 포함한 hooks는 모두 react 모듈에 선언되어 있는 함수고 이를 호출하여 사용하게 됩니다.

내부 로직에서는 실행 될 때마다 dispatcher를 선언하고 useState 메소드를 실행해서 그 값을 반환받습니다.

여기서 useState가 실행되는 위치에서는 전역으로 선언된 ReactCurrentDispatcher로 부터 값을 가져오고, 해당 위치에서 전역선언되어 있기때문에 접근 및 수정을 하게됩니다.

 

동작 순서

  1. 웹이 로딩되고 포함되어 있는 함수형 컴포넌트 호출
    1. useState는 이때 호출되어, 가지고있는 initialValue를 전달,
    2. useState는 초기값을 전달 받고, 기존에 가지고 있던 값이 undefined 라면 초기값 적용.
    3. 이후 value와 setStateFn을 반환
  2. setState를 호출해 상태 값에 변경 발생
    1. 변경된 값을 할당
    2. 컴포넌트 리-렌더링
  3. 리-렌더링 후 컴포넌트 재 호출
    1. 재호출되고 initialValue를 전달
    2. 하지만 이미 기존에 가진값이 undefined가 아니기 때문에, 초기화 하지 않고 value와 setStateFn 반환

 

 

정리

setState를 실행하고, 상태가 바로 변경되지 않고 이전값을 그대로 유지한다
→ 리-렌더링이 되기 전까지 현재 상태는 유지된다

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

'React' 카테고리의 다른 글

[React + Vite + Nginx + Docker + AWS] 를 활용하여 배포 해봅시다!  (0) 2024.06.05
[React, Typescript] Intersection Observer를 활용하여, 사용자 화면에 맞게 변화하는 컴포넌트 만들기  (1) 2024.05.14
JSX  (0) 2023.05.17
React의 특징과 장점, 적용 예제 까지!  (0) 2023.05.16
Axios Custom Hook TypeScript 환경으로 만들기  (0) 2023.05.08
'React' 카테고리의 다른 글
  • [React + Vite + Nginx + Docker + AWS] 를 활용하여 배포 해봅시다!
  • [React, Typescript] Intersection Observer를 활용하여, 사용자 화면에 맞게 변화하는 컴포넌트 만들기
  • JSX
  • React의 특징과 장점, 적용 예제 까지!
설탕시럽
설탕시럽
설탕시럽의 Web Tech Blog 입니다.
  • 설탕시럽
    SugarSyrup Tech Blog
    설탕시럽
  • 전체
    오늘
    어제
    • 분류 전체보기 (48) N
      • HTML & CSS (2)
      • JavaScript (6)
      • React (16)
      • Node (1) N
      • BackEnd (1)
      • 회고 (5)
        • 엄브렐라 개발일지 (1)
        • 인턴 회고!!! (2)
      • 컴퓨터 기초 (4)
        • 운영체제 (2)
        • SICP (1)
      • 코딩테스트 (10)
      • 짧은 글 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    리액트
    document
    docker
    React
    nginx
    SQL
    인턴
    TypeScript
    php
    코딩테스트
    프로그래머스
    AWS
    error
    티스토리챌린지
    level1
    top-level await
    css
    회고
    EC2
    JS
    Element
    에러
    JavaScript
    운영체제
    자바스크립트
    배포
    CodingTest
    오블완
    프론트엔드
    타입스크립트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
설탕시럽
useState 딥다이브
상단으로

티스토리툴바