처음에는 좋아요의 상태를 해당 컴포넌트에서 useState를 처리해서 사용하려 하였다. 하지만 제로초님은 따로 useState로 관리를 하지 않고 서버상태를 직접 바꿔주고 컴포넌트안에서 find로 직접 연산하는 방법을 선택하였다.
const [isLiked, setIsLiked] = useState(
data.Likers.find((v) => me?.id && v.id === me.id)
);
// 1. like누르면 서버로 mutate를 하고 성공시 state를 업데이트
// 2. UI는 isLiked state를 value로 받음
const likeMutation = useMutation<Post, AxiosError, number>(['post', post.id], likePostAPI, {
onMutate() {
if (!me) return;
queryClient.setQueryData<InfiniteData<Post[]>>('posts', (data) => {
const found = data?.pages.flat().find((v) => v.id === post.id);
if (found) {
found.Likers.push({ id: me.id });
}
return {
pageParams: data?.pageParams || [],
pages: data?.pages || [],
};
});
},
onSettled() {
queryClient.refetchQueries('posts');
},
});
const liked = post.Likers.find((v) => me?.id && v.id === me.id);
liked라는 변수를 만들고 mutate시에 서버 상태에 직접 접근해서 값을 변경해주는것을 볼수 있다.
처음에는 내가 사용한 방법이 좀더 직관적이고 연산도 필요없으니 더 좋을것 같다고 생각했지만 좀 더 생각해보니 두번째 방법을 사용하면 더 좋은 장점들이 생기게 된다.