TIL/React
React) 객체 형태로 여러개의 state 관리하기 <TIL_2022_07_25>
Dev_to_freedom
2022. 7. 25. 22:31
프로필 정보 수정 - 객체 형태로 여러개의 state 관리하기
이렇게 총 네가지 항목의 값을 수정하는 기능을 구현해야 하는 경우, onChangeNickname, onChangeJob, … 이렇게 onChange와 useState를 변수마다 각각 지정하여 사용하는 방법도 있지만 최선은 아니다.
(코드도 더 길어지고, 메모리 측면에서도 비효율적인 것 같다. 자세한 원리까지는 아직 잘 모르겠다)
가장 좋은 방법은 각 <input> 태그에 name 속성을 지정하여 이벤트가 발생했을때 그 값을 참조하는 것.
useState로 문자열이나 배열 뿐만 아니라 객체 형태도 관리할 수 있다.
// user는 DB에서 받아온 유저 정보 객체
const [userInputs, setUserInputs] = useState({
nickname: user.nickname,
job: user.job,
company: user.company,
desc: user.desc,
});
// 구조분해할당. const nickname = userInputs.nickname, ... 와 같은 기능을 한다.
const { nickname, job, company, desc } = userInputs;
const onChangeInputs = (e) => {
const { name, value } = e.target;
// 불변성을 지켜야 함
setUserInputs({
...userInputs,
[name]: value,
});
};
객체의 상태를 업데이트 해줄 때에는
기존의 객체 상태를 복사해놓은 다음,
복사한 값에서 특정 값을 덮어씌운 후 그 값을 업데이트할 객체의 새로운 상태로 설정해줘야 함!
이러한 과정을 ‘불변성을 지킨다'고 표현함.
jsx 코드는 다음과 같다.
...
<ModalContent onSubmit={onSubmit}>
<ModalElement>
<label htmlFor="nickname">닉네임</label>
<input
type="text"
name="nickname"
defaultValue={user.nickname}
placeholder={user.nickname}
onChange={onChangeInputs}
/>
</ModalElement>
<ModalElement>
<label htmlFor="job">직업</label>
<input
type="text"
name="job"
defaultValue={user.job}
placeholder={user.job}
onChange={onChangeInputs}
/>
</ModalElement>
<ModalElement>
<label htmlFor="company">직장</label>
<input
type="text"
name="company"
defaultValue={user.company}
placeholder={user.company}
onChange={onChangeInputs}
/>
</ModalElement>
<ModalElement>
<label htmlFor="desc">자기소개</label>
<input
type="text"
name="desc"
defaultValue={user.desc}
placeholder={user.desc}
onChange={onChangeInputs}
/>
</ModalElement>
<button>변경완료</button>
</ModalContent>
...