React Router
- 개발자가 주소별로 다른 컴포넌트를 보여주기 위해 사용하는 라이브러리
 
- 여러 환경에서 동작할 수 있도록 여러 종류의 라우터 컴포넌트 제공
 
- 주요 컴포넌트
- BrowserRouter
 
- Routes
 
- Route
 
- Link
 
- createBrowserRouter
 
 
npm i react-router-dom@6
SPA
- Single Page Application 
- cf) MPA (Multi Page Application)
 
 
- 단일 웹페이지로 돌아가는 어플리케이션
 
- 브라우저에서 javascript를 이용해 단일 웹페이지 상의 HTML 요소를 동적으로 생성 및 조작
 
- 검색 엔진 최적화 (SEO) 에는 적합 ❌
- cf) 리액트의 단점을 보완한 것이 next.js (검색 엔진 최적화 ⭕)
 
 
Routing
- 사용자가 요청한 URL에 따라 해당 URL에 맞는 페이지를 보여주는 것
 
- React Router 라이브러리가 가장 많이 사용됨
 
- 새로고침 ❌ 
 
- 기존 컴포넌트를 지우고, 새로운 컴포넌트를 불러옴
 
- 새로고침하지 않고 이동하도록 만드는 것이 리액트의 핵심
 
BrowserRouter
- HTML5를 지원하는 브라우저의 주소 감지
 
- Router의 역할
 
- 새로고침을 하지 않아도 새로운 컴포넌트를 렌더링해줌
 
- URL마다 컴포넌트가 바뀔 때, 바뀌는 부분의 최상단에 위치해야 함
 
import { BrowserRouter } from "react-router-dom";
const ReactRouter = () => {
	return (
      <div>
      	<BrowserRouter>
      	</BrowserRouter>
      </div>
    );
};
Routes, Route
- 경로가 일치하는 컴포넌트를 렌더링해주도록 경로 매칭
 
- Route에서는 구체적으로 어떤 컴포넌트를 렌더링할 것인지 결정
 
<Routes>
  <Route path="/" element={<Main />}</Route>
  <Route path="/product/:id" element={<Product />}</Route>
  <Route path="*" element={<NotFound />}</Route>
</Routes>
- path : 경로
 
- element : 연결할 컴포넌트
 
- url이 계속 뒤에 붙도록 만들 때 : / 생략
 
- 절대 경로로 이동하도록 만들 때 : /user 와 같이 입력
 
Link
- 경로를 변경
 
- 기존 HTML의 a 태그는 새로고침하여 렌더링 수행 
 
- Link 컴포넌트는 페이지 전환 방지
 
<Link to="/">
  <h1>헤더입니다.</h1>
</Link>
createBrowserRouter
- 사용성, 확장성 측면에서 createBrowserRouter가 더 좋음
 
import { createBrowserRouter } from "react-router-dom";
const Router = createBrowserRouter([
  {
    path: "/",
    element: <App />,
    children: [
    	{
    		path: "about",
    		element: <About />,
  		},
  		{
          	path: "",
          	element: <Home />,
          	errorElement: <Error />,
        },
  	],
    errorElement: <NotFound />,
  }
]);
Outlet
- 중첩 라우트 렌더링
 
- 중첩 라우트의 부모 라우트 컴포넌트 내에서 사용
 
- 해당 부모 라우트의 url과 일치하는 자식 라우트 컴포넌트 렌더링
 
- context를 이용하여 자식 라우트에 데이터 전송 가능 - 자식 라우트에서는 useOutletContext( ) 사용
 
function App() {
  return (
    <>
    	<Header />
    	<Outlet />
    </>
  );
}
react-router-dom Hooks
useParams
- ex) /product/:id
 
- 경로에 : 를 사용하여 설정
 
- url 파라미터가 여러 개인 경우 → /product/:id/:name 과 같이 설정
 
import { useParams } from "react-router-dom";
const { 파라미터명 } = useParams();
useSearchParams
- queryString은 페이지 이동 ❌ 정보만 받는 것 ⭕
 
const [searchParams, setSearchParams] = useSearchParams();
searchParams.get("mode");
set SearchParms({ mode: "Dark" });
- searchParams : queryString 값을 가져옴
 
- setSearchParams : queryString 값을 할당
 
useNavigate
- Link 컴포넌트를 사용하지 않고 사용자를 어딘가로 이동시키는 기능
 
- 다른 페이지로 이동, 뒤로 가기 등에 사용
 
const navigate = useNavigate();
<button onClick={() => navigate(-1)}Go back</button>
<button onClick={() => navigate(1)}Go forward</button>
<button onClick={() => navigate("/")}Go Root</button>