Projects/Next.js board-project

[Next.js] 묵혀둔 프로젝트 고치기 - 좋아요 기능

2023. 9. 23. 01:23
목차
  1. 주절주절
  2. 두 번째 주절주절

주절주절

분명 예전에는 하트를 누르면 늦게나마 빨간 하트가 되었는데

요청은 정상적으로 되나 빨간 하트로 변하지 않았다.

  const session: UserInfo | null = await getServerSession(authOptions);
  const db = (await connectDB).db('forum');

  let result = await db.collection('post').findOne({ _id: new ObjectId(props.params.id) });

  if (result) {
    result._id = result._id.toString() as unknown as ObjectId;
  }

  let foundOne;

  if (session) {
    foundOne = await db.collection('like').findOne({
      userId: new ObjectId(session.user.id),
      pageId: new ObjectId(result?._id),
    });
    if (foundOne) {
      foundOne._id = foundOne._id.toString() as unknown as ObjectId;
      foundOne.pageId = foundOne.pageId.toString();
      foundOne.userId = foundOne.userId.toString();
    }
  }

 

그러니까 과거의 나는..

1.  로그인여부를 확인하기 위해 if(session)을 썼고

2. 좋아요 했는지를 찾았다면 if(foundOne)

3. 좋아요 데이터 id, 좋아요 한 게시글 id, 유저의 id 값의 타입을

ObjectId에서 string화 시켰다.

 

유저가 좋아요 누른 게시글의 id와 해당 페이지의 id를 비교하여 같으면

isLike 가 true가 되어서 빨간 하트가 되는 로직이었는데

 

그리고 Like 컴포넌트에 props로 넘겨주는 부분을 console.log 찍어보았더니

props로 넘겨준 부분이 게시글의 id가 아니라 좋아요 데이터의 id였다.

 

당연히 다를 수밖에 없었고 foundOne._id를 foundOne.pageId로 바꿔주어 해결했다.

 

두 번째 주절주절

좋아요 눌렀을 때 바로 바뀌는 하트

  useEffect(() => {
    if (props.isLike.pageId === props.pageId) setIsLike(true);
  }, []);

일단 처음 좋아요 버튼 컴포넌트가 마운트 될 때

유저가 좋아요 한 글이라면 isLike 상태를 true로 설정해 주어 

      {isLike ? <FaHeart className="text-red-600" /> : <FaRegHeart />}

버튼의 색상이 결정된다.

      onClick={() => {
        setIsLike(!isLike);
        axios
          .post('/api/post/like', { pageId: props.pageId })
          .catch(() => {
            alert('로그인 후 이용이 가능합니다.');
          });
      }}

원래 then() 메소드로 응답을 받아 setIsLike를 변경해 주고 

useEffect에 의존성 배열에 isLike가 있었는데

 

1 ) 응답을 받아서 하트 색상이 바뀌는 속도가 느리고

2 ) isLike 가 변경됨에 따라 useEffect의 콜백함수가 실행이 되는 게 불필요하다고 판단했다.

 

그래서 클릭하자마자 isLike의 상태를 바꿔주어 1)를 해결하고

만약 오류로 인해 좋아요 또는 좋아요 취소 요청이 안되었을 시

useEffect가 좋아요 버튼 컴포넌트를 마운트 할 때

데이터를 확인해서 isLike의 상태를 결정하므로 2)를 해결할 수 있었다.

 

'Projects > Next.js board-project' 카테고리의 다른 글

[Next.js] 배포 에러 고치기  (1) 2023.10.02
[Next.js] cannot be used as a jsx component.  (0) 2023.09.20
  1. 주절주절
  2. 두 번째 주절주절
'Projects/Next.js board-project' 카테고리의 다른 글
  • [Next.js] 배포 에러 고치기
  • [Next.js] cannot be used as a jsx component.
Summer.dev
Summer.dev
프론트엔드 개발자 Summer 입니다! 피드백은 언제나 환영입니다.
Summer.dev
꾸준함이 무기
Summer.dev
전체
오늘
어제
  • 분류 전체보기
    • Projects
      • Next.js board-project
      • MOMO
    • 원티드
    • 우테코 프리코스
    • JavaScript
    • React
    • TypeScript
    • Node.js
    • Algorithm
      • 코플릿
      • 개념정리
    • 네트워크
    • 오류해결
    • 회고
    • 기술면접준비
    • git,github
    • 소소하게 궁금한것
    • Next.js Beta Docs 번역
    • 디자인패턴
    • 트러블슈팅
    • 번역

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 알고리즘
  • 메모이제이션

최근 댓글

최근 글

hELLO · Designed By 정상우.
Summer.dev
[Next.js] 묵혀둔 프로젝트 고치기 - 좋아요 기능
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.