리액트 라우터 라이브러리에서 동적라우팅을 위해 제공하는 함수로, Route path 와 일치하는 현재 URL에서 동적 매개변수의 키/값 쌍의 개체를 반환한다.
예를 들어, 게시판의 특정 게시글 클릭 시 해당 게시글의 상세 페이지로 이동할 때 사용된다.
- 기본 구문
const params = useParams(); fetch (`http://localhost:3001/blogs/${params.id}`)
:
)으로 경로/:작명한 임의의 이름
문자열 형태로 설정한다.<BrowserRouter>
<div className="app">
<div className="content">
<Routes>
<Route exact path="/" element={<Home blogs={blogs} isPending={isPending} />} />
<Route path="/blogs/:id" element={<BlogDetails getBlogs={getBlogs} />} />
</Routes>
</div>
</div>
</BrowserRouter>
useParams
를 import 해온 후, 사용하기 쉽도록 useParams()
함수를 변수에 할당한다.import { useParams } from 'react-router-dom';
const params = useParams();
useEffect(() => {
const getDetailBlog = async () => {
const res = await axios.get(`http://localhost:3001/blogs/${params.id}`)
setBlogs(res.data)
};
getDetailBlog();
}, []);
const handleDeleteClick = async () => {
const res = await axios.delete(`http://localhost:3001/blogs/${params.id}`)
getBlogs(res)
navigate('/');
}
import { useParams } from 'react-router-dom';
let { id } = useParams();
useEffect(() => {
const getDetailBlog = async () => {
const res = await axios.get(`http://localhost:3001/blogs/${id}`)
setBlogs(res.data)
};
getDetailBlog();
}, []);
const handleDeleteClick = async () => {
const res = await axios.delete(`http://localhost:3001/blogs/${id}`)
getBlogs(res)
navigate('/');
}
쿼리 스트링은 문자열의 형태를 띠며 key = value
로 표현한다. url의 일부이므로 ?
이후부터 시작되고, 각 쿼리 스트링의 구분은 &
로 한다.
쿼리 스트링은 URL에 부가적인 정보를 포함하는 것이므로 라우터 컴포넌트에도 특별한 설정이 필요 없다. 아래처럼 링크 역할을 하는 컴포넌트에 쿼리 스트링이 포함된 주소를 전달하면 된다.
// Link
<Link to="/chart?region=강남구" />
// useNavigate
navigate("/chart?region=강남구")
useLocation
, useSearchParams
두 개가 있다. useLocation hook은 현재의 location 객체를 반환한다.const location = useLocation();
console.log(location);
console.log(location.search); // ?region=강남구
location 객체를 확인해 보면 여러 객체가 나오고 그중 search 프로퍼티가 퀴리 스트링 값을 담고 있는 것을 볼 수 있다. 이를 활용해 쿼리 스트링 값을 가져와 사용할 수 있다.
하지만 더 간단히 쿼리 스트링 값을 가져올 수 있는데 이것이 useSearchParams
다. react-router-dom 은 이 객체를 반환해 주는 useSearchParams라는 hook을 제공하고 아래처럼 useState 와 유사한 방식으로 선언하고 사용할 수 있다.
const [serchParams, setSearchParams] = useSearchParams();
// set 함수가 필요 없을 경우
const [serchParams] = useSearchParams();
searchParams.get(key)
: 특정한 key의 value를 가져오는 메서드, 해당 key의 value 가 두 개라면 제일 먼저 나온 value만 리턴searchParams.getAll(key)
: 특정 key에 해당하는 모든 value를 가져오는 메서드searchParams.toString()
: 쿼리 스트링을 string 형태로 리턴searchParams.set(key, value)
: 인자로 전달한 key 값을 value로 설정, 기존에 값이 존재했다면 그 값은 삭제
searchParams.append(key, value)
: 기존 값을 변경하거나 삭제하지 않고 추가
단, serchParams 을 변경하는 메서드로 값을 변경해도 실제 url의 쿼리 스트링은 변경되지 않는다. 이를 변경하려면 setSearchParams에 searchParams를 인자로 전달해야 한다.
import { useSearchParams } from 'react-router-dom';
const [searchParams, setSearchParams] = useSearchParams();
const setSortParams = () => {
searchParams.set('sort', 'clear');
setSearchParams(searchParams);
};
// append 메서드를 사용하면 기존 값을 유지하며 sort라는 키에 hello-world라는 value를 추가할 수 있다.
const appendSortParams = () => {
searchParams.append("sort", "hello-world");
setSearchParams(searchParams);
};