map
으로 바꾸고 useState
를 사용하였다.기존 방식
hoverState
에 map
의 아이템을 돌리면서 item.isHovered가 true일때 className
이 바뀌면서 아이콘의 이미지와 말풍선의 컬러와 value가 바뀐다.isHovered: true
로 바꿔주면서 setHoverState
에 업데이트해준다.export default function Navbar() {
const cart = useSelector((state) => state.user.inCart);
const initialState = [
{
id: 1,
value: '배추과김치',
isHovered: false,
imgUrl: 'Navbar_icon_star.png',
color: '#ff9b9b',
},
{
id: 2,
value: '무과김치',
isHovered: false,
imgUrl: 'Navbar_icon_circle.png',
color: '#9BC3FF',
},
{
id: 3,
value: '뿌리과김치',
isHovered: false,
imgUrl: 'Navbar_icon_square.png',
color: '#FFE99B',
},
{
id: 4,
value: '기타김치',
isHovered: false,
imgUrl: 'Navbar_icon_triangle.png',
color: '#9DFF9B',
},
];
const [hoverState, setHoverState] = useState(initialState);
const navigate = useNavigate();
const onHoverHandler = (item) => {
for (let i in hoverState) {
if (hoverState[i].id === item.id) {
hoverState[i].isHovered = !item.isHovered;
setHoverState([...hoverState]);
}
}
};
isHovered: true
인 상태로 코드를 쭉쭉 내려가서 className
이 변경되면 아이콘의 스케일이 커지는 효과가 나타나며 아이콘이 바뀐다.
{hoverState.map((item) => {
return (
<div>
<img
className={`${
item.isHovered !== false ? 'hoverState' : 'Icon'
}`}
src={`${process.env.PUBLIC_URL}/images/common/${item.imgUrl}`}
alt=""
onMouseEnter={() => onHoverHandler(item)}
onMouseLeave={() => onHoverHandler(item)}
onClick={() => {
navigate(`/categories/${item.value}`);
}}
key={item.id}
/>
<div
className={`${item.isHovered ? 'textBalloon' : 'hoverText'}`}
style={{
backgroundColor: item.color,
}}
>
<div
className={`${
item.isHovered ? 'textBalloonBottom' : 'hoverText'
}`}
style={{
borderRightColor: item.color,
}}
></div>
{item.value}
</div>
</div>
);
})}
onhoverHandler
함수를 따로 만들어 true 바꿔주는 방법을 또 한번 알게되었다.