처음 코드를 짤 때 문제에 대한 응답을(onClick 이벤트가 일어날 때 마다) 할 때에 다음 문제에 대한 인덱스를 통신하는 url의 쿼리스트링에 담는 방식로 통신하였다.
각 문제마다 통신을 매번하는 것이다.
이는 그때 그때 받아오면 딜레이가 생길 수 밖에 없어서 사용자 경험 측면에서 좋지 않다.
const fetchFirstQuestion = async () => {
try {
const gotFirstQues = await axios.get(`${URL}/poll/${quesNumUrl}`);
const data = await gotFirstQues.data.question_data;
setData(data);
// setAppearChoice(false);
} catch (error) {
console.log(error);
alert("다시 시도 바랍니다.");
}
};
//문제의 인덱스에 따라 통신함.
useEffect(() => {
if (quesNum === 1) {
setTimeout(() => {
fetchFirstQuestion();
}, 13500);
} else if (quesNum === 14) {
props.getData(pickedData, type);
props.getLoadingStatus(true);
} else {
fetchFirstQuestion();
}
}, [quesNum]);
⇒ 지금 블로그를 작성하면서 보니 통신하는 함수를 담은 변수의 이름을 처음 코드를 작성하는 단계의 변수명을 그대로 사용하여 가독성을 떨어뜨리는 변수명 을 그대로 사용하였었다. 반성!!!
const [wholeData, setWholeData] = useState([]);
.
.
.
const fetchWholeQues = async () => {
try {
const gotWholeQues = await axios.get(`${URL}/poll/question`);
const data = await gotWholeQues.data.question_data;
setWholeData(data);
} catch (error) {
console.log(error);
alert("다시 시도 바랍니다.");
}
};
useEffect(() => {
fetchWholeQues();
}, []);
⇒ 저장된 전체 문제에 대한 데이터를 props로 전달하여 해당하는 문제의 인덱스에 접근하여 렌더시켰다.
{props.wholeData &&
props.wholeData.map((quesData, i) => {
return (
<LoadingImg
src={quesData.image_url}
alt="로딩용 이미지"
key={i}
></LoadingImg>
);
})}
⇒ props로 받은 데이터에서 이미지 데이터만을 추출하여 미리 한번 띄워놓았다.
⇒ 이미지는 미리 띄웠지만 보이지 않게 감추었다. (사실 이 방법이 최선인지는 아직 모르겠다.)
⇒ console창을 통해서 본 코드에는 불필요한 즉, 이미지를 담고있지 않지만 map함수에 의해서 생성된 div가 보인다. ⇒ 이 또한 수정사항.