기존의 state 객체 업데이트
state 객체를 업데이트 할 때, 중첩된 객체일 경우 얕은 복사가 되기 때문에 전개 연산자를 사용해 객체를 복사 한 후 업데이트를 해야한다.
예를 들면 기존 객체가 이런식이라고 치면
const initialState={
name:'yoon',
information:{
age:24,
university:'hangook',
major:'economy'
}
}
기존에서 major의 값을 업데이트 하려고 할 때
setState({
...obj,
information:{
...obj.information,
major:'computer-engineering'}
})
이런식으로 처리를 해야한다.
useImmer를 사용하면 중첩된 객체의 값을 직접 변경할 수 있는 것 처럼 보이기 때문에 편리하다.
useImmer 사용하기
npm install immer use-immer
먼저 use-Immer를 임포트 한 후
import {useImmer} from 'use-immer';
useState를 사용할 때 처럼 그 위치에 useImmer를 사용하면 된다.
import {useImmer} from 'use-immer'
const App=()=>{
const [info,setInfo]= useImmer(initialState)
return (<div>
<div>{info.name}</div>
<div>{info.information.age}</div>
</div>)
}
객체를 업데이트 하고 싶을 때 useState처럼 하되, 아래와 같이 하면 된다
setInfo(draft=>{
draft.information.major='computor-engineering'
draft.name='eun'
})
안에 콜백함수를 사용하여 info.information.major 값을 직접 변경한다.
실제로 직접 변경하는 것 처럼 보이지만, 새로운 객체를 생성한다고 한다.
참고자료
https://www.npmjs.com/package/use-immer
https://react.dev/learn/updating-objects-in-state#write-concise-update-logic-with-immer
'Today I learned! > 오늘 하루 배운 것, 기억할 것' 카테고리의 다른 글
[HTML+React] contenteditable 속성 (0) | 2023.11.09 |
---|---|
[React] 모달 영역 밖 클릭 시 모달 닫히게 하기 (0) | 2023.08.02 |
[JS]제너레이터 (0) | 2023.06.25 |
[JS] "복사 방지" 구현 (0) | 2023.06.19 |
[JS]Array.prototype.at() (0) | 2023.05.24 |