TIL

24. 06. 20 TIL

효ㄷi 2024. 6. 20. 22:44

어제 리액트 라우터 돔에 대해 이어서 정리한다!

 

url에 따라 상품 정렬 필터링 하기는 쿼리 파라미터를 사용하면 된다.

 

웹사이트에서는 url에 따라 상품을 정렬하거나 필터링 할 수 있는데, 이를 위에 url에 ?를 사용하여 정보를 추가할 수 있다.

여러 개의 정보를 넣을 때는 &를 사용한다.

 

https://comic.naver.com/challenge?genre=FANTASY&page=2

예를 들면 이렇게 코드가 있으면, 두 가지 정보를 나타내는데

genre=FANTASY&page=2는 각각 장르와 페이지 정보를 나타낸다.

 

여기서 ? 뒤에 키와 값 형태로 정보를 추가할 수 있고, 여러 정보를 추가하려면 &로 구분한다.

 

이제 url 쿼리 파라미터를 사용하려면 useSearchParams 코드를 추가해야 한다.

 const [searchParams, setSearchParams] = useSearchParams();

 

이제 버튼 클릭시 주소가 변경되게 하고 싶다.

setSearchParams({
	sort: "price"
})

이러코롬... 버튼을 클릭하면 <주소>/products 였던 것이 <주소>/products?sort=price로 변경된다.

 


 

이제 반복되는 레이아웃을 한 번만 만들고 싶다면 (ex. header)

 

1. 레이아웃 컴포넌트를 만들고, Main.jsx 파일에서 공통된 부분만 레이아웃 컴포넌트에 복붙한다.

function Layout() {
  return (
    <>
      <header
        style={{
          display: "flex",
          justifyContent: "space-between",
          padding: "24px",
          backgroundColor: "#000000",
          color: "white",
        }}
      >
        <div>로고</div>
        <div
          style={{
            display: "flex",
            gap: "12px",
          }}
        >
          <div>로그인</div>
          <div>회원가입</div>
        </div>
      </header>
    </>
  );
}

export default Layout;

 

 

2. 그리고 라우터 파일에서 다른 Route들을 하나로 감싸는 Route를 만들어서 

  <Route element={<Layout />}>
          <Route path="/" element={<Main />} />
          <Route path="/products" element={<Products />} />
          <Route path="/products/:id" element={<Product />} />
        </Route>

이렇게 넣어준다. 그러면 각 페이지는 레이아웃의 일부가 되고, 레이아웃의 헤더를 공유하게 된다.

 

3. 이제 레이아웃 사이에 있는 main, products, product들을 어디에 넣을지 결정해야 하는데

outlet 컴포넌트는 이것들을 어디에 보여줄지 결정하는 역할이다.

import { Outlet } from "react-router-dom";

function Layout() {
  return (
    <>
      <header
        style={{
          display: "flex",
          justifyContent: "space-between",
          padding: "24px",
          backgroundColor: "#000000",
          color: "white",
        }}
      >
        <div>로고</div>
        <div
          style={{
            display: "flex",
            gap: "12px",
          }}
        >
          <div>로그인</div>
          <div>회원가입</div>
        </div>
      </header>
      <Outlet />
    </>
  );
}

export default Layout;

없는 페이지 처리하기 - 404 페이지

 

존재하지 않는 주소로 접근할 때는 흰 화면이 나오는데 이럴 때는 path='*'를 추가하고,

존재하지 않는 주소 접속 시에 보여줄 컴포넌트를 element 속성에 추가하면 된다.

 

    <BrowserRouter>
      <Routes>
        <Route element={<Layout />}>
          <Route path="/" element={<Main />} />
          <Route path="/products" element={<Products />} />
          <Route path="/products/:id" element={<Product />} />
        </Route>
        <Route path="*" element={  <>
              <div>없는 페이지입니다.</div>
              <Link to="/">홈으로 이동</Link>
            </>} />
      </Routes>
    </BrowserRouter>