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> ) }