Javascript를 배우고 있습니다. 매일 배운 것을 이해한만큼 정리해봅니다.
오늘은 React Router 패키지 중 Config에 대해 적어봅니다.
지난 2주는 회사에 적응하느라 정신이 없었다. 프로젝트를 진행해 봤다고는 하나 역시나 현업에서 코드를 보니 @.@ 맙소사 아직 모르는 것이 참 많고, 업무를 위해 급히 배워야 할 것들도 많았다. 심지어 알던 것도 버벅거리는 나 자신을 보면서... 아? ㅋㅋㅋ
그래서 일단 이번 달 안으로 React 일부 기능(hoc, ref 등), Hooks, React Router Config, Styled Component, Emotion.js 등을 학습 or 재학습하려고 한다.
오늘은 React Router Config이다.
<Router>
, <Link>
, <Redirect>
등을 이용해 라우팅을 하는데 보통 커스텀 컴포넌트 안에 attributes로 어느 주소로 이동해 어느 컴포넌트를 보여줄 것인지를 정한다."Static route configuration helpers for React Router."
$ npm install --save react-router-config 혹은 yarn add react-router-config
// using an ES6 transpiler, like babel
import { matchRoutes, renderRoutes } from "react-router-config";
// not using an ES6 transpiler
var matchRoutes = require("react-router-config").matchRoutes;
Root> Home
, Root> Child
혹은 Child> GrandChild
의 경우가 그렇다. Root> Home, Child
케이스를 참고하면 된다.const routes = [
{
component: Root,
routes: [
{
path: "/",
exact: true,
component: Home
},
{
path: "/child/:id",
component: Child,
routes: [
{
path: "/child/:id/grand-child",
component: GrandChild
}
]
}
]
}
];
matchRoutes
이다.// api 형태
matchRoutes(routes, pathname)
routes
, pathname
import { matchRoutes } from "react-router-config";
const branch = matchRoutes(routes, "/child/23");
/* 리턴값 -> [ routes[0], routes[0].routes[1] ]
routes[0] -> 전체 라우트 객체
routes[0].routes[1] -> "/child/23"를 기준으로 찾은 라우트 "/child/:id"의 정보들 즉,
{path: "/child/:id",
component: Child,
routes: [
{path: "/child/:id/grand-child",
component: GrandChild}
]
}
*/
routes
와 match
라는 속성이 있다.branch[0].match.url;
branch[0].match.isExact;
// match에는 url, isExact, params 등 라우트에 관련된 정보가 담겨있다.
<Route>
대신에 renderRoutes를 통해서 routes 구조를 뿌려(?)줘야 한다.import { renderRoutes } from "react-router-config";
const routes = [
{
component: Root,
routes: [
{
path: "/",
exact: true,
component: Home
},
{
path: "/child/:id",
component: Child,
routes: [
{
path: "/child/:id/grand-child",
component: GrandChild
}
]
}
]
}
];
const Root = ({ route }) => (
<div>
<h1>Root</h1>
{/* 자식 라우트들이 렌더할 수 있도록 renderRoutes 실행 */}
{renderRoutes(route.routes)}
</div>
);
const Home = ({ route }) => (
<div>
<h2>Home</h2>
</div>
);
const Child = ({ route }) => (
<div>
<h2>Child</h2>
{/* 자식 라우트들이 렌더할 수 있도록 renderRoutes 실행 */}
{renderRoutes(route.routes, { someProp: "these extra props are optional" })}
</div>
);
const GrandChild = ({ someProp }) => (
<div>
<h3>Grand Child</h3>
<div>{someProp}</div>
</div>
);
ReactDOM.render(
<BrowserRouter>
{/* renderRoutes에 루트 라우트를 뿌려주면서 앱 구조 나열 */}
{renderRoutes(routes)}
</BrowserRouter>,
document.getElementById("root")
);
import React from "react";
import {
BrowserRouter as Router,
Switch,
Route,
Link
} from "react-router-dom";
const routes = [
{
path: "/sandwiches",
component: Sandwiches
},
{
path: "/tacos",
component: Tacos,
routes: [
{
path: "/tacos/bus",
component: Bus
},
{
path: "/tacos/cart",
component: Cart
}
]
}
];
export default function RouteConfigExample() {
return (
<Router>
<div>
<ul>
<li>
<Link to="/tacos">Tacos</Link>
</li>
<li>
<Link to="/sandwiches">Sandwiches</Link>
</li>
</ul>
<Switch>
{routes.map((route, i) => (
<RouteWithSubRoutes key={i} {...route} />
))}
</Switch>
</div>
</Router>
);
}
function RouteWithSubRoutes(route) {
return (
<Route
path={route.path}
render={props => (
// pass the sub-routes down to keep nesting
<route.component {...props} routes={route.routes} />
)}
/>
);
}
function Sandwiches() {
return <h2>Sandwiches</h2>;
}
function Tacos({ routes }) {
return (
<div>
<h2>Tacos</h2>
<ul>
<li>
<Link to="/tacos/bus">Bus</Link>
</li>
<li>
<Link to="/tacos/cart">Cart</Link>
</li>
</ul>
<Switch>
{routes.map((route, i) => (
<RouteWithSubRoutes key={i} {...route} />
))}
</Switch>
</div>
);
}
function Bus() {
return <h3>Bus</h3>;
}
function Cart() {
return <h3>Cart</h3>;
}
수지님 화이팅~~~ 나중에 저도 알려주세요!