작성
·
370
·
수정됨
0
안녕하세요. 현재 댓글 수정, 삭제 구현중에 있습니다.
강의 과정에는 없지만 추가적으로 궁금한 부분이 있어 질문 드립니다.
댓글을 삭제하는 경우, 바로 반영되어 댓글이 삭제되기는 하나
애니메이션을 적용시켜 천천히 사라지며 삭제되는 코드를 짜고싶습니다.
현재 TransitionGroup, CSSTransition, keyframes 컴포넌트를 사용해
애니메이션은 적용이 되고 있으나, 삭제시 삭제되는 해상 댓글에만 적용하기는 너무 어렵네요
생각하기로는, 해당 댓글의 id 값을 스타일시트로 받아와서 스타일시트에서 해당 _id의 댓글만 애니메이션을 적용하면 될 것 같은데 생각대로 되지 않는 것 같습니다.
어떻게 하면 좋을지 힌트라도 얻을 수 있을까요?
import { getDateTime } from '../../../../commons/libraries/utils';
import * as S from './BoardCommentDetail.styles';
import { TransitionGroup, CSSTransition } from 'react-transition-group';
import { useEffect } from 'react';
export default function BoardCommentDetailUI(props) {
useEffect(() => {
// 댓글이 변경될 때 추가적인 정리 또는 부작용을 수행할 수 있습니다.
}, [props.data?.fetchBoardComments]);
return (
<div>
<TransitionGroup>
{props.data?.fetchBoardComments.map((el) => (
<CSSTransition>
<S.CommentWrapper>
<S.Comment>
<S.ProfileImg>
<img src={`/img/profileIcon.svg`} width={48} height={48} />
</S.ProfileImg>
<S.CommentContentsArea>
<S.CommentContentsWriter>
<S.ContentsWriter>{el.writer}</S.ContentsWriter>
<S.ContentsRate value={el.rating} disabled />
</S.CommentContentsWriter>
<S.CommentContents>{el.contents}</S.CommentContents>
<S.CommentDate>{getDateTime(el.createdAt)}</S.CommentDate>
</S.CommentContentsArea>
<S.WriterIconWrapper>
<img src={`/img/mode-24px.svg`} />
</S.WriterIconWrapper>
<S.WriterIconWrapper
id={el._id}
onClick={() => props.onClickDeleteComment(el._id)}
>
<img src={`/img/clear-24px.svg`} />
</S.WriterIconWrapper>
</S.Comment>
</S.CommentWrapper>
</CSSTransition>
))}
</TransitionGroup>
</div>
);
}
import { useMutation, useQuery } from '@apollo/client';
import {
FETCH_BOARD_COMMENTS,
DELETE_BOARD_COMMENT,
} from './BoardCommentDetail.queries';
import { useRouter } from 'next/router';
import BoardCommentDetailUI from './BoardCommentDetail.presenter';
import { useState } from 'react';
export default function BoardCommentDetail() {
const router = useRouter();
const [commentIdToDelete, setCommentIdToDelete] = useState(null);
const { data, refetch } = useQuery(FETCH_BOARD_COMMENTS, {
variables: { boardId: router.query.boardId },
});
const [deleteBoardComment] = useMutation(DELETE_BOARD_COMMENT);
const onClickDeleteComment = async (commentId) => {
setCommentIdToDelete(commentId);
const isConfirmed = window.confirm('댓글을 삭제하시겠습니까?');
if (isConfirmed) {
try {
const passwordConfirmation = prompt('비밀번호를 입력하세요');
await deleteBoardComment({
variables: {
boardCommentId: commentId,
password: passwordConfirmation,
},
});
alert('댓글이 삭제되었습니다.');
refetch();
} catch (error) {
console.error('댓글 삭제 중 오류 발생', error);
}
}
};
return (
<BoardCommentDetailUI
data={data}
onClickDeleteComment={onClickDeleteComment}
/>
);
}
답변 1
1
안녕하세요. 제가 보았을 때, 댓글 삭제 시에 애니메이션을 적용하려면 다음과 같이 해볼 수 있을 것 같습니다.
BoardCommentDetailUI
컴포넌트에서 commentIdToDelete
상태를 추가로 선언해주세요. (useState(null)
으로 초기화)
props.onClickDeleteComment
함수에서 setCommentIdToDelete(commentId)
를 호출하여 삭제할 댓글의 commentId
를 설정해주세요.
CSSTransition
컴포넌트 안에 <S.CommentWrapper>
를 추가해주세요. 이렇게 함으로써 특정 댓글에 대한 스타일을 감싸는 컨테이너 역할을 하는 <S.CommentWrapper>
가 생성됩니다.
<S.CommentWrapper>
컴포넌트에 id={el._id}
prop을 추가해주시고, 적용하고자 하는 애니메이션 스타일을 줄 CSS 파일에 추가해주세요.
BoardCommentDetailUI
컴포넌트 내의 useEffect
훅에서 commentIdToDelete
상태가 업데이트될 때마다 해당 댓글에 대한 애니메이션 클래스를 추가하고 삭제하도록 처리해주세요. 예를 들어, commentIdToDelete
를 이용하여 해당 댓글 요소를 선택하고, 애니메이션을 적용할 클래스를 추가하는 방식입니다.
위의 과정을 따라하면 원하시는 애니메이션 효과를 구현할 수 있을 것입니다. 혹시 추가적인 문제가 있으시다면 언제든지 물어보세요.