setter 함수 전개구문
48
작성한 질문수 2
리엑트 객체 업데이트하기 강좌에 내용 중 질문입니다.
const handleTitleChange = (e) => {
setForm({
...form,
title: e.target.value,
});
};이런 부분이 있는데요.
...form이 title:e.target.value 보다 앞서 나와야 정상 작동하더라구요. javascript 문법을 정확히 몰라서 그런건지 모르겠지만, 전개구문을 앞에 둬야 되는 이유(?)가 있을까요? 그냥 이렇게 사용하는거니 익숙해지면 되나요?
답변 2
0
안녕하세요! 😊
JavaScript 객체의 속성 덮어쓰기 규칙 때문입니다.
JavaScript에서는 같은 키가 여러 번 나오면 마지막 값이 덮어쓰여져요!
// 현재 form 상태가 이렇다고 가정해볼게요
const form = { title: "기존 제목", content: "기존 내용" };
// ✅ 올바른 방법 (전개구문 먼저)
const newForm = {
...form, // 기존 모든 값 복사
title: "새로운 제목" // title만 새 값으로 덮어쓰기
};
// 결과: { title: "새로운 제목", content: "기존 내용" }
// ❌ 잘못된 방법 (전개구문 나중에)
const wrongForm = {
title: "새로운 제목", // 이 값을 설정했지만...
...form // 전개구문이 다시 덮어버림!
};
// 결과: { title: "기존 제목", content: "기존 내용" }
이 패턴은 React에서 표준 방식이니까 계속 사용하시다 보면 자연스럽게 손에 익으실 거예요! 👍
0
안녕하세요, 인프런 AI 인턴입니다. 택군님.
질문하신 코드와 관련된 내용은 JavaScript의 전개 구문(Spread syntax)과 객체 병합에 대한 것입니다. 이 구문을 이해하는 것은 React에서 효율적으로 상태를 관리하고 업데이트하는 데 매우 중요합니다.
전개 구문과 객체 병합
전개 구문
...form을 사용하면form객체의 모든 프로퍼티를 현재 위치에 복사합니다. 이는 객체를 복사하거나 새 객체로 병합할 때 사용됩니다.객체 병합에서 나중에 나오는 키의 값이 앞의 키의 값을 덮어씌우게 됩니다. 즉,
{ ...form, title: e.target.value }는 기존form의 내용을 복사한 후,title프로퍼티의 값을e.target.value로 덮어씌웁니다.
왜 전개 구문이 앞에 와야 하는가?
- 전개 구문
...form이 앞에 오는 이유는 기존 객체의 내용을 먼저 복사한 후, 변경하려는 프로퍼티(title)를 덮어씌우기 위해서입니다. 만약 순서를 바꾸면, 이전에 설정한title값이 전개 구문에 의해 덮어써져 버리기 때문에, 변화가 반영되지 않습니다.
결론
이 패턴을 통해 객체 안에서 특정 프로퍼티만 업데이트하고 나머지 프로퍼티는 그대로 유지할 수 있습니다. 이를 통해 상태를 일관성 있게 관리할 수 있습니다. 이러한 사용법에 익숙해지면 React에서의 상태 관리를 보다 효과적으로 수행할 수 있습니다.
관련 참고 자료는 다음과 같습니다:
- Understanding Spread Syntax and Object Cloning in JavaScript
- React State Management and Spread Syntax
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
오타?
0
30
1
뭐하나 여쭤봐도 될까요?
0
70
1
안녕하세요 질문이 있습니다.
0
56
2
질문 : 삭제 버튼 아규먼트 (id)
0
50
1
Tailwind 버전 확인
0
63
1
align-items 정렬
0
50
2
vite 명령어로 프로젝트를 만들었습니다. (vscode)
0
79
1
31. 객체 업데이트 하기 - 10:15 질문
1
56
2
강의교안, 내용 인용해서 블로그 글 작성
1
80
2
이미지가 출력되지 않아요
1
76
2
강의와 만들어진 코드가 달라요
0
76
3
AI와 CSS 라이브러리의 궁합
0
97
1
onClick 이벤트에 함수 넘길 때
0
68
1
린캔버스 기능 구현은 왜 못하나요.... 구현하고 싶습니다...
0
101
1
notes 없음 읽기 오류
0
72
1
Object.assign 문법
0
64
1
react-router 전혀 기능 안함
0
54
1
react-router-dom@6.25.1
0
47
1
React Router 최신 스펙
0
209
1
Immer 에서 filter, map 사용
0
55
1
vite 설치에 대해 질문있습니다.
0
76
2
라이브러리 버전 일치 이슈
0
77
1
"Enter 키 발생 시 항목 추가" 부분에서 공백이 포함되면 한 줄이 더 입력됩니다
0
51
2
TotalCounter을 작성할때
0
66
2





