728x90
๋ฐ์ํ
๐ก ์ค์ต ํฌ์ธํธ!
๐ ์์ธํ์ด์ง๋ฅผ ๋ด์ Detail Component ๋ง๋ค๊ธฐ
import React from "react";
function Detail() {
return (
<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>
)
}
export default Detail;
- ์ง๋ ์๊ฐ์๋ <Route></Route> ํ๊ทธ ์์ html ๋ด์ฉ ์ ์ฒด๋ฅผ ๋ฃ์ด์ฃผ์๋ค.
- ๊ทธ๋ฌ๋ ์ด๋ฒ์๋ Main Component ์ฒ๋ผ ๋ฐ๋ก Detail.js ํ์ผ์ ๋ง๋ ํ Detail ์ด๋ผ๋ ์ด๋ฆ์ Component ๋ฅผ ์์ฑํด์ export ํด์ฃผ์๋ค.
// ์ ์ฒด ์ฝ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ ์ฒด ์ฝ๋๊ฐ ๊ธธ์ด์ ๋ถํ์ํ ๋ถ๋ถ์ ์ ์ธํ๋ค.
import Main from './Main'
import Detail from './Detail';
function App() {
let [shoes, setShoes] = useState(Data);
return (
<div className="App">
{/* Main */}
<Route exact path='/'>
<Main shoes={shoes}/>
</Route>
{/* Detail */}
<Route path='/detail'>
<Detail />
</Route>
</div>
);
}
- App.js ์ Detail ํ์ผ์ Detail ์ด๋ผ๋ ๋ณ์๋ฅผ import ํด์ค๋ฉด ์ด์ App.js ์์ Detail Component ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
๐ ํ์ด์ง ์ด๋ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ
๐ค Link ํ๊ทธ๋ก ํ์ด์ง ์ด๋ ๋ฒํผ ๋ง๋ค๊ธฐ
// ๊ธฐ์กด Navbar
<Nav.Link href="#home">Home</Nav.Link>
<Nav.Link href="#link">Link</Nav.Link>
// Link ํ๊ทธ๋ก ํ์ด์ง ์ด๋ ๊ธฐ๋ฅ ์ถ๊ฐ
<Nav.Link><Link to='/'>Home</Link></Nav.Link>
<Nav.Link><Link to='/detail'>Detail</Link></Nav.Link>
- ์ด๋ฒ์๋ Link ํ๊ทธ๋ฅผ ์ด์ฉํด์ ์๋จ Navbar ์์ ์ํ๋ ํ์ด์ง๋ก ์ด๋ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋ณด์๋ค.
- ๋๋ Home ์ด๋ผ๋ ๋ฒํผ์ ๋๋ฅด๋ฉด / ๊ฒฝ๋ก๋ก, Detail ์ด๋ผ๋ ๋ฒํผ์ ๋๋ฅด๋ฉด /detail ๊ฒฝ๋ก๋ก ์ด๋์์ผ์ค ๊ฒ์ด ๋๋ฌธ์ ๊ฐ ๊ธ์๋ฅผ <Link></Link> ํ๊ทธ๋ก ๊ฐ์ธ์ค ํ to ๋ผ๋ ์์ฑ์ ์ด์ฉํด์ ๊ฒฝ๋ก๋ฅผ ์ ์ด์ฃผ์๋ค.
(์ฐธ๊ณ ๋ก Link ํ๊ทธ๋ 'react-router-dom' ์ ์ค์นํ ํ์ import ํด์ค๋ฉด ๋๋ค.)
๐ค ํ์ด์ง ์ด๋ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ (๋ค๋ก๊ฐ๊ธฐ)
- <Link></Link> ํ๊ทธ ์ธ์๋ ํ์ด์ง ์ด๋ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด์ง ์ด๋ ๊ธฐ๋ฅ์ ๋ง๋ค ์ ์๋ค.
import React, { useState } from "react";
import { useHistory } from 'react-router-dom';
function Detail(props) {
let history = useHistory();
return (
<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" onClick={()=>{history.goBack()}}>๋ค๋ก๊ฐ๊ธฐ</button>
</div>
</div>
</div>
)
}
export default Detail;
- ์ด๋ฒ์๋ Detail.js ํ์ผ์ '์ฃผ๋ฌธํ๊ธฐ' ๋ฒํผ๊ณผ ๋์ผํ ์คํ์ผ์ '๋ค๋ก๊ฐ๊ธฐ' ๋ฒํผ์ ์ถ๊ฐํด๋ณด์๋ค.
- ๋ค๋ก๊ฐ๊ธฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด useHistory() ํจ์๋ฅผ import ํด์จ ๋ค์ history ๋ผ๋ ๋ณ์์ ํ ๋นํด์ฃผ์๋ค.
(์ฐธ๊ณ ๋ก useHistory() ํจ์๋ ์ผ์ข ์ Hook ์ด๋ค. ํธํ๊ฒ useState ์ ๋น์ทํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.) - ์ด์ history ๋ผ๋ ์ด๋ฆ์ ๋ณ์์๋ ํ์ด์ง ์ด๋ ๋ด์ญ๊ณผ ์ ์ฉํ ํจ์๊ฐ ์ ์ฅ๋์ด ์๋ ํฐ object ์๋ฃ๊ฐ ํ ๋น๋ ๊ฒ์ด๋ค.
- history ์ ์ ์ฅ๋ ์ฌ๋ฌ ์๋ฃ๋ค ์ค ๊ฐ์ฅ ์ ์ฉํ๊ณ ๋ค๋ก๊ฐ๊ธฐ ๊ธฐ๋ฅ์ ํ์ํ ํจ์๋ goBack() ์ด๋ผ๋ ํจ์์ด๋ค.
- goBack() ํจ์๋ฅผ ์คํํ๊ฒ ๋๋ฉด ํ์ด์ง๊ฐ ๋ค๋ก ๊ฐ๋ค.
- ๋ฐ๋ผ์ '๋ค๋ก๊ฐ๊ธฐ' ๋ฒํผ์ onClick ์์ฑ์ผ๋ก {()=>{history.goBack()}} ์ด๋ผ๋ ์ฝ๋๋ฅผ ์์ฑํด์ฃผ์๋ค.
(์ด์ธ์ ๊ถ๊ธํ ๋ถ๋ถ์ด ์์ผ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ๋ฒ์ ๊ฒ์ํด๋ณด๋ฉด ๋๋ค.)
๐ค ํ์ด์ง ์ด๋ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ (์ปค์คํ ํ์ด์ง๋ก ์ด๋ํ๊ธฐ)
- ์ํ๋ ํ์ด์ง๋ก ํ์ด์ง ์ด๋ํ๋ ๊ธฐ๋ฅ์ ๋ง๋ค๊ณ ์ถ์ผ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ๋ฒ์ ์ฐธ๊ณ ํ์ฌ push() ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
- ๋ฒํผ์ผ๋ก ์ฌ์ฉํ ํ๊ทธ ์์ onClick ์์ฑ์ผ๋ก {()=> {history.push('/๊ฒฝ๋ก๋ช ')}} ๊ณผ ๊ฐ์ ํ์์ผ๋ก ๊ฒฝ๋ก๋ช ์ ์ํ๋ ๊ฒฝ๋ก๋ฅผ ๋ฃ์ด ์ฌ์ฉํ๋ฉด ํด๋น ๊ฒฝ๋ก๋ก ์ด๋ํ๊ฒ ๋๋ค.
๐ Switch Component ์์๋ณด๊ธฐ
- <Switch></Switch> ํ๊ทธ๋ ์ฃผ์์ฐฝ์ ๊ฒฝ๋ก๋ฅผ ์ ๋ ฅํ์ ๋, ๊ทธ ํ๊ทธ ์์ ์๋ <Route></Route> ํ๊ทธ๋ค ์ค ๋งค์น๋๋ <Route></Route> ๋ค์ ๋ชจ๋ ๋ณด์ฌ์ฃผ๋ ๊ฒ ์๋๋ผ ํ๋ฒ์ ๋ฑ ํ๋๋ง ๋ณด์ฌ์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค.
- ๋ฌด์จ ๋ง์ด๋๋ฉด <Route> ์ path ์ ์ ํ์๋ ๊ฒฝ๋ก๊ฐ ํฌํจ๊ด๊ณ๋ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก React Router ๋ ํฌํจํ๋ ๋ชจ๋ <Route></Route> ํ๊ทธ์ ๋ด์ฉ์ ๋ณด์ฌ์ฃผ๊ฒ ๋๋ค.
<Route path='/'>
<div>๋ฉ์ธ ํ์ด์ง</div>
</Route>
<Route path='/detail'>
<div>์์ธ ํ์ด์ง</div>
</Route>
- ์๋ฅผ ๋ค์ด ์์ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋ค๊ณ ํ๋ค๋ฉด ์๋์ ๊ฐ์ด /detail ๊ฒฝ๋ก๋ก ์ ์ํ์ ๋ '๋ฉ์ธ ํ์ด์ง', '์์ธ ํ์ด์ง' ๋ฌธ๊ตฌ๊ฐ ๋ชจ๋ ๋ณด์ธ๋ค.
- ๋ฐ๋ผ์ ์ด๋ฐ ์ํฉ์ ๋ฐฉ์งํ๊ณ ์ถ๋ค, ํ ๋ฒ์ ํ๋์ <Route></Route> ํ๊ทธ ๋ด์ฉ๋ง ๋ณด์ฌ์ฃผ๊ณ ์ถ๋ค ๊ทธ๋ด ๋ ๊ทธ ๋ฒ์ฃผ์ ๋ฃ์ <Route></Route> ํ๊ทธ๋ค์ <Switch></Switch> ํ๊ทธ ์์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
- ๋ค๋ง, <Switch></Switch> ํ๊ทธ๋ก ๊ฐ์ธ๋ฉด ๋งค์นญ๋ <Route></Route> ํ๊ทธ ์ค ๋งจ ์์ ํ๋๋ง ๋ณด์ฌ์ฃผ๋ฏ๋ก ์ฝ๋์ ์์ ์ด ํ์ํ๋ค.
- <Route></Route>ํ๊ทธ๋ค์ ์์๋ฅผ ์กฐ์ ํด์ฃผ๋ฉด exact ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ ์์ ๊ฐ์ด ์ํ๋ ํ์ด์ง ํ๋๋ง ๋์ค๋๋ก ํ ์ ์๋ค.
728x90
๋ฐ์ํ
'[๊ฐ๋ฐ] Practice > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] styled-components ๋ก CSS ์คํ์ผ๋งํ๊ธฐ (0) | 2022.03.25 |
---|---|
[React] React Router 3 : URL ํ๋ผ๋ฏธํฐ๋ก ์์ธ ํ์ด์ง 100๊ฐ ๋ง๋ค๊ธฐ (0) | 2022.03.24 |
[React] React Router : ์ ํ ํ ๊ธฐ๋ณธ ๋ผ์ฐํ ํด๋ณด๊ธฐ (0) | 2022.03.24 |
[React] ์ํ๋ชฉ๋ก Component ๋ก ๋ง๋ค์ด ๋ฐ๋ณต๋ฌธ ๋๋ฆฌ๊ธฐ (0) | 2022.03.23 |
[React] import/export ์ฌ์ฉํด๋ณด๊ธฐ (0) | 2022.03.23 |