Daily log

input, select, textarea 등 입력 엘리먼트들을 아래와 같이 상태관리 한다고 했을 때 더 효율적으로 관리할 수 있도록 개선

Register.jsx

개선 전

// 간단한 회원가입 폼
// 1. 이름
// 2. 생년월일
// 3. 국적
// 4. 자기소개

import { useState } from "react";

const Register = () => {
  const [name, setName] = useState("이름"); // 초기값: 이름
  const [birth, setBirth] = useState(""); // 초기값:
  const [country, setCountry] = useState("");
  const [bio, setBio] = useState("");
  const [input, setInput] = useState({
    name: "",
    birth: "",
    country: "",
    bio: "",
  });

  const onChangeName = (e) => {
    setName(e.target.value);
  };
  const onChangeBirth = (e) => {
    setBirth(e.target.value);
  };
  const onChangeCountry = (e) => {
    setCountry(e.target.value);
  };
  const onChangeBio = (e) => {
    setBio(e.target.value);
  };

  return (
    <div>
      <div>
        <input value={name} onChange={onChangeName} placeholder={"이름"} />
      </div>
      <div>
        <input value={birth} onChange={onChangeBirth} type="date" />
      </div>
      <div>
        <select value={country} onChange={onChangeCountry}>
          <option></option>
          <option value="kr">한국</option>
          <option value="us">미국</option>
          <option value="uk">영국</option>
        </select>
        {country}
      </div>
      <div>
        <textarea value={bio} onChange={onChangeBio} />
      </div>
    </div>
  );
};

export default Register;

개선 후

// 간단한 회원가입 폼
// 1. 이름
// 2. 생년월일
// 3. 국적
// 4. 자기소개

import { useState } from "react";

const Register = () => {
  const [input, setInput] = useState({
    name: "",
    birth: "",
    country: "",
    bio: "",
  });
  console.log(input);

  const onChange = (e) => {
    setInput({
      ...input /* spread 연산자를 이용해서 기존 input(state)에 들어있던 값들을 변경하지 않고 그대로 유지하도록 하기위해서 추가,
                  만약 입력하지 않으면 이름 입력시 birth나 country, bio가 없는 객체로 인식됨 */,
      [e.target.name]: e.target.value,
    });
  };

  return (
    <div>
      <div>
        <input
          name="name"
          value={input.name}
          onChange={onChange}
          placeholder={"이름"}
        />
      </div>
      <div>
        <input
          name="birth"
          value={input.birth}
          onChange={onChange}
          type="date"
        />
      </div>
      <div>
        <select name="country" value={input.country} onChange={onChange}>
          <option></option>
          <option value="kr">한국</option>
          <option value="us">미국</option>
          <option value="uk">영국</option>
        </select>
        {input.country}
      </div>
      <div>
        <textarea name="bio" value={input.bio} onChange={onChange} />
      </div>
    </div>
  );
};

export default Register;

 

 


인프런 이정환 강사님 강의를 참고해서 정리했습니다. 링크

 

한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지 강의 | 이정환 Winterlood - 인프런

이정환 Winterlood | , 리액트, 한 강의로 끝장낼 수 있어요.한 입 크기로 잘라먹을 수 있도록 도와드릴게요. 🔥[임베딩 영상][사진]많은 수강생 여러분이 사랑해 주신 덕분에 인사이트 출판사와 함

www.inflearn.com

 

'개발 > React' 카테고리의 다른 글

React - Hooks  (1) 2025.06.01
React - useRef  (0) 2025.06.01
React - State와 Props  (0) 2025.06.01
React - State로 상태 관리  (0) 2025.06.01
React - 이벤트 핸들링(Event Handling)  (0) 2025.06.01

공유하기

facebook twitter kakaoTalk kakaostory naver band