페이지 이동을 구현할 수 있게 해주는 패키지.
실제 웹 서비스에서는 여러 페이지를 오가며 이동하는 방식이 일반적임.
react-router-dom을 사용하면 여러 페이지를 가진 웹 구현 가능.
npm install react-router-dom
여러 페이지 이동을 위한 가상 페이지 생성.
Home, About, Contact, Works 총 4개의 컴포넌트 생성.
src/pages 폴더 하위에 생성.
URL에 따라 원하는 페이지 컴포넌트로 이동하게 만드는 역할.
URL 1개당 하나의 페이지 컴포넌트를 매칭. 이 하나의 URL을 Route라고 부름.
여러 Route를 관리하는 코드는 보통 Router.js로 분리.
// src/shared/Router.js
import React from "react";
// react-router-dom을 사용하기 위해 아래 API들을 import
import { BrowserRouter, Route, Routes } from "react-router-dom";
// 페이지 컴포넌트 import
import Home from "../pages/Home";
import About from "../pages/About";
import Contact from "../pages/Contact";
import Works from "../pages/Works";
const Router = () => {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="about" element={<About />} />
<Route path="contact" element={<Contact />} />
<Route path="works" element={<Works />} />
</Routes>
</BrowserRouter>
);
};
export default Router;
BrowserRouter를 Router로 감싸는 이유는
SPA의 장점인 브라우저가 깜빡이지 않고 다른 페이지로 이동할 수 있게 만들기 위해.
즉, 페이지 이동 시 새로고침 없이 화면 전환 가능.
path=”” : URL 주소
element={} : 해당 주소에서 보여줄 컴포넌트
import React from "react";
import Router from "./shared/Router";
function App() {
return <Router />;
}
export default App;
App.js는 프로젝트 최상위 컴포넌트. 모든 화면 렌더링은 App.js를 반드시 거침.
따라서 URL 분기 처리를 담당하는 Router를 App.js에 배치.
모든 사용자가 App → Router 흐름을 거치도록 구성.
React에서 useState와 같은 hook을 제공하는 것 처럼
react-router-dom에서도 전용 hook 제공.
다른 페이지로 이동할 때 사용하는 hook.
브라우저 주소창에 직접 path 입력하는 방식은 실사용에 부적합.
일반적으로 버튼 클릭 또는 컴포넌트 클릭으로 페이지 이동 처리.
이때 사용하는 것이 useNavigate
// src/pages/home.js
import { useNavigate } from "react-router-dom";
const Home = () => {
// navigate 생성
const navigate = useNavigate();
return (
// navigate("이동할 URL") 호출
<button
onClick={() => {
navigate("/works");
}}
>
works로 이동
</button>
);
};
export default Home;
현재 위치한 페이지의 정보 조회 가능.
URL 정보 기반 조건부 렌더링 등에 활용.
// src/pages/works.js
import { useLocation } from "react-router-dom";
const Works = () => {
const location = useLocation();
console.log("location :>> ", location);
return (
// pathname을 활용해 현재 페이지 정보 출력 가능.
<div>
<div>{`현재 페이지 : ${location.pathname.slice(1)}`}</div>
</div>
);
};
export default Works;
Hook은 아니지만 반드시 알아야 할 API. HTML의 a 태그를 대체하는 컴포넌트.
JSX에서 페이지 이동 시 a 태그 사용 금지. a 태그 사용 시 페이지 새로고침 발생.
새로고침 시
즉, 성능 저하 발생
// src/pages/works.js
import { Link, useLocation } from 'react-router-dom';
const Works = () => {
const location = useLocation();
console.log('location :>> ', location);
return (
<div>
<div>{`현재 페이지 : ${location.pathname.slice(1)}`}</div>
<Link to="/contact">contact 페이지로 이동하기</Link>
</div>
);
};
export default Works;
useNavigate와 Link를 상황에 맞게 선택해서 사용.