주소의 마지막 값을 받아 공통 컴포넌트에 전달하는 로직이 있었다.
위처럼 라우팅 구분의 길이가 모두 달라서,
원래의 코드에서는
useEffect hook을 이용해 렌더링이 일어날 때 마다
document 객채의 현재 주소값을 가져와,
문자열 / 를 기준으로 나눈 뒤
마지막 값의 문자열을 가져와 state 값에 저장을 시켰다.
const [currentLastUrl, setCurrentLastUrl] = useState(null);
useEffect(() => {
const url = document.location.href;
const splitUrl = url.split('/');
const location = splitUrl[splitUrl.length - 1];
setCurrentLastUrl(location);
}
그러나 이 방법은 랜더링이 일어나는 모든 시점에 불필요하게 작동했고,
불필요한 추가 연산이 들어갔다.
useLocation hook 은 location 객체를 반환하며, 이 객체는 현재 사용자가 보고있는 페이지의 정보를 지니고 있다.
자세히 살펴보자면,
useLocation Hook을 콘솔로 찍어보면 다음과 같이 출력된다.
그래서 react router v6 의 useLocation hook을 사용하여 다음과 같이 코드를 개선했다.
const locationHook = useLocation();
const [currentLastUrl, setCurrentLastUrl] = useState(null);
useEffect(() => {
const splitUrl = locationHook?.pathname?.split('/') ?? null;
const location =
splitUrl?.length > 1 ? splitUrl[splitUrl.length - 1] : null;
setCurrentLastUrl(location);
}, [locationHook]);
빈 값이나 length 계산의 에러방지를 위해, Optional chaining 과 Nullish coalescing operator 를 추가로 넣어줬다.
useEffect의 dependency를 정확하게 걸어주어서 필요할 때만 로직이 실행되고,
그에 따라 랜더링을 최적화 할 수 있었다.