피드 게시물의 따봉 버튼을 클릭했을 때 숫자 1이 올라가고 색깔이 채워진 손모양이 나오도록 구현하고자 했다.
🚨 발생한 문제
patch 메서드로 db.json에 있는 thumb 데이터를 수정하고자 했는데 patch 는 실행이 되었지만 페이로드가 빈값이어서 값 변경이 안되었다. 값 전달이 어디서 잘못되었는지 한참 헤맸다.
작성했던 코드
// json-server 에 patch 로 api 통신한 코드
export const updateThumb = async (FeedId, newThumb) => {
await feedInstance.patch(`/feed/${FeedId}`, newThumb);
};
버튼의 onClick 이벤트에 addThumb(currentFeedId, { thumb: thumbCount }) 로 인자를 보내줬다고 생각했는데 patch는 성공하지만 payload 는 빈 객체였다.
// Thumb.jsx
const Thumb = ({ currentFeedId, currentThumb }) => {
const [isClicked, setIsClicked] = useState(false);
const [thumbCount, setThumbCount] = useState(currentThumb);
const updatedThumbCount = isClicked ? thumbCount - 1 : thumbCount + 1;
const queryClient = useQueryClient();
const handleThumb = () => {
setIsClicked((prev) => !prev);
setThumbCount(updatedThumbCount);
};
const { mutate: addThumb } = useMutation({
mutationFn: updateThumb,
onSuccess: () => {
queryClient.invalidateQueries(["feed"]);
}
});
return (
<div>
<button
onClick={() => {
handleThumb();
addThumb(currentFeedId, { thumb: thumbCount });
}}
>
{isClicked ? <p>클릭됨</p> : <p>클릭안됨</p>}
</button>
{thumbCount}
</div>
);
};
export default Thumb;
✅ 해결 방법
useMutation의 mutationFn을 updateThumb 로만 작성하는게 아니라, updateThumb에 콜백함수 쓰듯이 매개변수로 id를 넣어주고 인자에 id와 전역변수인 thumbCount를 넣어주었다. thumbCount를 updateThumb에 직접 넣어주었으므로 addThumb에는 줄필요가 없어서 currentFeedId 만 인자로 넣어주었더니 페이로드가 잘 들어간 것을 확인할 수 있었다.
db.json에도 patch가 정상적으로 잘 적용되었다.
수정한 코드
const Thumb = ({ currentFeedId, currentThumb }) => {
const [isClicked, setIsClicked] = useState(false);
const [thumbCount, setThumbCount] = useState(currentThumb);
const updatedThumbCount = isClicked ? thumbCount - 1 : thumbCount + 1;
const queryClient = useQueryClient();
const handleThumb = () => {
setIsClicked((prev) => !prev);
setThumbCount(updatedThumbCount);
};
const { mutate: addThumb } = useMutation({
// id를 매개변수로 받고 인자로 id와 thumbCount를 넣어줌
mutationFn: (id) => {
updateThumb(id, thumbCount);
},
onSuccess: () => {
queryClient.invalidateQueries(["feed"]);
}
});
return (
<div>
<button
onClick={() => {
handleThumb();
addThumb(currentFeedId);
}}
>
{isClicked ? <p>클릭됨</p> : <p>클릭안됨</p>}
</button>
{thumbCount}
</div>
);
};
https://tanstack.com/query/v3/docs/framework/react/reference/useMutation
- mutationFn: (변수: TVariables) => Promise<TData>
- 필수의
- 비동기 작업을 수행하고 약속을 반환하는 함수입니다.
- 변수는 mutate가 mutationFn 에 전달할 객체입니다 .
🥲 느낀점
useMutation 부분이 아니라 mutate 인 addThumb의 인자로 뭔가를 잘못 넣어줬다고 생각해서 계속 이부분만 파고 검색하고 했었다.
어떻게 보면 간단한 부분이었는데 잘 못찾아서 엄청 헤맸다..ㅠ 앞으로 뭔가 안될때 그 부분과 엮여있는 코드 하나하나 다 뜯어봐야겠다고 느꼈고 탠스택쿼리도 좀 더 익숙해지도록 연습해야겠다.
'TIL' 카테고리의 다른 글
아웃소싱 팀 프로젝트 ④ - Infinite Scroll (0) | 2024.09.20 |
---|---|
아웃소싱 팀 프로젝트 ③ - 카카오맵 api 로 자전거 경로 지도 출력 (0) | 2024.09.19 |
아웃소싱 팀 프로젝트 ① - 기획 (1) | 2024.09.13 |
Github PR 로만 merge 하도록 설정 (0) | 2024.09.12 |
개인과제 - MBTI 성격 유형 테스트 ③ (2) | 2024.09.11 |