React + JS에서 객체 업데이트를 해야한다면,
**이렇게 말고**
setPerson({
firstName: e.target.value, // New first name from the input
lastName: person.lastName,
email: person.email
});
**이렇게**
setPerson({
...person, // Copy the old fields
firstName: e.target.value // But override this one
});
불변객체이기 때문에 직접 넣어 줄 수 없다.
... 문법을 써야한다.
여기까지는 크게 불편하지 않는데, 객체 안에 객체가 있는 중첩 형태라면 꽤 귀찮아진다.
const [person, setPerson] = useState({
name: 'Niki de Saint Phalle',
artwork: {
title: 'Blue Nana',
city: 'Hamburg',
image: '<https://i.imgur.com/Sd1AgUOm.jpg>',
}
});
person.artwork.city = 'New Delhi'; << 불변임으로 이렇게 직접 바꾸는건 불가능
const nextArtwork = { ...person.artwork, city: 'New Delhi' };
const nextPerson = { ...person, artwork: nextArtwork };
setPerson(nextPerson);
혹은
setPerson({
...person, // Copy other fields
artwork: { // but replace the artwork
...person.artwork, // with the same one
city: 'New Delhi' // but in New Delhi!
}
});
이렇게 해야함. 얕은 복사-> 한단계만 복사 되므로 중첩된건 중첩안에서 또 따로 처리
너무 장황함.
너무 장황해지는 문제를 해결하기 위해
immer 라이브러리를 쓰게 된다.
**immer** -> 중첩된 라이브러리 매우 간편
updatePerson(draft => {
draft.artwork.city = 'Lagos';
});
마치 '직접' 대입해서 '적용' 된 것 처럼 보인다.
그래서 사용하면 코드가 매우 간결해지고 좋아진다.
다만, "불변객체에 직접 '대입'하는게 가능하다 "로 착각만 하지 않으면 될 것 같다.
'React > library' 카테고리의 다른 글
Tailwind 추가설정 (0) | 2024.11.23 |
---|