목차
반응형
React Router
리액트에서 SPA(Single Page Application)을 제작 하기 위해서는 Router(라우터)라는 라이브러리가 필요하다.
한 개의 페이지에서 라우터를 이용해서 여러 개의 페이지를 만들 수 있는 것이다.
설치
터미널로 npm을 통해서 라우터를 설치한다.
npm install react-router-dom
라우터의 기본 사용법
- import 로 'react-router-dom' 에서 { BrowserRouter, Routes, Route } 를 불러온다.
- BrowserRouter > Routes > Route 의 구조로 이루어 진다.
- Route 에는 path 와 element 속성으로 이루어져 있는데, path 는 페이지 URL의 맨 뒤 경로를 나타내고 element 에는 path의 경로에 진입했을 때 보여줄 컴포넌트 가 와야한다.
Home의 기본 주소 : 진입 시 <Home /> 컴포넌트를 불러온다.
path='/detail' 인 주소 : 진입 시 <Detail /> 컴포넌트를 불러온다.
import React from 'react';
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Home from './routes/Home';
import About from './routes/About';
import Navigation from './components/Navigation';
function App() {
return (
<BrowserRouter>
<Navigation />
// Routes : Route의 모음
<Routes>
// Route : 클릭을 했을 때 해당되는 주소의 컴포넌트를 불러오는 역할
<Route path='/' element={<Home />} />
<Route path='/about' element={<About />} />
<Route path='/detail' element={<Detail />} />
</Routes>
</BrowserRouter>
);
}
export default App;
라우터의 구조
라우터는 라우터를 통해서 이동하는 페이지와 일반페이지를 구분한다. 주로 src 폴더에 components 폴더와 routes 폴더로 구분한다.
BrowserRouter
- 웹 애플리케이션에 HTML5 History API 를 사용하여 페이지를 새로고침하지 않고 주소를 변경한다.
- 현재 주소에 관련된 정보를 컴포넌트에서 사용할 수 있도록 한다.
import { BrowserRouter } from "react-router-dom";
ReactDOM.render(
// 필수
<BrowserRouter>
<App/>
</BrowserRouter>
);
Route
- 주소규칙(path props)에 따라 어떤 컴포넌트(element props)를 보여줄지 정의한다.
<Route path="주소규칙" element={<컴포넌트 이름/>}/>
Routes
- Route 컴포넌트들은 반드시 Routes 의 자식 컴포넌트여야 한다.
- Routes 는 여러 Route 를 감싸서 주소규칙이 가장 일치하는 하나의 라우트를 렌더링한다.
- 모든 주소규칙와 일치하지 않을 때 보여 줄 Not Found 화면도 구현할 수 있다.
- path props 을 "/*" 라고 설정하면 해당 Route는 모든 경로에 매치가 가능하다.
- 만약 현재 브라우저 주소가 나머지 Route의 주소규칙과 일치하지 않았다면 이 Route가 렌더링된다.
<Routes>
<Route path="/" .... />
<Route path="/*" element={<NotFound/>}/>
</Routes>
Link
- App.js 에서 라우터로 지정해놓은 경로들을 사용해서 해당 컴포넌트를 불러온 페이지로 이동시켜 주는 컴포넌트다.
- 컴포넌트 자체는 a 태그 로 이루어져 있지만, 페이지 전환을 방지하는 기능이 내장되어 있다.
- HTML5 History API 를 이용하여 페이지의 주소만 변경한다.
- 반드시 import { Link } from 'react-router-dom'; 로 Link를 불러오고 사용해야 한다.
<Link to="주소">내용</Link>
Link를 사용하지만 실제 브라우저에서는 a태그로 표기되어서 CSS 스타일 적용도 a태그로 적용한다.
NavLink
- Link 컴포넌트 와 유사하지만 현재 사용자 브라우저 경로와 to props 의 경로가 일치하는 경우 특정 스타일 혹은 CSS 클래스 를 적용할 수 있는 컴포넌트이다.
const activeStyle={
textDecoration: "underline"
};
const activeClassName = "underline";
<NavLink to="messages" style={({ isActive }) => isActive ? activeStyle : undefined}>Messages</NavLink>
<NavLink to="messages" className={({ isActive }) => isActive ? activeClassName : undefined}>Tasks</NavLink>
URL 파라미터와 쿼리 스트링
useParams
- /product/:productId 와 같이 경로에 : 를 사용하여 설정 한다.
- URL 파라미터가 여러개인 경우엔 /product/:productId/:productName 과 같은 형태로 설정할 수 있다.
import { useParams } from 'react-router-dom';
const { 파라미터명 } = useParams(); // const 변수명 = useParams().파라미터명;
useLocation
- 상위 컴포넌트에서 props나 구조분해할당 을 통해 하위 컴포넌트가 받은 데이터를 라우터를 통해 다른 컴포넌트로 데이터를 전송하는 법이다.
- Link태그의 to프로퍼티로 URL의 주소를 지정하고 state프로퍼티로 보낼 데이터(props / 구조분해할당)를 지정해주면 된다.
- 이 때, 데이터는 브라우저의 URL을 통해서 보내진다.
속성 | 설명 |
hash | 주소의 #문자열 뒤의 값 |
pathname | 현재 주소 경로 |
search | 물음표(?)를 포함한 쿼리스트링 |
state | 페이지로 이동시 임의로 넣을 수 있는 상태 값 |
key | location 객체의 고유 값, 초기값은 default, 페이지가 변경될 때 마다 고유의 값이 생성된다. |
/* 상위로부터 props로 받고 하위에게 props로 보내는 법 */
import React from 'react';
import { Link } from 'react-router-dom';
export default function Component(props) {
const {data1, data2, data3...} = props;
return (
<Link to={'/detail'} state={props}>
);
}
/* 상위로부터 구조분해할당으로 받고 하위에게 구조분해할당으로 보내는 법 */
import React from 'react';
import { Link } from 'react-router-dom';
export default function Component({data1, data2, data3...}) {
return (
<Link to={'/detail'} state={{data1, data2, data3...}}>
);
}
다른 컴포넌트의 데이터(props) 를 useLocation 을 통해 받아와 변수에 할당한다.
import React from 'react';
import { useLocation } from 'react-router-dom';
export default function Detail() {
const location = useLocation();
console.log(location); // 객체 형태로 데이터가 콘솔에 찍힘
}
객체형태로 받아진 데이터의 키값 을 구조분해할당 하여 사용한다.
const { title, year, summary, poster, genres } = location.state;
useNavigate
- Link 컴포넌트를 사용하지 않고 다른 페이지로 이동을 해야 하는 경우, 뒤로가기 등에 사용하는 Hook 이다.
- replace 옵션을 사용하면 페이지를 이동할 때 히스토리를 남기지 않는다.
import React from 'react';
import { useNavigate } from 'react-router-dom';
export default const Product = () => {
const navigate = useNavigate();
return (
<ul>
<li><button onClick={() => navigate(-2)}>Go 2 pages back</button></li>
<li><button onClick={() => navigate(-1)}>Go back</button></li>
<li><button onClick={() => navigate(1)}>Go forward</button></li>
<li><button onClick={() => navigate(2)}>Go 2 pages forward</button></li>
<li><button onClick={() => navigate('/')}>Go Root</button></li>
<li><button onClick={() => navigate('/', {replace: true})}>Go Root</button></li>
</ul>
);
}
Reference
Home v6.8.2
I'm on v5 The migration guide will help you migrate incrementally and keep shipping along the way. Or, do it all in one yolo commit! Either way, we've got you covered to start using the new features right away.
reactrouter.com
반응형