ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [1차 프로젝트] 상세페이지에 리뷰기능 추가하기
    프론트엔드 개발자가 될거야./react 2022. 7. 31. 23:12

    https://www.le-jour.com/goods/goods_view.php?goodsNo=1000000035&mtn=23%5E%7C%5ELe+Jour+Set%5E%7C%5En# 

     

    르주르 베이비 세트

    르주르

    www.le-jour.com

    클론코딩한 Magazine B의 상세페이지에는 리뷰기능이 없다.

    그래서 이 사이트의 리뷰기능을 참고하여

    Magazine B의 상세페이지에 리뷰기능을 추가구현하기로 했다.

     

    이렇게 상세페이지 아래에 추가될 예정! 이었지만… 

    눈에 띄는 더 큰 별점이 있었으면 좋겠어서

    이렇게 수정하기로 했다.

    내가 디자인하고 내가 개발하는 거라 혼자 내린 결론이다. ㅎㅎ

    어차피 back에게는 선택한 별점이 몇인지, 무슨 리뷰를 달았는지만 전달해주면 되기 때문이다.

     

    back과의 통신이 세 번 필요하다.

    이 리뷰기능을 구현하면서 통신을 세 번이나 했는데 이를 통해 백엔드와의 통신의 중요성을 뼈저리게 느낄 수 있었다.

    2차 프로젝트를 위해 fetch와 then으로 백과 통신하는 법을 확실하게 공부해 두어야겠다. 

    (1) Productdetail.js에서 상세페이지에 대한 api

    useEffect(() => {
        fetch(`http://10.58.4.114:8000/products/${product_id}`)
          .then(res => res.json())
          .then(data => {
            setPrdDetailData([data.RESULTS]);
          });
      }, []);

    (2) Review.js에서 review데이터를 받아오는 api

    import { useParams } from 'react-router-dom';
    
    let { product_id } = useParams();
    useEffect(() => {
        fetch(`http://10.58.4.114:8000/products/${product_id}/reviews`)
          .then(res => res.json())
          .then(data => {
            setReviewData(data.RESULTS);
          });
     }, []);

    (3) Review.js에서 별점을 선택하고 리뷰를 작성했을 때 버튼을 누르면 POST해주는 api

    const addReview = e => {
        if (commentText.length < 6) {
          alert('5글자 이상을 입력해주세요');
          setCommentText('');
        } else if (rating === 0) {
          alert('별점을 선택해주세요.');
        } else {
          const textareaObj = {
            username: 'aa11',
            content: commentText,
            rating: rating,
          };
          const copyComment = [...comment, textareaObj];
          setComment(copyComment);
         const addReview = e => {
        if (commentText.length < 6) {
          alert('5글자 이상을 입력해주세요');
          setCommentText('');
        } else if (rating === 0) {
          alert('별점을 선택해주세요.');
        } else {
          const textareaObj = {
            username: 'aa11',
            content: commentText,
            rating: rating,
          };
          fetch(`http://10.58.3.49:8000/products/${product_id}/reviews`, {
            //사용할 http 메소드
            method: 'POST',
            //토큰
            headers: {
              Authorization: token,
            },
            //서버에 보낼 데이터 (별점, 리뷰)
            body: JSON.stringify({
              rating: rating,
              content: commentText,
            }),
          })
            .then(res => res.json())
            .then(data => {
              if (data.MESSAGE === 'SUCCESS') {
                const copyComment = [...comment, textareaObj];
                setComment(copyComment);
                setCommentText('');
                window.location.reload();
              } else {
                alert('구매하셔야 리뷰등록 가능합니다!');
                setCommentText('');
              }
            });
        }
      };

     

    back에게 받은 data 가공하기 (너무 힘들다! ㅎ ㅡ ㅎ)

    리뷰기능을 구현하기 위해서는 reviews 데이터가 필요하다.

    이 데이터로 map을 돌려 댓글을 구현해야하기 때문이다.

    또한 이 데이터에 유저가 추가한 별점과 댓글을 추가해야한다.

    const [comment, setComment] = useState([]);
    const [reviewData, setReviewData] = useState([]);
    
    useEffect(() => {
        setComment(reviewData);
      }, [reviewData]);
     
    
      useEffect(() => {
        fetch(`http://10.58.3.49:8000/products/${product_id}/reviews`)
          .then(res => res.json())
          .then(data => {
            setReviewData(data.RESULTS);
          });
      }, []);

    이렇게 back에게 받아온 데이터를

    useEffect와 useState를 활용하여 만질 수 있다.

     

    back의 데이터 + 유저가 추가할 데이터를 합쳐

    <div className="commentBox">
        {comment.map((data, i) => {
          return <Comment key={i} data={data} />;
        })}
    </div>

    이렇게 map을 돌리면 댓글이 추가된다.

    댓글

Designed by Tistory.