[Project Refactoring]HomePage refactoring
HomePage에는 세 개의 커스텀 훅이 사용된다
- CommissionId로 filter된 Commissions
- ViewCount로 filter된 Commissions
- 랜덤 Tag로 filter된 Commissions
const commissionsFilterdCommissionId = getCommissionsFn("commissionId");
const commissionsFilterdViewCount = getCommissionsFn("viewCount");
const commissionsFilterdTags = getTagsCommissionsFn();
기존의 getTagsCommissionsFn
export const getTagsCommissionsFn = () => {
const [tag, setTag] = useState("그림");
const [tagsCommissions, setTagsCommissions] = useState(null);
const [loading, setLoading] = useState(true);
const randomNum = Math.floor(Math.random() * 10 + 1);
useEffect(() => {
const fetch = async () => {
const { data, status } = await getTags();
if (status < 300) {
const tagName = data.data[randomNum].tagName;
setTag(tagName);
}
};
fetch();
}, [setTag]);
useEffect(() => {
const fetch = async () => {
const { data, status } = await getTagsSearch(tag);
if (status < 300) {
setTagsCommissions(data.data);
setLoading(false);
}
};
fetch();
}, [setTagsCommissions, setLoading, setTag, tag]);
return { tagsCommissions, loading };
};
첫번째 useEffect는 getTags로 tag 10개를 가져오고 const tagName = data.data[randomNum].tagName 으로 랜덤으로 하나의 tag를 선택한다
선택된 tag는 setTag(tagName)로 useState 에 담긴다
이때 setTag의 useState에는 디폴트로 ‘그림’ 이 들어가 있는데 비어 놓으면 이상하게 에러가 날 때가 있었다.
순서가 어디선가 꼬일 때가 있다는 것이다.
그래서
바꾼 getTagsCommissionsFn
const randomNum = Math.floor(Math.random() * 10 + 1);
export const getTagsCommissionsFn = () => {
const [tag, setTag] = useState(null);
const [tagsCommissions, setTagsCommissions] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
const fetch = async () => {
const { data, status } = await getTags();
if (status < 300) {
const tagName = data.data[randomNum].tagName;
setTag(tagName);
}
};
fetch();
const fetchTwo = async () => {
const { data, status } = await getTagsSearch(tag);
if (status < 300) {
setTagsCommissions(data.data);
setLoading(false);
}
};
if (tag) {
fetchTwo();
}
}, [tag, setTag, setTagsCommissions, setLoading]);
return { tagsCommissions, loading };
};
우선 randomNum을 밖으로 뺐다. getTagsCommissionsFn가 여러 번 작동되는 것을 확인했고 randomNum이 바뀔 때 마다 다시 axios를 실행하게되니 가장 밖으로 빼는 선택을 했다.
그리고 useEffect를 나누는 것이 아니라 fetch 함수를 나누어서 하나의 useEffect 안에서 작동하도록 했고 실행 순서에 따라 fetch 함수를 불러왔다.
또한 첫 번째 fetch 함수로 tag를 설정하는 중에 fetchTwo 함수가 실행이되어 오류가 났다.
Uncaught (in promise) TypeError: Cannot destructure property 'data' of '(intermediate value)' as it is undefined. at fetchTwo (getCommissionFetch.js:54:1)
아마도 기존에도 이런 이유로 디폴드 state를 설정하지 않으면 오류가 났던 것 같은데 아무튼
fetchTwo를 if(tag) 안에 넣음으로써 tag가 있을 때 작동을 하게 했더니 깔끔하게 해결되었다.
댓글남기기