React

React - UseState

bergerac 2025. 5. 4. 09:11

useState란?

  • React에서 제공하는 기본 Hooks 중 하나
  • 함수형 컴포넌트에서 상태(state) 를 관리하기 위한 기능
  • 컴포넌트 단위로 상태를 저장하고, 변화 시 자동으로 재렌더링이 발생
const [state, setState] = useState<타입>(초기값);

구성 요소

  • state: 현재 상태 값 (변수)
  • setState: 상태를 변경하는 함수
    • 보통 set + 상태이름 형식으로 명명 (setCount, setName 등)
  • <타입>: TypeScript 사용 시, 상태의 타입을 명시 가능 (선택)
  • 초기값: 상태의 초기값

사용 시 주의사항

  1. useState는 반드시 컴포넌트 최상단에서만 호출 가능
    ❌ 조건문, 반복문, 함수 내부 등에서는 사용 불가
  2. useState는 호출될 때마다 배열을 반환
    • 첫 번째 요소는 상태값
    • 두 번째 요소는 상태 업데이트 함수

상태 변경 방식

✅ 일반 방식

setCount(count + 1);
setCount(count + 1);

이렇게 하면 두 번째 호출에서 이전 상태 변화(count + 1)를 인식하지 못함
→ 결과적으로 한 번만 증가

✅ 함수형 업데이트 방식 (추천)

setCount(prev => prev + 1);
setCount(prev => prev + 1);

prev는 최신 상태값을 의미
→ 누적 반영되어 최종적으로 +2가 적용됨


 실전 예제

const [count, setCount] = useState<number>(0);
const [message, setMessage] = useState<string>('안녕하세요');
const [msg, setMsg] = useState<string>('hi'); // 조건문 내에서 사용하면 안 됨!

const handleUpClick = () => {
  setCount(prev => prev + 1);
  setCount(prev => prev + 1); // +2
}

const handleDownClick = () => {
  setCount(prev => prev - 1);
  setCount(prev => prev - 1); // -2
}

 


출력 결과

<p>You clicked {count} times</p>
<button onClick={handleUpClick}>카운트 +2 증가</button>
<button onClick={handleDownClick}>카운트 -2 감소</button>

<p>{message}</p>
<p>{msg}</p>

useState로 폼 데이터 상태 관리하기

useState는 단일 값뿐 아니라 여러 개의 입력 필드가 있는 폼(form) 을 관리할 때도 유용하게 사용할 수 있다. 이 글에서는 다음 내용을 다룬다:

  • 단일 input/select 요소의 상태 관리
  • 객체 형태로 묶인 여러 개의 input 상태 관리
  • 이벤트 핸들러 분리 및 초기화 처리

기본적인 input 상태 관리

useState로 하나의 값을 상태로 관리할 수 있으며 사용자 입력을 실시간으로 추적할 때 사용된다.

const [inputValue, setInputValue] = useState<string>("");
<input
  type="text"
  value={inputValue}
  onChange={(e) => setInputValue(e.target.value)}
/>

 

onChange이벤트란?

사용자가 input, textarea, select등의 요소에 변화를 줄 때 발생하는 이벤트

매번 변화할 때마다 setInputValue로 갱신한다.

<select onChange={(e) => setInputValue(e.target.value)}>
  <option value="lotte">lotte</option>
  <option value="kia">kia</option>
</select>

초기화버튼도 함께 제공해 UX 개선이 가능

<button onClick={() => setInputValue("")}>초기화 버튼</button>

 

여러개의 입력 필드 상태 관리하기

interface ILogin {
  id: string;
  password: string;
}

const loginInitialValue = {
  id: "",
  password: "",
};

const [login, setLogin] = useState<ILogin>(loginInitialValue);

폼 전체를 객체로 관리하면 구조가 깔끔해지고, 입력 필드가 많아질수록 이점이 커진다.

<input
  name="id"
  value={login.id}
  onChange={handleLoginChange}
/>

<input
  name="password"
  value={login.password}
  onChange={handleLoginChange}
/>

핸들러는 아래처럼 공통으로 처리한다.

const handleLoginChange = (e: React.ChangeEvent<HTMLInputElement>) => {
  const { name, value } = e.target;

  setLogin({
    ...login,
    [name]: value, // name값과 일치하는 속성만 갱신
  });
};

폼 전송 및 초기화 처리

전송 이벤트는 onSubmit을 통해 처리한다.

const handleLoginSubmit = (e: React.FormEvent) => {
  e.preventDefault(); // 새로고침 방지
  console.log('폼 데이터가 제출 되었습니다.', login);
  setLogin(loginInitialValue); // 상태 초기화
};

초기화 버튼도 따로 관리 가능하다.

<button type="button" onClick={handleResetLogin}>초기화</button>

 

'React' 카테고리의 다른 글

React - UseState에서 다양한 타입  (1) 2025.05.06
React - 이벤트 타입 처리  (0) 2025.05.05
React - 이벤트 핸들러  (0) 2025.05.03
React - Rendering  (1) 2025.05.02
React - Props  (0) 2025.05.01