작성
·
21
·
수정됨
0
지난강의에서 useImmer에서 활용한 update함수에서는 push, splice와 같은 현재의 객체를 변환시키는 api를 활용했었습니다.
그래서 immer 가 적용된 상황에서는, 현재 객체를 변환시키는 것만이 답일것이라 생각해서,
오히려 filter api를 써야 코드가 더 간단해지는 상황에서는 useState를 따로 분리해서 써야 고민하고 있었습니다.
그런데 이번 강의에서 useImmerReducer에서 활용하는 것을 보아하니, State가 아니라 Immer 이 적용된 케이스더라도, return으로 새로운 객체를 반환하거나, 직접 객체에 변화를 주거나 하는 방법이 둘다 적용이 되는것으로도 보이는것 같더라구요?
case 'deleted':에서도
draft.filter에 return 이 적용되면, immerReducer라도 잘 작동하고,
return을 없애고, break로 나오게 하면, 변화가 아무래도 적용이 안되더라구요(당연하겠죠... 원래 객체에 변화를 준것이 아니니)
그래서 immer나 immerReducer를 활용한다는 것은 useState을 확장시키는 느낌인건가요? 직접객체에 변화를 주는것 뿐만아니라, useState에서 했던것처럼 새로운 객체를 만들어 return하는 것 '까지' 가능한건가요?
만약 immer가 적용된 상황에서, 직접 객체를 변환하는 코드와, 새로운 객체를 만들어 return 하는 코드가 하나에 전부 적용되어 있다면 어떻게 작용하나요?
다시 말해, draft.push로 '변경사항이 immer에 반영되고', 동시에return으로 draft.filter한 값을 보내면, 어떻게 작용하며, 어떤 로직이 적용되나요?
감사합니다
답변 1
0
안녕하세요 🙂
1. useState 확장인가? 네, 맞습니다. Immer는 둘 다 지원합니다:
직접 변경 (draft.push()
)
새 객체 반환 (return newArray
)
2. 둘이 함께 있으면?return
이 우선됩니다. 직접 변경은 무시됩니다.
3. 구체적 예시
case 'example':
draft.push(newItem); // 무시됨
return draft.filter(...); // 이것만 적용됨
핵심: return
이 있으면 모든 직접 변경사항은 무시되고, return
값이 새로운 state가 됩니다.