const NavItem = styled.li<{ isClicked: boolean | null }>`
color: ${(props) =>
props.isClicked ? props.theme.white.darker : props.theme.gray};
`;
const navigate = useNavigate();
const [navDataArr, setNavDataArr] = useState([
{ name: '홈', url: 'home'},
{ name: '평가한 영화', url: 'rate' },
{ name: '찜한 영화', url: 'favorite' },
]);
const onClickNavItem = (url: string) => () => navigate(`/${url}`);
<ul>
{navDataArr.map((item) => (
<NavItem
key={item.url}
onClick={onClickNavItem(item.url)}
isClicked={location.pathname === `/${item.url}`}
>
{item.name}
</NavItem>
))}
</ul>
네비 메뉴를 만들었다. useLocation훅으로 현재 url과의 일치 여부를 판단하여 일치할 경우 폰트 색을 바꿔 활성화되어 보이게 했다. 간단한 로직이었고 PC브라우저에선 예상한 대로 구현이 되었다. 그런데 모바일 환경에선 특정 페이지로 이동했다가 뒤로 가기를 누르면 두 개의 버튼이 활성화되는 문제가 생겼다.
useEffect(() => {
const updateNavDataArr = () => {
setNavDataArr((prev) =>
prev.map((item) => ({
...item,
isClicked: location.pathname === `/${item.url}`,
}))
);
};
updateNavDataArr(); // 첫 렌더링 시 상태 업데이트
// popstate 이벤트 리스너 추가
window.addEventListener('popstate', updateNavDataArr);
// 이벤트 리스너 정리
return () => {
window.removeEventListener('popstate', updateNavDataArr);
};
}, [location]);