리액트 훅 중 가장 많이 언급될만한 훅이다. useState
는 함수 컴포넌트 내부에서 상태를 정의하고 이 상태를 관리할 수 있게 해줌.
useState 훅의 기본적인 사용법은 다음과 같다.
import { useState } from 'react';
const [state, setState] = useState(initialState);
state
의 초깃값은 undefined
state
는 useState
, setState
함수의 실행이 종료된 이후에도 참조 가능일반적으로 useState()
인수로 원시값 넣는데, 인수로 특정 값을 리턴하는 함수를 넘길 수 있어.
이걸 lazy initialization, 게으른 초기화라고 부른다.
// 일반적인 useState 사용
const [count, setCount] = useState(Number.parseInt(window.localStorage.getItem(cacheKey)));
// 게으른 초기화: 함수를 실행해 반환함
const [count, setCount] = useState(() => Number.parseInt(window.localStorage.getItem(cacheKey)));
리액트 공식 문서: lazy initialization에 따르면,
useState
초깃값이 복잡하거나 무거운 연산을 포함할 경우에, 게으른 초기화 사용을 권장state
가 만들어질때만 사용. 리렌더링시, 이 함수의 실행은 무시useState
의 값도 재실행.useState
인수로 값 자체를 주면, 초기렌더링이나 리렌더링 모두 (초깃값이 있으나 없으나) 해당값에 접근해서 낭비 발생.localStorage, sessionStorage, 배열연산자
에는 게으른 초기화!상태 갱신 함수에 콜백을 전달하는 것은 최신 상태 값을 기반으로 상태를 갱신하기 위함
지연된 상태 참조 방지에 도움
const [count, setCount] = useState(0);
// 잘못된 예시 - 상태가 최신 상태가 아닐 수 있음
const incrementIncorrect = () => {
setCount(count + 1); // 이 시점의 `count` 값은 최신이 아닐 수 있음
setCount(count + 1); // 여전히 최신 상태가 아닐 수 있음
};
// 올바른 예시 - 콜백을 사용하여 최신 상태 값으로 갱신
const incrementCorrect = () => {
setCount(prevCount => prevCount + 1); // 첫 번째 업데이트
setCount(prevCount => prevCount + 1); // 두 번째 업데이트
};