React 객체 state 관리와 useRef 활용하기

TIL

이전 글에서 다뤘던 배달 음식 주문 폼을 개선해봤다.

여러 개로 분리된 state를 하나로 통합하고, useRef를 활용해 입력 유효성 검사 기능을 추가했다.

구현 과정

State 통합하기

기존에 분리되어 있던 3개의 state를 객체 형태의 하나의 state로 합친다.

기존 코드

const [menu, setMenu] = useState("");
const [address, setAddress] = useState("");
const [request, setRequest] = useState("");

 

변경 후

const [state, setState] = useState({
  menu: "",
  address: "",
  request: "",
});

 

이에 맞춰 JSX의 value 속성도 수정한다.

return (
  <div>
    <h2>배달의민족 주문</h2>
    <select name="menu" value={state.menu} onChange={onChange}>
      <option>아이스크림</option>
      <option>젤리</option>
      <option>초콜릿</option>
    </select>
    <div>배달 주소</div>
    <input name="address" value={state.address} onChange={onChange} />
    <div>배달 요청사항</div>
    <textarea name="request" value={state.request} onChange={onChange} />
    <button onClick={onSubmit}>주문 완료</button>
  </div>
);

 

이벤트 핸들러 통합하기

하나의 state로 관리하게 되면서, 이벤트 핸들러도 하나로 통합할 수 있다.


스프레드 연산자(...)로 기존 state를 유지하고, 계산된 속성명([name])으로 해당 필드만 업데이트한다.

const onChange = (e) => {
  const { target: { name, value } } = e;
  setState({
    ...state,
    [name]: value,
  });
};

 

useRef로 입력 검증하기

useRef를 활용해 주소 입력 필드가 비어있을 경우, 해당 필드에 포커스를 강제한다.

const addressRef = useRef();

const onSubmit = () => {
  if (addressRef.current.value === "") {
    addressRef.current.focus();
    return;
  }
  alert(`주문이 완료되었습니다. 메뉴: ${state.menu}, 주소: ${state.address}, 요청사항: ${state.request}`);
};

 

주소 입력 필드에 ref 속성을 연결한다.

<input name="address" value={state.address} ref={addressRef} onChange={onChange} />

 

 

정리

  • 여러 개의 연관된 state는 객체로 통합해 관리할 수 있다.
  • 스프레드 연산자와 계산된 속성명을 활용하면 객체 state를 간편하게 업데이트할 수 있다.
  • useRef로 DOM 요소에 직접 접근해 포커스 제어가 가능하다.
  • 입력 유효성 검사 후 조건에 맞지 않으면 return으로 이후 로직을 중단할 수 있다.

'TIL' 카테고리의 다른 글

[CS50] 배열의 크기 조정하기  (0) 2025.11.08
React 컴포넌트 분리와 연동된 state 업데이트  (0) 2025.11.08
React로 사용자 입력 관리하기  (0) 2025.11.08
[CS50] 메모리 - 파일 입출력  (0) 2025.11.08
[CS50] 메모리 - 메모리 교환, 스택, 힙  (0) 2025.11.08
'TIL' 카테고리의 다른 글
  • [CS50] 배열의 크기 조정하기
  • React 컴포넌트 분리와 연동된 state 업데이트
  • React로 사용자 입력 관리하기
  • [CS50] 메모리 - 파일 입출력
고견
고견
개발 자국 남기기
  • 고견
    개발자국
    고견
  • 전체
    오늘
    어제
    • 분류 전체보기 (157) N
      • Frontend (29)
        • Next.js (16)
        • JavaScript (7)
      • CS (19) N
        • 자료구조 (9)
        • 알고리즘 (5)
        • 운영체제 (4) N
        • 네트워크 (1) N
      • TIL (93)
      • Dev Log (16)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    앱 라우터
    페이지 라우터
    ai 감성 일기장
    CS
    Next.js
    타입 좁히기
    바닐라 자바스크립트
    emotion diary
    문자열
    react
    algorithm
    Trouble Shooting
    클래스
    generic
    함수 타입
    배열
    javascript
    memory
    알고리즘
    Pages Router
    자료구조
    Spa
    C
    제네릭
    트러블 슈팅
    cs50
    useState
    인터페이스
    App Router
    typescript
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
고견
React 객체 state 관리와 useRef 활용하기
상단으로

티스토리툴바