
function StarRating(props) {
const AVR_RATE = Math.round(props.voteAverage * 10) ; // 평점
const STAR_IDX_ARR = ['first', 'second', 'third', 'fourth', 'last']; //별의 고유 아이디
const [ratesResArr, setRatesResArr] = useState([0,0,0,0,0]); //별점 리스트 상태
const calcStarRates = () => {
let tempStarRatesArr = [0,0,0,0,0]; //임시리스트
let starVerScore = (AVR_RATE * 70) / 100;//별의 width가 14이므로 14*5=70, 100점 만점인 현재와 비율 맞춰주기
let idx = 0;
while (starVerScore > 14) {//starVerScore값에 14를 하나씩 뺌, 나머지 숫자들은 tempStarRatesArr[idx] = starVerScore; 에서 채워줌
tempStarRatesArr[idx] = 14;
idx += 1; // 인덱스 0부터 첫번째 별
starVerScore -= 14;
}
tempStarRatesArr[idx] = starVerScore;
return tempStarRatesArr; // 평균이 80이라면 [14, 14, 14, 14, 0]
};
useEffect(() => {
setRatesResArr(calcStarRates) //첫 렌더링 때 한번만 상태를 설정
}, [])
console.log(ratesResArr)
return (
<div className='star_rate'>
{STAR_IDX_ARR.map((item, idx) => {
return (
<span className="star_icon" key={idx}>
<svg xmlns='http://www.w3.org/2000/svg' width='30' height='29' viewBox='0 0 14 13' fill='rgba(255,255,255,0.5)'>
{/* clip-path는 임의의 사각형을 만들어 별 위에 덮어주기로 했습니다. */}
<clipPath id={`${item}StarClip`}>
{/* 여기서 width는 svg의 viewBox 기준입니다. width가 14이기 때문에 절반만 채워주고 싶다면 7이 되는 것 입니다. */}
<rect width={`${ratesResArr[idx]}`} height='29' />
</clipPath>
<path
id={`${item}Star`}
d='M9,2l2.163,4.279L16,6.969,12.5,10.3l.826,4.7L9,12.779,4.674,15,5.5,10.3,2,6.969l4.837-.69Z'
transform='translate(-2 -2)'
/>
{/* clip-path를 사용하기 위한 태그입니다. 채워졌을 때 색상을 설정하면 되고, 각 id를 잘 맞춰 적어주어야 합니다. */}
<use clipPath={`url(#${item}StarClip)`} href={`#${item}Star`} fill='#e22f14'/>
</svg>
</span>
)
})}
</div>
)
}
export default StarRating
아래 블로그를 보고 따라했습니다.
https://jae04099.tistory.com/296
[React] svg로 비율 정확한 별점 구현
오늘 실습해 볼 것은 아래와 같습니다. 주어진 데이터는 100점 만점 기준 해당 브랜드의 평균 평점입니다. 아마 93점 이렇게 나오겠죠? 별점은 정말 세세하게 퍼센트로 채워짐을 표현해야합니다.
jae04099.tistory.com
'토이프로젝트' 카테고리의 다른 글
[React 메모장] 메모장 만들기 1 (1) | 2023.11.08 |
---|---|
[React 메모장] 피그마로 디자인하기 (0) | 2023.11.05 |
[React 영화 소개]리액트 슬릭 (0) | 2023.09.19 |
[React 영화 소개]하트 토글/ 찜 목록/ wish list (0) | 2023.09.19 |
[React 영화 소개]영화 소개 페이지 만들기 (0) | 2023.09.19 |