특정 시점
인데 팀원 분인 unmount 될 때 데이터를 업로드하는 아이디어를 주셨다. useEffect(() => {
const increasedViews = post.views + 1;
const increasePostView = async (increasedViews, postId) => {
await updatePostViews(increasedViews, postId);
};
const increaseLikeNum = async (postId, userId) => {
await insertLikeUser(postId, userId);
};
const decreaseLikeNum = async (postId, userId) => {
await delLikeUser(postId, userId);
};
return () => {
increasePostView(increasedViews, postId);
if (user && !isDataHasUser && isLike) increaseLikeNum(postId, userId);
if (user && isDataHasUser && !isLike) decreaseLikeNum(postId, userId);
};
//eslint-disable-next-line
}, []);
const handleLikeClick = () => {
if (user) {
if(isLike){
setIsLike(false);
setLikeNum((prevNum) =>prevNum - 1);
}
else {
setIsLike(true);
setLikeNum((prevNum) => prevNum + 1);
}
} else {
navigate('/login');
}
};
아이디어로 제작한 코드
그러나 문제가 있었으니 useEffect에서 컴포넌트가 Mount 될 때의 state 정보를 보관하고 있었다.
그렇다면 useEffect에 state 정보를 전해주면 되는거 아닌가?
useEffect(() => {
const increasedViews = post.views + 1;
const increasePostView = async (increasedViews, postId) => {
await updatePostViews(increasedViews, postId);
};
const increaseLikeNum = async (postId, userId) => {
await insertLikeUser(postId, userId);
};
const decreaseLikeNum = async (postId, userId) => {
await delLikeUser(postId, userId);
};
return () => {
increasePostView(increasedViews, postId);
if (user && !isDataHasUser && isLike) increaseLikeNum(postId, userId);
if (user && isDataHasUser && !isLike) decreaseLikeNum(postId, userId);
};
//eslint-disable-next-line
}, [isLike]);
의존성 배열에 isLike라는 state를 넣은 코드
const handleLikeClick = () => {
if (user) {
if (isLike) {
setIsLike(false);
setLikeNum((prevNum) => prevNum - 1);
delLikeUser(postId, userId);
} else {
setIsLike(true);
setLikeNum((prevNum) => prevNum + 1);
insertLikeUser(postId, userId);
}
} else {
navigate('/login');
}
};
다른 분들은 좋아요 기능을 어떻게 구현하였을까?
- 다른 방법으로는 useCallback을 사용하는 방법을 보긴 하였으나 내 의도와 맞는 방법인지는 아직 판단이 서지 않는다.