프로그래밍에서 불변성을 지킨다는 뜻은 ?
메모리 영역의 값을 직접적으로 변경하지 않는다는 의미이다
const [state, setState] = useState(초기값)
에서 setState(변경할값) 함수가 실행될때 변경되기 전의 상태와 비교해서 그 값이 다르면 re-rendering이 된다.
이때 불변성을 지키지않고, 메모리 영역의 값을 직접 변경하면 리액트는 state가 바뀌었다고 인지하지 못한다 (렌더링이 되지 않음)
왜냐하면 리액트는 이전 state와 이후 state를 비교할 때, 얕은 비교(Shallow Compare) 때문이다
//state가 객체형태일때
const [info, setInfo] = useState({
count: 0,
show: true,
operator: operators[0]
})
state의 접근은 info.count
info.show
info.operator
형태로 나타내고
setState를 나타내는 방법은 setInfo({...info, show: !info.show})
스프레드 연산자를 사용하거나,
잘못된 접근
- info.show = !info.show
- const newInfo = info
state가 객체형태이기 때문에 주소만 복사하여 리액트가 객체가 변경되었다고 인지하지 못한다
const [array, setArray] = useState(["a", "b", "c", "d"])
array[0] = "e"; //재할당
const newArray = array;
//setArray(newArray) : 주소만 복사되므로 변화 인지 못함
1 setArray([...array, newItem])
2 setArray(array.filter(arr=>{조건})
//새로운 배열을 반환하는 메소드를 사용