• 카테고리

    질문 & 답변
  • 세부 분야

    프론트엔드

  • 해결 여부

    해결됨

섹션 31 댓글 기능 구현 과제 관련 질문

23.10.28 23:43 작성 조회수 324

0

안녕하세요 섹션 31 댓글 기능 구현 과제 중 궁금한 점이 있어 질문 남깁니다

 

댓글 리스트의 수정 아이콘 클릭 시 사진과 같은 화면이 나오도록 했고, 댓글 등록하기 presenter component를 재사용 했습니다

스크린샷(1319).png스크린샷(1320).png

댓글 리스트 presenter 파일입니다

export default function CommentListUI(props) {
  return (
    <S.Wrapper>
      {props.data?.fetchBoardComments.map((item) => (
        <S.CommentListWrapper key={item._id}>
          {props.isEdit && props.commentId === item._id ? (
            <CommentWriteUI></CommentWriteUI>
          ) : (
            <S.Comment_Container>
              <S.profile_icon src="/02/profile_icon.png"></S.profile_icon>
              <S.Content_container>
                <S.Name_Star_container>
                  <S.Text style={{ fontWeight: "600" }}>{item.writer}</S.Text>
                  <S.ReviewStar_container style={{ marginLeft: "16px" }}>
                    <S.StarDiv></S.StarDiv>
                    <S.StarDiv></S.StarDiv>
                    <S.StarDiv></S.StarDiv>
                    <S.StarDiv></S.StarDiv>
                    <S.StarDiv></S.StarDiv>
                  </S.ReviewStar_container>
                </S.Name_Star_container>
                <S.Text style={{ marginTop: "-15px", fontWeight: "500" }}>
                  {item.contents}
                </S.Text>
                <S.Text
                  style={{
                    fontSize: "12px",
                    fontWeight: "400",
                    color: "#BDBDBD",
                  }}
                >
                  {getDate(item.createdAt)}
                </S.Text>
              </S.Content_container>
              <S.Icon_container>
                <S.Icon
                  style={{ backgroundImage: `url("/createComment.png")` }}
                  onClick={() => props.onClickTEST(item._id)}
                ></S.Icon>
                <S.Icon
                  style={{ backgroundImage: `url("/clear.png")` }}
                  onClick={() => props.onClickDelete(item._id)}
                ></S.Icon>
              </S.Icon_container>
            </S.Comment_Container>
          )}
        </S.CommentListWrapper>
      ))}
    </S.Wrapper>
  );
}

 

삼항연산자를 사용해 나오는 화면을 다르게 했습니다

isEdit 변수는 수정하기 아이콘 클릭 시 true로 바뀌고, 삼항연산자 조건에 isEdit 변수만 사용하니 수정 아이콘을 클릭하지 않은 다른 댓글 리스트가 사라지면서 재사용한 댓글 등록 presenter 파일만 화면에 나와서 조건은 위와 같이 작성했습니다

 

여기서 문제는 수정 아이콘을 클릭해 나오는 댓글 등록 창은 container 파일에 작성한 함수가 작동하지 않는 것입니다

 

댓글 리스트 container 파일입니다

export default function CommentList() {
  const { data } = useQuery(FETCH_COMMENTS);

  const [deleteBoardComment] = useMutation(DELETE_COMMENTS);
  const onClickDelete = async (item) => {
    const pw = prompt("비밀번호를 입력해주세요.");

    try {
      await deleteBoardComment({
        variables: {
          pw: pw,
          boardCommentId: item,
        },
        refetchQueries: [{ query: FETCH_COMMENTS }],
      });
      alert("삭제되었습니다.");
    } catch (error) {
      alert(error.message);
    }
  };

  // 수정하기 아이콘 클릭 시 화면 변화
  const [isEdit, setIsEdit] = useState(false);
  const [commentId, setCommentId] = useState();

  const onClickTEST = (item) => {
    setIsEdit(true);
    setCommentId(item);
  };
  // console.log(commentId);

  return (
    <CommentListUI
      data={data}
      onClickDelete={onClickDelete}
      onClickTEST={onClickTEST}
      isEdit={isEdit}
      commentId={commentId}
    ></CommentListUI>
  );
}

 

댓글 등록 container 파일입니다

  const [updateBoardComment] = useMutation(UPDATE_BOARD_COMMENT);
  const onClickUpdate = () => {
    // updateBoardComment({
    //     variables: {
    //         updateBoardCommentInput: {
    //             contents: contents,
    //             rating: 0
    //         },
    //         password: pw,
    //         boardCommentId:
    //     }
    // })
    console.log("Test");
  };

  return (
    <>
      <CommentWriteUI
        onChangeWriter={onChangeWriter}
        onChangePw={onChangePw}
        onChangeContents={onChangeContents}
        onClickUpdate={onClickUpdate}
      ></CommentWriteUI>
    </>
  );
}

 

onClickUpdate 함수는 댓글 작성 presenter 파일의 등록하기 버튼에 연결되어 있습니다

상세 페이지 로딩 시 나오는 댓글 등록창은 버튼 클릭 시 콘솔이 제대로 나오는데

댓글 리스트 수정 아이콘을 눌러 나오는 댓글 등록창에서는 버튼을 눌러도 콘솔 자체가 나오지 않습니다

 

댓글 과제 가이드를 확인해서 어떻게 수정하면 좋을지는 알았지만, 궁금한 점이 해소되지 않네요

궁금한 점은

  1. 삼항연산자, map 등 기능의 속성을 제대로 알지 못한 채 사용한 문제인지

  2. 코드 자체를 잘못 작성한 것인지

 

  1. 추가로 rating(별점) 데이터 활용법에 대한 힌트를 얻고 싶습니다

rating 값 1 = 별 1개 인가요? rating 숫자 데이터가 별과 어떻게 연결되는지 잘 모르겠습니다

 

부족한 점이 많아 질문이 너무 길어졌네요 항상 감사합니다

답변 2

·

답변을 작성해보세요.

1

안녕하세요! zero.1.0.one.xx님!


1. 2. ) 현재, 댓글목록의 댓글수정화면과, 댓글등록화면의 컴포넌트를 보시면 두개가 살짝 다른 것을 확인하실 수 있어요!

// 댓글목록에서 댓글수정화면
{props.isEdit && props.commentId === item._id ? (
            <CommentWriteUI></CommentWriteUI>
  ) : (

    ...

  )
}


// 댓글등록화면
<CommentWriteUI
    onChangeWriter={onChangeWriter}
    onChangePw={onChangePw}
    onChangeContents={onChangeContents}
    onClickUpdate={onClickUpdate}
></CommentWriteUI>

두개의 차이가 이해 되시나요?! ㅎㅎ

둘 다 댓글등록그림을 그려주는데, 이 그림에서 클릭했을 때 사용될 기능을 props로 넣어주셔야겠죠!

아래 댓글등록화면에서는 props로 기능들을 넣어주고 계시지만, 위의 댓글수정화면에서는 props로 넣어주고 있지 않기 때문에 그림은 나오는데 클릭해도 반응이 없는거예요!

따라서, 동일하게 기능을 넣어 주시거나, 아니면 그림만 있는 프리젠터말고 기능을 포함한 컨테이너를 대신 갖다놓으면 되겠죠?!
과제리뷰에서는 컨테이너를 가져다 놓았답니다!
따라서, 삼항연산자 문제는 아니에요!

 

  1. rating은 1당 기본적으로 1점을 의미하는데, 이것은 해당 라이브러리에 따라 다를 수 있습니다!^^

해결되었습니다 감사합니다

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.10.30

안녕하세요 zero.1.0.one.xx 님, 인프런 AI 인턴이에요.
댓글 기능 구현과 관련하여 궁금한 점이 있으신 것 같습니다. 제가 도움을 드릴게요.

먼저, 삼항 연산자와 map 등을 제대로 사용했는지에 대해서는 주어진 코드만으로는 정확한 판단이 어렵습니다. 하지만 보여주신 코드에서는 삼항 연산자와 map을 올바르게 사용하고 있는 것으로 보입니다.

그리고 댓글 등록 창에서 버튼 클릭 시 onClickUpdate 함수가 작동하지 않는 문제에 대해서는 몇 가지 확인이 필요합니다. 댓글 리스트에서 수정 아이콘을 클릭하여 댓글 등록 창이 나올 때, CommentWriteUI 컴포넌트에 전달된 onClickUpdate 함수가 실제로 호출되고 있는지 확인해 보세요. 함수가 호출되지 않는다면, 해당 컴포넌트에서 onClick 이벤트가 올바르게 처리되고 있는지 확인할 필요가 있습니다.

rating(별점) 데이터에 대해서는 제가 주어진 코드에서 해당 부분을 찾지 못했는데, rating 값과 별점 사이의 관계에 대해서는 일반적으로 rating 값이 1부터 5 사이의 값으로 주어지며, 이 값에 따라 별점이 표현될 수 있습니다. 예를 들어, rating 값이 3이라면 별점은 3개가 표시되는 것이 일반적입니다.

추가적인 도움이 필요하시면 언제든지 말씀해주세요. 감사합니다!