프로젝트(LibertyForm) 진행 중 백엔드에서 설문 상세 정보(JSON)를 받았고 배열 형태로 받았지만 내가 원하는 형태의 데이터가 아니었다. 따라서 받은 데이터를 useState에 담고, 반복문을 돌려 setState를 하려고 했다.
BUT, 반복문으로 setState를 사용하니 데이터가 쌓이는게 아닌 마지막 setState만 적용이 되었다.
setState는 상태를 즉각 업데이트 하지 않고, Promise를 통해 비동기적으로 상태를 변경시킨다.
→ 반복문을 돌리는 과정에서 setState를 사용해도, 반복문이 끝나기 전까지 setState가 적용되지 않는다.
→ 결국 반복문을 돌려도 state가 바뀌지 않아서, 계속 초기상태의 state를 사용하기에 축적이 불가능!
반복문을 통한 setState를 어떻게 다른 방법을 사용할 수 있을지 많은 고민을 했다.
//Preview.js
useDidMountEffect(() => {
let choice = surveyDetail.choiceQuestions.map((choiceQuestion) => ({ ...choiceQuestion.question, choices: choiceQuestion.choices })) // 객관식 문제만 따로 빼준다
setNewSurveyDetail((prev) => ({ ...surveyDetail, questions: [...surveyDetail.questions, ...choice] })) // 주관식과 객관식 문제를 합쳐준다.
}, [surveyDetail]);