웹/React.js

[React.js] 좋아요 하트 아이콘 구현하기

2021. 5. 18. 11:03

백엔드 부분은 생략했다. 추후 Node.js 파트에서 따로 설명할 예정이다.

본 글에선 hooks와 axios를 이용해서 좋아요 하트 아이콘을 구현하는 방법을 소개하고자 한다.

 

 

먼저 무료 아이콘 사이트에서 필요한 아이콘을 다운받자. 

https://www.flaticon.com/

 

Flaticon, the largest database of free vector icons

Download all icons in SVG, PSD, PNG, EPS format or as webfonts

www.flaticon.com

'heart'를 검색하면 다양한 하트 아이콘들이 나온다. 

맘에 드는 걸로 빈 하트와 채워진 하트 두 가지를 골라준 후, 저장한 이미지는 src/assets 폴더 내에 저장한다.

 

왕관 표시가 된 아이콘은 프리미엄 아이콘으로 사용이 불가능하다.

 

먼저 자식 컴포넌트부터 작성하자. 구조는 컨테이너(여기선 부모 컴포넌트)에서 API 통신과 관련된 로직을 수행하고, 컴포넌트(여기선 자식 컴포넌트)는 그 결과를 props로 받아서 출력만 해주는 형태이다.

 

자식 Component - 하트 아이콘

import React, { useState, useEffect } from "react";

import styled from "styled-components";
import HeartImg from "../assets/heart.png";
import EmptyHeartImg from "../assets/empty-heart.png";

const Heart = styled.img`
    // css
    }
`;

const HeartButton = ({ like, onClick }) => {
    return (
        <Heart src={like?HeartImg:EmptyHeartImg} onClick={onClick} />
    );
};

export default HeartButton;

부모 컴포넌트로부터 like과 onClick을 props로 받는다.

like은 유저가 좋아요를 눌렀는지를 체크하는 state이다. 만약 좋아요를 눌렀다면 채워진 하트(♥)를 띄워주고, 좋아요를 누르지 않았다면 빈 하트(♡)를 띄워준다. onClick은 부모로부터 받은 like의 상태를 바꿔주는 함수이다. 아래에서 좀 더 구체적으로 설명하도록 하겠다.

 

부모 Component - 하트 아이콘이 들어가는 페이지

const Post = (props) => {

    const [like, setLike] = useState(false)

    ...
    
    useEffect(async () => {
      const fetchData = async () => {
        const res = await axios.get(...)
        if (res.data.type === 'liked') setLike(true)
      }
      fetchData()
    }, []);
    
    const toggleLike = async (e) => {
      const res = await axios.post(...) // [POST] 사용자가 좋아요를 누름 -> DB 갱신
      setLike(!like)
    }

    return (
    <>
      <HeartButton like={like} onClick={toggleLike}/>
      ...
      <Detail content={content} />
    </>
    );
};

export default Post;

먼저 useEffect 내에서 axios를 통해 사용자가 좋아요를 눌렀는지 여부를 판단한다(판단 결과는 type이라는 변수에 담는다!). 만약 좋아요를 눌렀다면(type === 'liked') like를 true로 바꾼다.

toggleLike함수는 사용자가 좋아요를 눌렀을 때 POST 요청을 통해 DB를 갱신한 후, toggle 형태로 like의 상태를 바꾸는(false->true / true->false) 역할을 한다. 그리고 props로 자식 컴포넌트에 전달되어 click이벤트에 바인딩된다(onClick={(e)=>()} 이런 식으로 직접 정의해도 된다 ).

 

여기서 핵심은 부모 컴포넌트의 setState 함수를 props 형태로 자식에게 넘겨주면, 자식 컴포넌트에서 부모의 state를 조작하는 게 가능하다는 것이다! 이를 잘 기억하면 요긴하게 써먹을 수 있다. 리덕스를 사용하고 있다면 thunk로 깔끔하게 처리할 수도 있다.

 

다음과 같이 잘 작동하는 것을 확인할 수 있다.

 

또한, 서버 로그에서 좋아요 기능이 잘 수행되는 것을 확인할 수 있다.

저작자표시 비영리 (새창열림)

'웹 > React.js' 카테고리의 다른 글

[React.js] API를 연동한 Pagination 구현  (4) 2021.05.16
[React.js] 라우터를 이용한 접근 제한 구현 (Access Control & Authentication)  (5) 2021.04.22
[React.js] 간략한 리덕스(Redux) 정리  (0) 2021.04.20
'웹/React.js' 카테고리의 다른 글
  • [React.js] API를 연동한 Pagination 구현
  • [React.js] 라우터를 이용한 접근 제한 구현 (Access Control & Authentication)
  • [React.js] 간략한 리덕스(Redux) 정리
코택
코택
TaxFree코택 님의 블로그입니다.
코택
TaxFree
코택
전체
오늘
어제
  • 분류 전체보기 (369)
    • Spring (29)
      • Spring (18)
      • 스프링 핵심 원리 - 고급편 (11)
    • Spring Batch (4)
    • JPA (4)
    • CS (89)
      • 자료구조 (2)
      • 네트워크 (5)
      • 운영체제 (1)
      • 데이터베이스 (4)
      • SQL (7)
      • 알고리즘 이론 (4)
      • 알고리즘 문제 풀이 (66)
    • 웹 (28)
      • React.js (4)
      • Next.js (1)
      • Node.js (14)
      • FastAPI (4)
      • Django (5)
    • 프로그래밍 언어 (45)
      • Python (5)
      • Java + Kotlin (29)
      • JavaScript + TypeScript (11)
    • 테스트코드 (26)
      • ATDD, 클린 코드 with Spring (4)
      • 이규원의 현실 세상의 TDD: 안정감을 주는 코드.. (20)
    • 인프라 (6)
      • AWS (2)
      • Kubernetes (4)
    • 트러블슈팅 (25)
    • 책 (89)
      • Effective Java (54)
      • Effective Kotlin (14)
      • 도메인 주도 개발 시작하기: DDD 핵심 개념 정.. (11)
      • 웹 프로그래머를 위한 데이터베이스를 지탱하는 기술 (6)
      • 도메인 주도 설계 첫걸음 (4)
    • Git (10)
    • 회고 (5)
    • etc (8)

블로그 메뉴

  • 홈
  • 방명록
  • 관리
  • GitHub
  • LinkedIn

공지사항

  • 스킨 관련

인기 글

태그

  • Shortest Path
  • 파이썬
  • mysql
  • dp
  • atdd
  • http
  • fastapi
  • 브루트포스
  • 그래프
  • 장고
  • Git
  • 깊이 우선 탐색
  • BOJ
  • 백준
  • 그래프 탐색

최근 댓글

최근 글

hELLO · Designed By 정상우.
코택
[React.js] 좋아요 하트 아이콘 구현하기
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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