개발/React Native
[RN 개발일지] 좋아요 기능 구현하기 (버튼 클릭 시 이미지 및 좋아요 수 변경)
세크레투스
2024. 5. 15. 18:09
반응형
SMALL
1. 개발 전 준비물
- 색깔이 안채워진 하트 이미지
- 색깔이 채워진 하트 이미지
2. 개발 시작
우리가 만들고자 하는 좋아요 컴포넌트는 다음과 같은 기능이 구현되어야 한다.
1. 버튼 클릭 시 색깔이 안채워진 하트에서 색깔이 채워진 하트로 변경되어야 함. (이 반대의 기능도 구현되어야 함.)
2. 좋아요 버튼 옆에 몇 명이 좋아요를 클릭했는지 갯수가 표시되어야 함.
3. 버튼 클릭 시, 갯수가 변경되어야 함.
(채워진 하트 -> 안채워진 하트로 변경 시, 좋아요 갯수가 1개 줄어야 함.)
(안채워진 하트 -> 채워진 하트로 변경 시, 좋아요 갯수가 1개 늘어나야 함.)
이러한 기능이 구현되도록 좋아요 버튼 컴포넌트를 만들어보자.
우선, HeartImageComponent.tsx 파일을 생성한다.
import React, {useState, useEffect, useCallback} from 'react';
import {
Image,
Text,
TouchableOpacity,
View,
} from 'react-native';
import FavoriteImg from '../../../images/favorite.png'; //색깔이 안채워진 이미지
import FavoriteActiveImg from '../../../images/favorite_active.png'; //색깔이 채워진 이미지
//ClickFavorite: 좋아요 기능 메인 컴포넌트.
//favClick : 좋아요 클릭 여부 상태 값.
//favNum : 좋아요를 몇명이 클릭했는지에 대한 전체 갯수 값.
export const ClickFavorite = ({favClick, favNum}: any) => {
// isClicked : 버튼 클릭 시 변경되는 값을 관리하는 함수형 컴포넌트 / boolean 형임. 즉, default가 false.
const [isClicked, setIsClicked] = useState<boolean | null>(favClick);
// changeNum : 버튼 클릭 시 변경되는 클릭 갯수를 관리하는 함수형 컴포넌트 / number 형임.
const [changeNum, setChangeNum] = useState(favNum); //버튼 클릭 시 숫자가 변경되는 함수
//changeFav: onPress시 적용될 이벤트 컴포넌트
const changeFav = useCallback(() => {
//버튼을 클릭할 때 마다 현재의 반대 상태로 변경해줌. (true -> false, false -> true)
setIsClicked(!isClicked);
if(favClick) { //넘겨진 값이 true라면 (즉, 이미 버튼이 클릭된 상태라면)
if(isClicked) { //버튼 클릭 상태가 false일 때 (버튼 클릭 취소 시)
setChangeNum(favNum - 1); //좋아요 클릭 갯수에서 -1 하기.
} else { //버튼 클릭 상태가 true일 때(다시 버튼 클릭 시)
setChangeNum(favNum); //다시 원래 좋아요 갯수로 돌아가기.
}
} else { //넘겨진 값이 false라면 (즉, 이미 버튼이 클릭되지 않은 상태라면)
if(!isClicked) { //버튼 클릭 상태가 true일 때(버튼을 클릭했을 때)
setChangeNum(favNum + 1);
} else { //버튼 클릭 상태가 false일 때 (다시 버튼 클릭 취소 시)
setChangeNum(favNum);
}
}
},[isClicked, changeNum, favClick, favNum]);
return (
<View
style={{
width: 59,
height: 24,
marginRight: 5,
flexDirection: 'row',
alignItems: 'center',
}}>
<TouchableOpacity onPress={changeFav}>
//FavoriteImage : 버튼 클릭 시 이미지 변경되는 컴포넌트
<FavoriteImage
favClick={isClicked}
/>
</TouchableOpacity>
<Text style={{fontSize:10, alignItems:'center', paddingLeft:3}}>
{changeNum}
</Text>
</View>
);
};
//FavoriteImage : 버튼 클릭 시 하트 이미지가 변경되는 컴포넌트 (안채워진 -> 채워진 / 채워진 -> 안채워진)
export const FavoriteImage = ({favClick}: any) => {
//favSoucre : 버튼 클릭 시 변경되는 좋아요 이미지를 관리하는 함수형 컴포넌트.
const [favSource, setFavSource] = useState(FavoriteImg); //기본 값은 안채워진 하트 이미지.
useEffect(() => {
if(favClick === true) { //좋아요 클릭 했을 때
setFavSource(FavoriteActiveImg); //색깔 채워진 하트 이미지.
} else { //좋아요 클릭 안했을 때
setFavSource(FavoriteImg); //색깔 안채워진 하트 이미지.
}
}, [favClick, favSource]);
return <Image source={favSource} style={{width:24, height:24}} />;
}
다음으로, 만들어진 ClickFavorite 컴포넌트(좋아요 기능 컴포넌트)를 다른 페이지에서 import 시킨 후 사용해주면 된다.
끝..!!
반응형
LIST