이 글은, 최신버젼이 있지만, 그래도 상용화 되어있는 react-route 를 위하여, v5 에 대하여 정리해 본다.
1. import { Route } from "react-router-dom"
기본적인 라우트 기능이다.
path 가 맞을때, 렌더되며, 시작 path 가 동일한 모든, Route 에 대하여, 렌더한다.
import { Route } from "react-router-dom"
<Route path="/welcome"> // path 를 지정하고 불러온다.
<Welcome />
</Route>
<Route path={"/products"}>
<Products />
</Route>
2. import { BrowserRouter } from "react-router-dom"
라우터 기능을 활성화 시키기 위한, 프로바이더 정도 생각한다.
앱을 감싸는 최상위 컴포넌트에 적용시키면, 모든 앱에 라우트 기능을 사용 할 수 있다.
App.js 나 index.js 등에 사용한다. 나는 index.js
< index.js >
import { BrowserRouter } from "react-router-dom"; // 라우트의 기능을 잠금해제한다.
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<BrowserRouter> // 감싸자
<App />
</BrowserRouter>
);
3. import { Link } from "react-router-dom"
앵커태그는, HTTP 요청을 통해, 완전히 새 페이지를 받고, 적용시킨다
즉, REACT 의 장점과는 전혀 맞지 않는, 불필요한 메모리를 낭비하는 요소가 된다.
REACT 는 부분적인 DOM 의 교체(가상 돔을 이용하여) 를 이용한 빠른 유저 경험을 제공한다.
그러므로, 그에 맞는 Link 를 사용하여, 다른 페이지를 로드 한다.
import styles from "./main-header.module.css";
import { Link } from "react-router-dom";
function MainHeader() {
return (
<ul className={styles.main_header}>
<li>
<Link to="/welcome"> 웰컴</Link>
</li>
<li>
<Link to="/products"> 프로덕트 </Link>
</li>
</ul>
);
}
export default MainHeader;
스타일은 그대로 a 로 적용시킨다.
.main_header a {
color: gold;
}
.main_header a:hover {
color: red;
}
4. import { NavLink } from "react-router-dom"
현재 경로와 NavLink 의 경로가 일치하면, 스타일을 적용시키는, 특수한 형태의 Link 이다.
import styles from "./main-header.module.css";
import { NavLink } from "react-router-dom";
<NavLink to="/profiles/gildong" activeStyle={{ background: 'black', color: 'white' } >
네브링크
</NavLink>
<NavLink to="/profiles/gildong" activeClassName={styles.header} >
네브링크
</NavLink>
5. 라우트와 동적 라우트 [ / url / :dynamicURL ]
<div>
<Route path={"/products"}> // products 를 들어가면 이 페이지
<Products />
</Route>
<Route path={"/products/:productsName"}> // "products/ 이후 아무거나 입력"하면 이 페이지
<ProductDetail />
</Route>
</div>
6. import { Switch } from "react-router-dom" & "exact" // 동시 렌더되는 Route 막기 [ exact ]
<Switch> // Switch 로 감싸면, "일치하는 단 하나의 컴포넌트만 렌더된다"
<Route exact path={"/products"}> // exact 옵션을 선택하면, 정확히 "/products/ 로만 렌더된다.
<Products />
</Route>
<Route path={"/products/:productsName"}>
<ProductDetail />
</Route>
</Switch>
7. import { useParams } from "react-router-dom" [동적 페이지의 값 가져오기]
동적 페이지로 접근했다. 왜?
동적인 값을 받기 위하여.
동적인 값을 받으려면, useParams 를 사용한다.
"localhost:3000/products/chairs"
"localhost:3000/products/books"
"localhost:3000/products/desks"
위의 주소는 전부, /products/:productName 의 주소로 인해, 렌더된다.
[/products/:productName 의 주소로 렌더]
<product-detail page >
import { useParams } from "react-router-dom";
const ProductDetail = () => {
const params = useParams(); // useParams 를 사용하여
console.log(params); // 아래 각각 페이지에 들어 갈때,
[결과값]
"localhost:3000/products/chairs" // {productName : chairs}
"localhost:3000/products/books" // {productName : books}
"localhost:3000/products/desks" // {productName : desks}
8. 중첩 라우트 사용하기
라우트에 의해 렌더된 컴포넌트 안에서, 또 하나(여러개)의 라우트를 사용할 수 있다.
<App.js>
...
<div>
<Route path="/welcome">
<Welcome />
</Route>
</div>
<Welcome.js>
import { Route } from "react-router-dom";
function Welcome() {
return (
<div>
웰컴!
<Route path="/welcome/new-user"> // 주소가 중요하다. 상위의 주소를 반드시 전부 입력해야한다.
<p> 신입이냐!</p>
</Route>
</div>
);
}
export default Welcome;
주의사항
http://localhost:3000/welcome, 에 접속해서, Welcome.js 가 렌더되었다.
Welcome.js 안에 중첩된 라우트의 주소가
path = "/new-user
라면, 과연 코드는 실행될까?
그렇지 않다.
http://localhost:3000/new-user 의 URL 주소로 접근하는 순간,
App.js 의 Welcome.js 의 렌더하는 조건(path) 가 달라지므로,
상위의 라우트가 렌더되지 않으므로, 중첩된 라우트는 렌더되지 않는다.
** 반드시, 상위 라우트의 주소를 포함한 "모든 주소" 를 path 에 적어야한다.
'React > React-Route' 카테고리의 다른 글
6. useHistory, 복잡한 쿼리매개변수와 path 를 가지고 있을 때, 사용방법 (0) | 2022.12.22 |
---|---|
5. onFocus 리스너와 함께하는 Prompt 로 "정말 뒤로 갈건지 한번 딱 물어봐주기" (0) | 2022.12.22 |
4. 잘못된 URL 주소로 들어간다면, Not Found Page 돌려주기 (1) | 2022.12.22 |
3. 쿼리 매개변수를 사용해, 아이템 정렬하기 [ useHistory, useLocation , URLSearchParams ] (0) | 2022.12.20 |
2. React-Route의 기본 사용(2) v5 (0) | 2022.12.20 |
댓글