useLocationReact Router의 useLocation 훅은 현재 URL의 위치 정보를 읽어와 컴포넌트 내에서 활용할 수 있게 해줍니다.
useLocation을 활용하면, URL 변화에 따른 여러 로직(스크롤, 쿼리 파싱, 상태 전달 등)을 쉽게 다룰 수 있습니다.
import { useLocation } from 'react-router-dom';
function MyComponent() {
const location = useLocation();
console.log(location);
// {
// pathname: '/about',
// search: '?user=ahn',
// hash: '#section1',
// state: { from: '/' },
// key: 'abc123'
// }
return (
<div>
<h2>현재 경로: {location.pathname}</h2>
<p>쿼리: {location.search}</p>
<p>해시: {location.hash}</p>
</div>
);
}
pathname: /about 같은 경로 문자열
search: ?key=value 형태의 쿼리 문자열
hash: #section 같은 해시 문자열
state: <Link to={{ pathname: '/path', state: { ... } }} /> 같은 방식으로 전달한 상태 객체
key: 이 위치 고유의 식별자
location.search는 문자열 형태로 반환되므로, URLSearchParams를 이용해 파싱합니다.function QueryComponent() {
const { search } = useLocation();
const params = new URLSearchParams(search);
const user = params.get('user');
return <div>사용자: {user}</div>;
}
location(또는 location.pathname)을 넣으면, 경로가 바뀔 때마다 useEffect가 실행됩니다.import { useEffect } from 'react';
import { useLocation } from 'react-router-dom';
function ScrollToTop() {
const { pathname } = useLocation();
useEffect(() => {
window.scrollTo(0, 0);
}, [pathname]);
return null;
}
state 활용하기Link나 프로그래밍 내비게이션에서 state를 전달할 수 있습니다.// 이동하는 쪽
<Link
to={{
pathname: '/detail',
state: { fromList: true }
}}
>
상세보기
</Link>
// 받는 쪽
function Detail() {
const { state } = useLocation();
return <div>리스트에서 왔나요? {state?.fromList ? '네' : '아니요'}</div>;
}
리렌더링
location 객체 자체가 바뀔 때(쿼리·해시·state 포함)마다 훅이 리렌더링됩니다. 필요한 속성만 디펜던시로 사용하세요.상태 관리
state를 너무 무겁게 쓰면 URL 없이 중요한 데이터를 넘기는 셈이니, 새로고침 후 사라질 수 있다는 점을 염두에 두세요.SSR 환경
window가 없으므로, useLocation이 동작하기 전 if (typeof window === 'undefined') return; 같은 가드가 필요할 수 있습니다.