Routing
= ํ์ด์ง ๋๋๊ธฐSPA(Single Page Application)
์ฑ๊ธ ํ์ด์ง ์ดํ๋ฆฌ์ผ์ด์ ์ด๋ค. ๋ง ๊ทธ๋๋ก ํ์ด์ง๊ฐ 1๊ฐ์ธ ์ดํ๋ฆฌ์ผ์ด์ ์ด๋ผ๋ ๋ป.
์ฌ๋ฌ ํ๋ฉด์ผ๋ก ๊ตฌ์ฑ๋ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ฒ ๋๋ค๋ฉด, react-router๋ ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
๐ router ์ค์น ๋ฐฉ๋ฒ
1.
npm install react-router-dom
ํฐ๋ฏธ๋์ ์ค์น2. index.jsํ์ผ์ ์ ํ
2-1.
import { BrowserRouter } from 'react-router-dom'
import ํด์ฃผ๊ธฐ
2-2.<App.js>
๋ฅผ<BrowserRouter>
๋ก ๊ฐ์ธ์ค๋ค
โก<BrowserRouter> <App /> </BrowserRouter>
โ
<BrowserRouter>
๋์<HashRouter>
๋ก ๋์ฒดํ ์ ์๋ค (Routing์ ๋์ฑ ์์ ํ๊ฒ #)3. App.js ํ์ผ์ importํด์ฃผ๊ธฐ
3-1.
import { Link, Route, Switch } from 'react-router-dom'
์๋จ์ import ํด์ฃผ๊ธฐ
import { Link, Route, Switch } from 'react-router-dom'
Link
โก ์๋ฐ์คํฌ๋ฆฝํธ์ <a>
ํ๊ทธ์ ๋์ผํ ๊ธฐ๋ฅRoute
โก ๋ณด์ฌ์ค ํ์ด์ง๋ฅผ ๋ด๋ ๊ณต๊ฐ (ํ์ด์ง๋ง๋ค ๊ฐ์ธ์ฃผ๊ธฐ)Switch
โก Route๋ฅผ ์ ์ฒด ํ ๋ฒ์ ๊ฐ์ผ๋ค(route๋ง๋ค ์ค์์น ๋๋๋ก ์ค์ )<Route>
โก ๋ณด์ฌ์ค ํ์ด์ง์ ๊ฒฝ๊ณ ๊ฐ์ธ๊ธฐ<Route exact path="/">
๊ธฐ๋ณธ ํ์ด์ง ๋ด์ฉ </Route>
<Route path="/detail">
detail ํ์ด์ง ๋ด์ฉ </Route>
<Route path="/login">
login ํ์ด์ง ๋ด์ฉ </Route>
โ ๋ชจ๋ ํ์ด์ง์ ์ฌ๋์(/)๊ฐ ์ค๋ณต๋๋ฏ๋ก ๊ธฐ๋ณธ(๋ฉ์ธ)ํ์ด์ง์ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ ๋, exact
๋ฅผ ์ถ๊ฐํด์ค๋ค
(=๊ฒฝ๋ก๊ฐ ์ฌ๋์์ ์ ํํ ์ผ์นํ ๋๋ง ๊ธฐ๋ณธํ์ด์ง ๋ณด์ฌ์ฃผ๊ธฐ)
// App.js ํ์ผ import React, { useState } from 'react'; import Data from './data.js'; import Detail from './component/Detail.js'; function App() { let [shoes, setShose] = useState(Data); return ( // ๋ฉ์ธ ํ์ด์ง ์ ์ํ์ ๋ ๋ณด์ฌ์ค ๋ด์ฉ <Router> <jumbotron ํ๊ทธs> <Product ํ๊ทธs> </Router> // detail ํ์ด์ง ์ ์ํ์ ๋ ๋ณด์ฌ์ค ๋ด์ฉ <Router> <Detail /> // ์ปดํฌ๋ํธํ ํ์ฌ์ ํ์์ปดํฌ๋ํธ 1์ค๋ก๋ง ๋ฃ์ ์๋ ์๋ค </Router> ) }
๐ <Route path="/:id"> </Route>
: /๋ชจ๋ ๋ฌธ์ ๋ผ๋ ๊ฒฝ๋ก๋ฅผ ์๋ฏธ
<Link>
โก ํ์ด์ง ์ด๋ ๊ธฐ๋ฅ
- ๊ธฐ๋ณธ ๋ฌธ๋ฒ:
<Link to="๊ฒฝ๋ก">
๋ฒํผ</Link>
<Link to="/detail">
๋ฒํผ</Link>
โก detail ํ์ด์ง๋ก ์ด๋
<Link to="/login">
๋ฒํผ</Link>
โก login ํ์ด์ง๋ก ์ด๋
useHistory()
ํจ์๋ฅผ ํ์ฉํ๋ค.goBack()
ํจ์๋ฅผ ํตํด ๋ฐ๋ก ์ด์ ๋จ๊ณ ํ์ด์ง๋ก ์ด๋ํ ์ ์๋ค. <button onClick={ () => { history.goBack(); } }
push()
ํจ์๋ฅผ ํตํด ํน์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ์ฌ ํด๋น ๊ฒฝ๋ก๋ก ์ด๋ํ ์ ์๋ค. <button onClick={ () => { history.push('/'); } } // ๋ฉ์ธ ํ์ด์ง๋ก ๊ฒฝ๋ก์ง์
๐ก useHistory() ํจ์ ํ์ฉ ๋ฐฉ๋ฒ
- ์๋จ์ import ํด์ฃผ๊ธฐ (router๋ฅผ importํ ๋ ์ ์ฉํ๋ ์ค๊ดํธ์ ์ถ๊ฐ)
import { useHistory } from 'react-router-dom
- ๋ณ์์ ์ ์ฅ ํด์ฃผ๊ธฐ
let history = useHistory();
- onClick ์ด๋ฒคํธ ๋ด์ history ๋ฃ์ด์ฃผ๊ธฐ (goBack() ํจ์ ๋๋ push() ํจ์์ ํจ๊ป์ฐ๊ธฐ)
<button onClick={ () => { history.goBack(); } }
โ useHistory() ํจ์์ ๊ธฐ๋ฅ์, ๋ฐฉ๋ฌธ ๊ธฐ๋ก ๋ฑ์ ์ ์ฅํด๋๋ object์ด๋ค.
react์ hook์ ์ผ์ข
(useHistory๋ผ๋ ํ import / useHistory()ํ ์ฌ์ฉ / ์ด๋ฒคํธ์ ์ฌ์ฉํ ๋, ๋ชจ๋ ๋ฐฉ๋ฌธ๊ธฐ๋ก์ ๋ด๋ history ๋ค์ ์ด๋ค ๊ฒฝ๋ก๋ก ๊ฐ์ง ํจ์๋ก ๋ถ์ฌ์ค๋ค(goBack() ๋๋ push())
<Switch>
โก ์ฌ๋ฌ๊ฐ์ ํ์ด์ง๊ฐ ๋ง์๋ ํ๋๋ง ๋ณด์ฌ์ฃผ๊ฒ ๋ง๋๋ ๊ธฐ๋ฅ<Route path="/:id"> </Route>
๋ ์ง์ ์ธ ๊ฒฝ๋ก๋ฅผ ์
๋ ฅํ์ ๋ ๋ณด์ฌ์ฃผ๋๋ก ์ง์ ํ๋ ๊ธฐ๋ฅ์ด๋ค. ์ด๋ด ๊ฒฝ์ฐ, ์ง์ ๋ ๊ฒฝ๋ก์ ๊ฒน์น ์ ์๋ค. ๋ฐ๋ผ์ ์ ํ๊ทธ๋ฅผ ๋งจ ๋ง์ง๋ง์ ์์น์ํจ ํ Switch
๋ก ๊ฐ์ธ์ฃผ๋ฉด ์์ router๋ค์ด ๋ชจ๋ ํด๋น๋์ง ์์ ๋ ์คํ๋ ์ ์๋ค.// App.js ํ์ผ import React, { useState } from 'react'; import Detail from './component/Detail.js'; function App() { return ( <Switch> <Router> <jumbotron ํ๊ทธs> <Product ํ๊ทธs> </Router> <Router> <Detail /> </Router> <Router path="/:id"> <div /> </Router> </Switch> ) }