React Router
- ํ์ด์ง๋ฅผ ์ ํํ๋ค.
https://v5.reactrouter.com/web/guides/quick-start
Declarative routing for React apps at any scale | React Router
Version 6 of React Router is here! React Router v6 takes the best features from v3, v5, and its sister project, Reach Router, in our smallest and most powerful package yet.
reactrouter.com
ํฐ๋ฏธ๋์ ์ผ์ install ํด์คฌ๋ค.
์ด์ ์ฝ๋๋ฅผ ๋ฐ๊พธ๊ฑฐ๋ ์ด๋์์ผ์ผํ๋๋ฐ ์คํฌ๋ฆฐ ๋จ์๋ก ์๊ฐํด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ฐ๋ฆฌ๋ route ๋ณ๋ก ์๊ฐํด์ผํ๋ค. ์คํฌ๋ฆฐ, ํ์ด์ง, route ๋ถ๋ฅด๊ณ ์ถ์๋๋ก ๋ถ๋ฅด์
๋ด๊ฐ ๋ง๋๋ app์ home route๋ฅผ ๋๊ณ ์ฌ๊ธฐ์ ๋ชจ๋ ์ํ๋ฅผ Movie route๋ฅผ ๋ง๋ค์ด ํ๋์ ์ํ๋ฅผ ๋ณด์ฌ์ค ๊ฒ์ด๋ค.
react project ํด๋์์ src ํด๋ ์์ routes ๋ผ๋ ํด๋์ components ํด๋๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ App ์์ ๋ด์ฉ์ ์ ๋ถ Home.js๋ก ์ฎ๊ฒจ์คฌ๋ค.
์ด์ App.js๋ ๋ ์ด์ ์ํ๋ฅผ ๋ณด์ฌ์ฃผ์ง ์๊ณ ๋์ ์ App.js๋ router๋ฅผ renderํ๋ค.
router๋ URL์ ๋ณด๊ณ ์๋ component๊ณ ์ฐ๋ฆฌ๊ฐ localhost:3000์ ์๋ค๋ฉด Home component๋ฅผ ๋ณด์ฌ์ค๋ค
์ฐ๋ฆฌ๊ฐ localhost:3000/movies ์ด๋ ๊ฒ ์ ์ํ๋ค๋ฉด router์ Detail component๋ฅผ ๋ณด์ฌ์ค ๊ฒ์ด๋ค.
react-router-dom์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ช๊ฐ์ง๋ฅผ import ํด์ผํ๋ค.
App.js
์ฝ๋๋ฅผ ์ด๋ ๊ฒ ๋ง๋ค์ด์ค๋ค.
import{
BrowserRouter as Router,
Switch,
Route,
} from "react-router-dom";
function App() {
return null;
}
export default App;
๋ผ์ฐํฐ์๋ hash router, browser router ๋๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค.
swith๋ route๋ฅผ ์ฐพ๋ ์ผ์ ํ๋๋ฐ route๋ url์ ์๋ฏธํ๋ค.
route๋ฅผ ์ฐพ์ผ๋ฉด ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ค.
function App() {
return <Router>
<Switch>
<Route>
<Home/>
</Route>
</Switch>
</Router>;
}
route์์ ์ปดํฌ๋ํธ๋ฅผ ์จ์ค ๊ฑด๋ฐ
์๋ฅผ ๋ค์ด์ 2๊ฐ์ route๋ฅผ ๋ง๋ ๋ค๋ฉด, ํ๋๋ ์ ์ ๊ฐ ํํ๋ฉด์ผ๋ก ๊ฐ ๋ ์ฌ์ฉํ route์ด๋ค.
path๊ฐ "/"๋ผ๋ฉด ํ ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ค๋ค
'Switch' is not exported from 'react-router-dom'.
=> ๋ฒ์ ์ด ๋ฐ๋์ด์ ๊ทธ๋ฐ๊ฐ ์ด๋ฐ ์ค๋ฅ๊ฐ ๋ฌ๋ค.
์ด๋ ๊ฒ ๋ฐ๊ฟ์ฃผ์๋๋ ์ ๋๋ค!
Switch๋ฅผ Routes๋ก Home ์ปดํฌ๋ํธ๋ฅผ element๋ก ๋ฃ์ด์คฌ๋ค.
function App() {
return (
<Router>
<Routes>
<Route path="/" element= {<Home />}>
</Route>
</Routes>
</Router>
);
}
์์ธํ์ด์ง๋ ๋๊ฐ์ด ์ถ๊ฐํด์ค๋ค.
import {
BrowserRouter as Router,
Route,
Routes
} from "react-router-dom";
import Home from "./routes/Home";
import Detail from "./routes/Detail";
function App() {
return (
<Router>
<Routes>
<Route path="/movie" element= {<Detail />}></Route>
<Route path="/" element= {<Home />}></Route>
</Routes>
</Router>
);
}
export default App;
Browser router์ hash router๋ URL ์๊น์์ ์ฐจ์ด๊ฐ ์๋ฐ.
Browser router๋ ์ฐ๋ฆฌ๊ฐ ํ์ ๋ณด๋ url ๊ฐ๋ค
Hash router๋ ๋ค์ /#/ ์ฒ๋ผ ๋ญ๊ฐ ํ๋ ๋ ๋ถ๋๋ค.
์ด์ ํ๊ณ ์ถ์๊ฑด route์์ route๋ก ์ด๋ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ ์ ๊ฐ ์ํ์ ๋ชฉ์ ํด๋ฆญํ๋ฉด ์ด๋ํ๋๋ก ํ๊ณ ์ถ๋ค.
๋จ์ html์ด๋ฉด a link="/movie"๋ก ํ์ ๊ฒ์ด๋ค. ๋๊ธฐ๋ ํ์ง๋ง ํ์ด์ง ์ ์ฒด๊ฐ ์ฌ์คํ๋๋ค.
react์ Link ์ปดํฌ๋ํธ๋ฅผ ์ด์ฉํด์ ์ฌ์คํ์ ๋ง๊ณ ์ถ๋ค
Link๋ ๋ธ๋ผ์ฐ์ ์๋ก๊ณ ์นจ ์์ด๋ ์ ์ ๋ฅผ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋์์ผ์ฃผ๋ ์ปดํฌ๋ํธ์ด๋ค.
function Movie({coverImg, title, summary, genres}) {
// App.js์ผ๋ก๋ถํฐ movie ์ ๋ณด๋ฅผ ๋ฐ๋๋ค
return (
<div>
<img src={coverImg} alt={title} />
<h2>
<Link to="/movie">{title}</Link>
</h2>
<p>{summary}</p>
<ul>
{genres.map((g) => (
<li key={g}>{g}</li>
))}
</ul>
</div>
);
}
React Router๋ ๋ค์ด๋๋ฏน URL์ ์ง์ํด์ฃผ๊ธฐ๋ ํ๋ค.
๋ค์ด๋๋ฏนํ๋ค๋๊ฑด url์ ๋ณ์๋ฅผ ๋ฃ์ ์ ์๋ค๋ ์๋ฏธ์ด๋ค. ์ด๊ฑธ ์ด์ฉํด์ ๊ฐ ์ํ์ ์์ธํ์ด์ง๋ฅผ ๋ง๋ค์ด ์ค ๊ฒ์ด๋ค.
/movie/:id ์ฌ๊ธฐ์ ":" ์จ์ฃผ๋๊ฒ ์ค์ํ๋ค. :๊ฐ ์์ผ๋ฉด "id"๋ผ๋ ํ ์คํธ ์์ฒด๋ก ๋ณด๋ด์ง๋ค.
props ๋ก id๋ ๋ฐ์ ์ ์๋๋ก ์ถ๊ฐํ๋ค. Home์์ ์ฃผ๊ณ Movie์์ ๋ฐ๊ณ
App.js
unction App() {
return (
<Router>
<Routes>
<Route path="/movie/:id" element= {<Detail />}></Route>
<Route path="/" element= {<Home />}></Route>
</Routes>
</Router>
);
}
Home.js
Movie.js
import PropTypes from "prop-types"
import {Link} from "react-router-dom"
function Movie({id, coverImg, title, summary, genres}) {
// App.js์ผ๋ก๋ถํฐ movie ์ ๋ณด๋ฅผ ๋ฐ๋๋ค
return (
<div>
<img src={coverImg} alt={title} />
<h2>
<Link to={`/movie/${id}`}>{title}</Link>
</h2>
<p>{summary}</p>
<ul>
{genres.map((g) => (
<li key={g}>{g}</li>
))}
</ul>
</div>
);
}
Movie.propTypes = {
id:PropTypes.number.isRequired,
coverImg: PropTypes.string.isRequired,
title: PropTypes.string.isRequired,
summary: PropTypes.string.isRequired,
genres: PropTypes.arrayOf(PropTypes.string).isRequired
};
export default Movie;
React Router์์ ์ ๊ณตํ๋ ํจ์์ค url์ ์๋ ๊ฐ์ ๋ฐํํด์ฃผ๋ useParams๋ผ๋ ํจ์๊ฐ ์๋ค.
useParams๋ก ํ์ฌ ํ์ด์ง์ url ๋งจ ๋ค์ ๋ถ์ id๊ฐ์ ๊ฐ์ ธ์จ๋ค.
์๊น :id ์ด๋ ๊ฒ ์ด ๋ถ๋ถ์์ id๊ฐ ๋ณ์์ด๋ค. x๋ผ๋ ๋ณ์์๋ { id:1111 } ์ด๋ฐ์์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๋ค์ด์๋ค.
function Detail(){
const x = useParams()
return <h1>Detail</h1>
}
export default Detail;
useParams๋ฅผ ์ฌ์ฉํ๋ฉด react router๋ ๋ฐ๋ก ์ด ๋ณ์์ ๊ฐ์ ๋๊ฒจ์ค๋ค.
https://yts.mx/api/v2/movie_details.json?movie_id=
https://yts.mx/api/v2/movie_details.json?movie_id
yts.mx
await๋ async ํจ์ ๋ด๋ถ์ ์์ง ์์ผ๋ฉด ์ฌ์ฉํ ์ ์๋ค.
ํจ์๋ก ๋ง๋ค์ด ํธ์ถํ๋ค.
import { useEffect } from "react";
import { useParams } from "react-router-dom";
function Detail() {
const { id } = useParams();
const getMovie = async () => {
const json = await (
await fetch(`https://yts.mx/api/v2/movie_details.json?movie_id=${id}`)
).json();
console.log(json);
};
useEffect(() => {
getMovie();
}, []);
return <h1>Detail</h1>;
}
export default Detail;
์ด์ ์ํ ์ ๋ชฉ์ ํด๋ฆญํ๋ฉด ์ด๋ ๊ฒ id๊ฐ ์๋ ํ์ด์ง๋ก ๊ฐ์์๋ค.
'WEB > Front-End๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Typescript] predictable Typescript (0) | 2021.12.12 |
---|---|
[Typescript] ๋ธ๋ก์ฒด์ธ ๋ฏธ๋ํ๋ก์ ํธ (0) | 2021.12.10 |
error:03000086:digital envelope routines::initialization error' (0) | 2021.12.04 |
[React JS] Props type (0) | 2021.12.04 |
[React JS] Props (0) | 2021.12.04 |