728x90
๋ฐ์ํ
๐ก ์ค์ต ํฌ์ธํธ!
๐ ๋ฉ์ธ ํ์ด์ง( ๊ฒฝ๋ก : / )
๐ ์์ธ ํ์ด์ง ( ๊ฒฝ๋ก : /detail )
๐ React Router ์ ํ ํ ๊ธฐ๋ณธ ๋ผ์ฐํ ํด๋ณด๊ธฐ
- ์ฌ๋ฌ๊ฐ์ง ํ์ด์ง๋ฅผ ๋ง๋ค๊ณ ์ถ์ ๋์๋ Router ๋ฅผ ์ด์ฉํ๋ฉด ๋๋๋ฐ, ์ด๋ react-router-dom ์ด๋ผ๋ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์น๋ฅผ ํตํด ์ด์ฉ์ด ๊ฐ๋ฅํ๋ค.
๐ค React Router ์ค์น ๋ฐ ์ ํ
// npm ์ด์ฉํ๋ ๋ฐฉ๋ฒ
npm install react-router-dom@5.2.0
// yarn ์ด์ฉํ๋ ๋ฐฉ๋ฒ
yarn add react-router-dom@5.2.0
- ํฐ๋ฏธ๋์ ์ ๋ ์ฝ๋ ์ค ํ๋๋ฅผ ์ ๋ ฅํด์ ์ค์นํ๋ฉด ๋๋ค.
- yarn ์ผ๋ก ์์ํ๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ฏธ๋ฆฌ yarn ์ด ์ค์น๋์ด ์์ด์ผ ํ๋ค.
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { BrowserRouter } from 'react-router-dom'; // ์ถ๊ฐ
ReactDOM.render(
<React.StrictMode>
<BrowserRouter> // ์ถ๊ฐ
<App />
</BrowserRouter> // ์ถ๊ฐ
</React.StrictMode>,
document.getElementById('root')
);
reportWebVitals();
- ์ค์น๊ฐ ์๋ฃ๋๋ฉด index.js ํ์ผ์ ๊ธฐ์กด ์ฝ๋์ ์์ ๊ฐ์ด ๋ช ๊ฐ์ง ์ฝ๋๋ฅผ ์ถ๊ฐํด์ค๋ค.
๐ HashRouter
- ์ ํ ํ ๋ BrowserRouter ๋ง๊ณ HashRouter ํ๊ทธ๋ฅผ ์ด์ฉํ ์๋ ์๋ค.
- Browser ๋ผ๋ ๋จ์ด ๋์ Hash ๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- BrowserRouter ์ HashRouter ์ ์ฐจ์ด์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- HashRouter ๋ฅผ ์ฌ์ฉํ์ ๋์๋ ์ฌ์ดํธ์ ์ ์ ์ URL ๋งจ ๋์ /#/ ์ด ๋ถ์ ์ฑ๋ก ์์ํ๋ค.
- BrowserRouter ๋ฅผ ์ฌ์ฉํ์ ๋์๋ ์ฌ์ดํธ์ ์ ์ ์ URL ์ด ๊น๋ํ๋ค.
- ๊ทธ๋ผ์๋ HashRouter ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋ธ๋ผ์ฐ์ ์ฃผ์์ฐฝ์ ์ด๋ค ํ์ด์ง๋ฅผ ์ ๋ ฅํ๋ ํ์๋ ์๋ฒ์ ํด๋น ํ์ด์ง๋ฅผ ๋ณด์ฌ๋ฌ๋ผ๋ ์์ฒญ์ด๋ค.
- ํ์ฌ ๋ด๊ฐ ๋ง๋๋ ํ๋ก์ ํธ๋ ์์ฒญํ ์๋ฒ๊ฐ ์๊ณ ๋ฆฌ์กํธ๊ฐ ๋ผ์ฐํ ์ ๋ด๋นํ๋ฏ๋ก, ์๋ชปํด์ ์์ง๋ ์์ ํ์ด์ง๋ฅผ ์๋ฒ์ ์์ฒญํ๋ฉด ์๋ฌ๊ฐ ๋ฐ ์ ์๋ค.
- ๋ธ๋ผ์ฐ์ ์ฃผ์์ฐฝ์์ # ๋ค์ ๋ถ์ ๋ด์ฉ์ ์ ๋ ์๋ฒ๋ก ์์ฒญ๋์ง ์์ผ๋ฏ๋ก, ์ค์๋ก ์๋ฒ์ ์์ฒญํ์ง ์์ผ๋ ค๋ฉด ์์ ํ๊ฒ # ์ ๋ถ์ฌ์ฃผ๋ ๊ฒ ์ข์ผ๋ฉฐ ๊ทธ ์ญํ ์ HashRouter ๊ฐ ํด์ฃผ๋ ๊ฒ์ด๋ค.
- ๊ทธ๋ ๋ค๊ณ ํด์ ๊ผญ HashRouter ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒ์ ์๋๊ณ , BrowserRouter ๋ฅผ ์ฌ์ฉํ ๋ ํน์ ๊ฒฝ๋ก์์ ๋ค์ด์ค๋ ์์ฒญ์ ๋ฆฌ์กํธ์์ ์ฒ๋ฆฌํ ์ ์๋๋ก API ๋ฅผ ๋ง๋ค์ด๋์ผ๋ฉด ๋๋ค. ์ฆ, ์๋ฒ์์ ์ ํ ๋ง ์ํด์ฃผ๋ฉด ๋๋ค.
๐ค ๋ผ์ฐํ ์ผ๋ก ํ์ด์ง ๋๋๊ธฐ
- / ๊ฒฝ๋ก๋ก ์ ์ํ๋ฉด ๋ฉ์ธ ํ์ด์ง๋ก, /detail ๊ฒฝ๋ก๋ก ์ ์ํ๋ฉด ์์ธ ํ์ด์ง๋ก ์ ์์ด ๋๋๋ก ํด๋ณด์.
import { Link, Route, Switch } from 'react-router-dom';
- ๋ผ์ฐํ ์ ํด์ฃผ๊ธฐ ์ ์ ๋จผ์ App.js ํ์ผ์ ์์ ๊ฐ์ด ์ฌ๋ฌ๊ฐ์ง ํ๊ทธ๋ค์ import ํด์ฃผ์ด์ผ ํ๋ค.
import { Link, Route, Switch } from 'react-router-dom';
function App(){
return (
<div>
<Route exact path="/">
<div>๋ฉ์ธ ํ์ด์ง</div>
</Route>
<Route path="/detail">
<div>์์ธ ํ์ด์ง</div>
</Route>
</div>
)
}
- ๋ค์์ผ๋ก ๋ผ์ฐํ ์ ํ๊ธฐ ์ํด ์ํ๋ ๊ณณ์ <Route></Route> ํ๊ทธ๋ฅผ ์์ฑํ๊ณ <Route> ์์ path ์ path ๋ฐฉ๋ฌธ์ ๋ณด์ฌ์ค HTML ์ ์ ์ด์ฃผ๋ฉด ๋๋ค.
- ์ด ๋ "๋ฉ์ธ ํ์ด์ง" ๋ฌธ๊ตฌ๋ฅผ ๋ณด์ฌ์ค <Route> ์์ path ์๋ exact ๋ฅผ ๋ถ์ฌ์ ์ ํํ๊ฒ / ๊ฒฝ๋ก๋ก ์ ์ํด์ผ์ง๋ง ๋ฉ์ธ ํ์ด์ง๊ฐ ๋ณด์ด๊ฒ ํด์ฃผ์๋ค.
(exact ๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด /detail ์ด๋ผ๋ ๊ฒฝ๋ก์ / ๋ผ๋ ๋ฌธ์๊ฐ ํฌํจ๋์ด ์์ผ๋ฏ๋ก "๋ฉ์ธ ํ์ด์ง" ๋ผ๋ ๋ฌธ๊ตฌ์ "์์ธ ํ์ด์ง" ๋ผ๋ ๋ฌธ๊ตฌ๋ฅผ ๋ชจ๋ ๋ณด์ฌ์ฃผ๊ฒ ๋๋ฉฐ, React Router ๋ ์๋ ์ด๋ ๊ฒ ๋์ํ๋ค.) - ์ด์ ๋ธ๋ผ์ฐ์ ์ฃผ์์ฐฝ์์ / ๊ฒฝ๋ก๋ก ์ ์ํ๋ฉด "๋ฉ์ธ ํ์ด์ง", /detail ๊ฒฝ๋ก๋ก ์ ์ํ๋ฉด "์์ธ ํ์ด์ง" ๋ผ๋ ๋ฌธ๊ตฌ๋ฅผ ๋ณผ ์ ์๋ค.
<Route path="/grid" component={ Grid } ></Route>
- ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํด์ /grid ๋ผ๋ ๊ฒฝ๋ก๋ก ์ ์ํ์ ๋ ๋ง๋ค์ด๋์ Grid Component ๋ฅผ ๋ณด์ฌ์ค ์๋ ์๋ค.
<Route path="/grid"> <Grid/> </Route>
- ๋ฌผ๋ก component ์์ฑ ์์ด <Route></Route> ํ๊ทธ ์ฌ์ด์ Grid Component ๋ฅผ ์ถ๊ฐํด์ฃผ์ด๋ ๋๋ค.
๐ React Router ์ ํน์ง
- ๊ฐ ํ์ด์ง๋ง๋ค ๋ค๋ฅธ HTML ํ์ผ์ ๋ณด์ฌ์ฃผ๋ ๊ฒ ์๋๋ผ HTML ํ์ผ ๋ด๋ถ์ ๋ด์ฉ์ ๋ฐ๊พธ์ด ๋ค๋ฅธ ํ์ด์ง๋ฅผ ๋ณด๋ ๊ฒ์ฒ๋ผ ํ๋ด๋ด๋ ๊ฒ์ด๋ค.
๐ค ๋ฉ์ธ ํ์ด์ง์ ์์ธ ํ์ด์ง Route ์ ๋ด์ฉ ์ฑ์ฐ๊ธฐ
- ๋ฉ์ธ ํ์ด์ง๋ Router ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ๊ณผ ๋์ผํ๊ฒ ์์ ๊ฐ์ ํ๋ฉด์ด ๋์ฌ ์ ์๊ฒ ํด์ฃผ์๋ค.
import React, {useState} from 'react';
function Main(props) {
return (
<>
{/* Main */}
<div className="main-visual">
<h2>Welcome to visit SHOES.COM!</h2>
<hr/>
<h1>20% Season Off</h1>
<button>SHOP THIS DEAL</button>
</div>
{/* Grid */}
<div className="container">
<div className="row">
{
props.shoes.map((item, idx)=>{
return (
<Grid shoes={props.shoes[idx]} key={idx} />
)
})
}
</div>
</div>
</>
)
}
function Grid(props) {
return (
<div className="col-md-4 grid">
<img src={`https://codingapple1.github.io/shop/shoes${props.shoes.id + 1}.jpg`} />
<h5>{props.shoes.title}</h5>
<p>{props.shoes.content} & {props.shoes.price}</p>
</div>
)
}
export default Main;
- ํ๋ฉด์์ผ๋ก๋ ๋์ผํ์ง๋ง ํ์ด์ง๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ ๋ชฉ์ ์ด์์ผ๋ฏ๋ก <Route></Route> ๋ฅผ ์ด์ฉํด์ผํ๋ค.
- <Route></Route> ์์ ๊ธฐ์กด์ ์์ฑํด๋ ๋ฉ์ธ ํ์ด์ง์ ๋ด์ฉ์ ๋ฃ์ผ๋ ค๋ ๋๋ฌด ๋ง์์ Navbar ๋ฅผ ์ ์ธํ๊ณ ๋ฉ์ธ ํ์ด์ง์ ํ์ํ ๋ด์ฉ๋ง ๋ด์ Main.js ํ์ผ์ ์์ฑํด์ฃผ์๋ค.
- Main.js ํ์ผ์์ Main ์ด๋ผ๋ Component ๋ฅผ ๋ง๋ ํ Main ์ด๋ผ๋ ๋ณ์๋ช ์ผ๋ก export ํด์ฃผ์๋ค.
// ์ ์ฒด ์ฝ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ ์ฒด ์ฝ๋๊ฐ ๊ธธ์ด์ ๋ถํ์ํ ๋ถ๋ถ์ ์ ์ธํ๋ค.
import Main from './Main'
function App() {
let [shoes, setShoes] = useState(Data);
return (
<div className="App">
{/* Main */}
<Route exact path='/'>
<Main shoes={shoes}/>
</Route>
</div>
);
}
- ์ด์ App.js ์์ Main.js ํ์ผ์์ Main ์ด๋ผ๋ Component ๋ฅผ import ํด์ฃผ์๋ค.
- ๊ทธ๋ค์ <Route></Route> ํ๊ทธ ์ฌ์ด์ Main Component ๋ฅผ ๋ฃ์ด์ฃผ์๋ค.
- ์ด ๋, Main Component ์์ shoes ๋ผ๋ state ๋ฅผ ๋ฐ์ ์ฌ์ฉํ ์ ์๋๋ก shoes ๋ผ๋ ๋ณ์๋ช
์ผ๋ก shoes ๋ผ๋ state ๋ฅผ ์ ์กํด์ฃผ์๋ค.
(Main.js ์์๋ Main Component ์ props ๋ผ๋ ํ๋ผ๋ฏธํฐ๋ก shoes ๋ฅผ ๋ฐ์์ค๋ฉด ๋๋ค.)
<div className="container">
<div className="row">
<div className="col-md-7">
<img src="https://codingapple1.github.io/shop/shoes1.jpg" width="100%" />
</div>
<div className="col-md-5 mt-4">
<h4 className="pt-5">White and Black</h4>
<p>Born in France</p>
<p>120000</p>
<button className="btn btn-danger mx-1">์ฃผ๋ฌธํ๊ธฐ</button>
<button className="btn btn-danger mx-1">๋ค๋ก๊ฐ๊ธฐ</button>
</div>
</div>
</div>
- ์์ธ ํ์ด์ง๋ ๋์ค์ ๋ถ๋ฆฌํ ์์ ์ด๋ผ ์ ์ฝ๋๋ฅผ <Route></Route> ์์ ๋ฐ๋ก ์์ฑํด์ฃผ์๋ค.
728x90
๋ฐ์ํ
'[๊ฐ๋ฐ] Practice > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] React Router 3 : URL ํ๋ผ๋ฏธํฐ๋ก ์์ธ ํ์ด์ง 100๊ฐ ๋ง๋ค๊ธฐ (0) | 2022.03.24 |
---|---|
[React] React Router 2 : Link, Switch, history ๊ธฐ๋ฅ ์์๋ณด๊ธฐ (0) | 2022.03.24 |
[React] ์ํ๋ชฉ๋ก Component ๋ก ๋ง๋ค์ด ๋ฐ๋ณต๋ฌธ ๋๋ฆฌ๊ธฐ (0) | 2022.03.23 |
[React] import/export ์ฌ์ฉํด๋ณด๊ธฐ (0) | 2022.03.23 |
[React] ์ผํ๋ชฐ ๋ ์ด์์ ๋์์ธํ๊ธฐ (1) | 2022.03.23 |