배열 State 업데이트하기
변경하지 않고 배열을 업데이트하기
객체 state와 마찬가지로 배열 state도 읽기 전용으로 처리해야 합니다. 즉 배열 내부의 항목을 재할당하거나 변경하면 안됩니다.
그래서 배열을 변경하지 않고 업데이트하기 위해 새로운 배열을 만들어 state 설정 함수에 전달합니다. 원본 배열을 변경시키지 않는 filter() , map() 과 같은 함수를 사용하여 원본 배열을 복사한 새 배열을 만듭니다. 이후 state에 이 새 배열을 설정합니다.
원본 배열을 변경시키지 않는 배열 함수들
상황방법추가
concat, […arr] ( = spread 연산자)
제거
filter, slice
교체
map
정렬
배열을 복사한 이후 처리, sorted
여기서 Immer을 이용한다면 원본 배열을 변경시키는 것처럼 사용할 수 있습니다.
➕Immer란?
js의 불변성 관리를 쉽게 만들어주는 라이브러리
producer함수와 proxy를 활용하여 상태를 불변성 있게 업데이트함
원본 state가 아닌 draft 객체를 변경하기 때문에 직접 변경하는 것처럼 코드를 작성할 수 있음
코드가 간결해짐!
밑에서 배열에서 항목 추가/제거/변환/교체하는 예시를 코드와 함께 자세하게 보겠습니다.
배열에 항목 추가하기
concat이나 spread 연산자를 사용한다면 배열의 앞과 뒤에 요소를 추가할 수 있습니다.
concat을 사용한 방법
spread 구문을 사용한 방법
만약 배열의 중간에 요소를 삽입하고 싶다면 spread 구문과 slice() 함수를 함께 사용하면 됩니다.
slice() 함수를 통해 배열의 앞부분을 잘라내 붙이고, 새 항목을 추가하여 다시 slice()로 배열의 뒷부분을 덧붙입니다. 항목들은 모두 spread 연산자로 전개되어 하나의 배열로 합쳐집니다.
배열에서 항목 제거하기
기존 배열에서 특정 항목을 포함하지 않는 새 배열을 제공하는 방식(필터링)으로 배열을 수정하지 않고 원하는 항목을 쉽게 제거할 수 있습니다.
filter 함수를 사용한 방법
혹은 기존의 방식처럼 특정 위치의 요소를 없앤 새 배열을 반환하는 방식으로도 항목을 제거할 수 있습니다. 이때도 spread 연산자가 같이 사용됩니다.
slice 함수를 사용한 방법
배열에서 항목 교체하기
배열에서 특정 항목의 값을 교체하기 위해 map() 함수를 쓸 수 있습니다.
배열에서 항목 정렬하기
보통 정렬에 사용하는 reverse(), sort() 함수는 기존 배열 객체를 변경시키기 떄문에 사용할 수 없습니다.
때문에 먼저 배열을 복사한 뒤 변경하는 방법을 사용합니다.
이때 주의할 점은 배열을 복사할 때의 방식이 얕은 복사라는 것입니다. 복사한 새 배열의 객체는 원본과 동일한 객체를 참조하기 때문에, 복사된 배열의 객체 값을 수정하면 기존 state가 변경됩니다.
때문에 여기서는 정렬에만 사용하고 직접 값을 변경하지 않아야 합니다. 값 변경에는 위에서 안내한 함수들을 사용합니다.
배열의 객체를 업데이트할 때는 해당 객체의 요소를 모두 복사하여 새로운 요소를 추가하고, 추가한 요소만 변경하는 것이 좋습니다.
➕얕은 복사? 깊은 복사?
얕은 복사
원본 객체의 참조값 복사
원본/복사본에서 중첩된 데이터를 변경하면 서로 영향감
깊은 복사
원본 객체의 모든 데이터 복사
복사본과 원본이 완전히 다른 객체로 분리되어 서로 영향을 주지 않음
Last updated