좋아요 여부에 따라 다른 이미지를 나타내는 기능을 구현해보았다. (좋아요->빨간하트이미지/좋아요x->흰하트이미지)
-> 이를 위해 댓글마다 좋아요 여부를 저장하는 likeState를 만들어 이용했다
<과정>
1. 처음 로딩 시 서버에 저장되어있는 상태 불러오기
-> 댓글에 대한 정보를 불러오는 api를 통해 댓글의 좋아요 여부 상태를 받아온 후, 해당 상태를 likeState 객체에 저장.
(댓글이 여러개이므로 state를 객체로 만들어 이용!)
const [likeState, setLikeState] = useState({});
useEffect(() => {
// comments 배열로부터 초기 좋아요 상태 설정
const initialLikeState = {};
comments.forEach((comment) => {
initialLikeState[comment.id] = comment.is_liked;
});
setLikeState(initialLikeState);
}, [comments]);
likeState 상태에 따라 보여지는 이미지가 다르도록 삼항연산자로 표현해두고 이를 이용
const heartImage = likeState[comment.id]
? "/assets/redHeart.png"
: "/assets/whiteHeart.png";
<img
src={heartImage}
onClick={() => toggleLike(comment.id)}
className="heart">
</img>
2. 하트이미지 클릭 시 변화
-> 좋아요를 의미하는 하트이미지를 클릭한다면, 해당 댓글의 likeState가 바뀌고 그에 따라 보여지는 이미지가 달라지게 하기 + api 호출해서 db의 state도 바꾸기
//댓글 좋아요 누를시 좋아요 state 바뀌고, postGood/deleteGood 실행시켜 서버에 전달해야함
const toggleLike = async (commentId) => {
const liked = !likeState[commentId];
setLikeState((prevState) => ({
...prevState,
[commentId]: liked
}));
if (liked) {
goodVoice(commentId);
} else deleteGood(commentId);
};
-> 원래 저장되어있던 상태의 반대를 liked라는 변수에 저장한 후, setLikeState를 통해 likeState 업데이트한다.
업데이트 된 상태가 true, 즉 좋아요가 눌러진 상태면 db에 is_liked값을 true로, 취소하여 false 상태면 db에 false로 저장하도록 서버에 전달하도록 구현
'졸업프로젝트' 카테고리의 다른 글
프론트 배포 (aws s3+CloudFront+ github actions) (0) | 2024.05.08 |
---|---|
토큰을 통한 정보 추출 (0) | 2024.04.30 |
프론트에서 음성 데이터 재생하기 (0) | 2024.03.21 |
VITS2 모델 논문 & React 설치 및 실행 (0) | 2023.11.24 |