..

Search

34) 추가 Hook 살펴보기

추가 Hook 살펴보기


useParams Hook으로 URL 파라미터 구현하기

useParams는 현재 URL에서 Route 컴포넌트의 path prop의 값과 일치하는 키(key)와 값(value)의 쌍으로 이루어진 객체를 반환하며, 이를 활용하여 주소의 경로를 정의할 때 동적인 값을 사용할 수 있습니다. 이때 하위 경로는 상위 경로에서 모든 매개변수를 상속 받으며, 주로 ID나 이름을 사용하여 특정 데이터를 연결할 때 사용합니다.

 

다음 예제는 params를 통해 숫자로 된 newsId를 넘겨받아 해당 숫자를 페이지 주소로 사용하는 예제입니다.

우선 NewsData 컴포넌트를 생성하고 다음과 같이 코드를 작성합니다.

NewsData.js
import { useParams } from "react-router-dom";  const data = {  1: {  publisher: "△△일보",  title: "React! 풀스택을 꿈꾸며!"  },  2: {  publisher: "☆☆뉴스",  title: "바닐라 Javascript의 반란!"  } };  const NewsData = () => {  const params = useParams();  const newsData = data[params.newsId];   return (  <div>  <h2>React News</h2>  {newsData ? (  <div>  <h2>{newsData.publisher}</h2>  <p>{newsData.title}</p>  </div>  ) : (  <p>존재하지 않는 뉴스입니다.</p>  )}  </div>  ); };  export default NewsData;
News.js
import { Link } from "react-router-dom";

const News = () => {
  return (
    <div>
      <h2>React News</h2>
      <p>React에 대한 News를 모아놓은 페이지입니다.</p>
      <ol>
        <li>
          <Link to="1">△△일보</Link>
        </li>
        <li>
          <Link to="2">☆☆뉴스</Link>
        </li>
      </ol>
    </div>
  );
};

export default News;

 

params의 이름은 Route 컴포넌트의 path prop을 통해 설정할 수 있으며, 이때 콜론(:)을 사용하여 경로를 표시합니다.

예제(App.js)
// ...
import NewsData from "./components/NewsData";
// ...
const App = () => {
  return (
    <div>
      <h1>React Router</h1>
      <Routes>
        <Route path="/" element={<Menu />}>
          <Route index element={<Home />} />
          <Route path="about" element={<About />} />
          <Route path="news" element={<News />} />
          <Route path="news/:newsId" element={<NewsData />} />
          <Route path="*" element={<NoMatch />} />
        </Route>
      </Routes>
    </div>
  );
};
// ...

 

위의 예제에서 News 메뉴를 클릭하고, 페이지에 표시된 뉴스를 선택해 봅시다. 웹 브라우저 주소창에서 해당 페이지의 URL 주소를 확인해 보면, 가장 마지막에 우리가 설정한 숫자가 URL 파라미터로 사용되고 있음을 확인할 수 있습니다.


useSearchParams Hook으로 쿼리스트링 구현하기

쿼리스트링(query string)이란 URL 주소 뒤에 사용자의 입력 데이터를 함께 전달하는 가장 단순한 데이터 전달 방법 중 하나입니다.

쿼리스트링은 URL 주소 뒤에 물음표(?)를 시작으로 key=value의 형태로 파라미터를 전달하게 됩니다. 여러 개의 파라미터를 동시에 전달할 때는 & 문자로 연결하여 한 번에 전달할 수 있습니다.

쿼리스트링 문법

URL?key=value[&key=value];

 

이를 활용하면 검색 키워드를 전달하거나 정렬 방식을 변경하는 등 데이터를 조회할 때 필요한 옵션을 손쉽게 전달할 수 있습니다.

 

React에서는 useSearchParams Hook을 사용하여 이러한 쿼리스트링을 손쉽게 파싱하여 사용할 수 있습니다. useSearchParams는 useState와 같이 현재 경로에 대한 검색 파라미터와 이를 업데이트할 수 있는 함수를 배열 형태로 동시에 반환합니다.

 

다음 예제는 사용자로부터 검색할 뉴스의 ID를 입력받아 해당 데이터를 쿼리스트링으로 생성해 보는 예제입니다.

Search.js
import { createSearchParams, useSearchParams } from "react-router-dom";

const Search = () => {
  const [searchParams, setSearchParams] = useSearchParams();

  return (
    <input
      value={searchParams.newsId}
      onChange={(e) => {
        setSearchParams(createSearchParams({ newsId: e.target.value }));
      }}
      placeholder="검색할 뉴스 ID를 입력하세요."
    />
  );
};

export default Search;
예제(App.js)
import { Link, Outlet } from "react-router-dom";
import Search from "./Search";

const Menu = () => {
  return (
    <div>
      <nav>
        // ...
      </nav>
      뉴스 검색 : <Search />
      <hr />
      <Outlet />
    </div>
  );
};

export default Menu;

 

위의 예제에서 사용자 입력 필드에 다양한 숫자나 텍스트를 입력해 보면서, 이에 따라 주소창의 URL 주소가 어떻게 변하는지 살펴보도록 합시다.


연습문제