검색해 보면 '변하지 않는 성질' 이라 정의하고 있음. JS에서 불변성이란 '기존의 값을 그대로 유지하면서 새로운 값을 추가 하는것'을 말함.
const a = [];
const b = a;
console.log(a === b); // true
const c = [...a];
console.log(a === c); // false
const [state, setState] = useState(
{
1:1,
2:2
}
);
setState({
...state, // 기존의 값 복사
3: 3
})
전개연산자를 통하여 객체나 배열의 값을 복사할때는 얕은 복사를 하게 됨. 즉 완전히 새로 복사 하는게 아니라 가장 바깥쪽에 위치한 값만 복사 됨.
const a = [{1:1, 2:2}];
const b = [...a];
console.log(a === b); // false // a와 b는 다른배열.
console.log(a[0] === b[0]); // true // 요소들은 같은 요소임. 얕은 복사 했기 때문.
b[0] = { // 값을 새로 할당
...b[0]
}
console.log(a[0] === b[0]); // false // 이제 다른 요소.
위의 문제를 해결하기 위해 나온 라이브러리가 바로 Immer.js 임. 상태를 업데이트할때 불변성을 관리해줌.
import produce from "immer";
const [state, setState] = useState(
{
1:1,
2:2
}
);
setState(produce(state, draft => {
draft[3] = 3;
}))