'네캔만원' 프로젝트의 맥주를 평가하는 부분에서 별점 기능이 필요해 구현하게 되었다. 리액트에서 제공하는 컴포넌트가 있어서 적용시켜 보았지만 우리가 흔히 생각하는 UX와는 다른 부분이 있어서 직접 구현하기로 했다.
{[1, 2, 3, 4, 5].map(el => (
<img
key={el}
id={el}
className={styles.star}
src="/img/star-regular.png"
alt=""
onClick={goToFetch} />
))}
const [starClick, setStarClick] = useState(null);
const [preClicked, setPreClicked] = useState(starClick);
const goToFetch = (e) => {
e.preventDefault();
const nowClicked = e.target.id; // 현재 클릭한 id
setStarClick(nowClicked);
if(nowClicked !== null) { // 별이 클릭한 상태라면
if(nowClicked > preClicked) {
for (let i = 1; i <= nowClicked; i++) {
const star_id = document.getElementById(i);
star_id.src = "/img/star.png";
}
}
else if(nowClicked < preClicked){
for (let i = 1; i <= nowClicked; i++) {
const star_id = document.getElementById(i);
star_id.src = "/img/star.png";
}
for(let j = 5; j > nowClicked; j--) {
const star_id = document.getElementById(j);
star_id.src = "/img/star-regular.png";
}
}
else {
for (let i = 1; i <= nowClicked; i++) {
const star_id = document.getElementById(i);
star_id.src = "/img/star-regular.png";
}
}
}
}
내가 생각한 코드는 조건문, 반복문이 많아서 아주 좋은 코드라고 생각되어지지는 않지만 내가 생각했던 사용자 경험에 비추어 직접 고안해냈기 때문에 배울 점이 훨씬 많았다. 조금 더 실력이 쌓이면 이 코드를 리팩토링 해보고 싶다.