728x90
๋ฐ์ํ
๐ก ์ค์ต ํฌ์ธํธ!
- ์ค๋์ URL ํ๋ผ๋ฏธํฐ๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ์ด ๋ ์์ธ ํ์ด์ง๊ฐ ๋์ฌ ์ ์๊ฒ ๋ง๋ค์ด๋ณด์๋ค.
๐ Detail Component ์ ๋ฐ์ดํฐ๋ฐ์ธ๋ฉํ๊ธฐ
// ์ ์ฒด ์ฝ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ ์ฒด ์ฝ๋๊ฐ ๊ธธ์ด์ ๋ถํ์ํ ๋ถ๋ถ์ ์ ์ธํ๋ค.
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 shoes={shoes}/> // ์์
</Route>
</div>
);
}
- Detail Component ์ ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ์ ํด์ฃผ๋ ค๋ฉด ๋ถ๋ชจ Component ์ธ App Component ์์ Detail Component ๋ก shoes ๋ผ๋ state ๋ฅผ ์ ์ก๋ฐ์์์ผ ํ๋ค.
- ๋ฐ๋ผ์, shoes ๋ผ๋ ๋ณ์๋ก shoes ๋ผ๋ state ๋ฅผ Detail Component ์ props ๋ก ์ ์กํด์ฃผ์๋ค.
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">{props.shoes[0].title}</h4>
<p>{props.shoes[0].content}</p>
<p>{props.shoes[0].price}</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 Component ์์๋ props ๋ฅผ ๊ฐ์ง๊ณ , shoes ๋ผ๋ ๋ณ์์ ๋ด๊ธด shoes ๋ผ๋ state ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋์๋ค.
- shoes ๊ฐ ๋ด๊ธด useState() ํจ์๋ฅผ Detail Component ๊ฐ ์๋๋ผ App Component ์ ๋ง๋ ๊ฒ์ ๋ฐ์ดํฐ๋ ํญ์ ์์์ ์๋๋ก ํ๋ฌ์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
- ์๋ฅผ ๋ค์ด ์์ ์ปดํฌ๋ํธ ํ์ ํ์ ์ปดํฌ๋ํธ๊ฐ 2๊ฐ๊ฐ ์๋ค๊ณ ๊ฐ์ ์ ํด๋ณด์.
- ํ์ ์ปดํฌ๋ํธ2 ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ํ์ ์ปดํฌ๋ํธ1 ์์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๋ฉด, ํ์ ์ปดํฌ๋ํธ2 ์์ ์์ ์ปดํฌ๋ํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํด์ ๋ค์ ํ์ ์ปดํฌ๋ํธ1 ๋ก ์ ์กํด์ผํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์๊ธด๋ค.
- ๋ฐ๋ผ์, ์ค์ ๋ฐ์ดํฐ๋ ํด๋น ๋ฐ์ดํฐ๊ฐ ํ์ํ ์ต์์ ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ง๊ณ ์๊ณ ํ์ ์ปดํฌ๋ํธ๋ props ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ์ฌ์ฉํด์ผ ํ๋ค.
๐ ์์ธ ํ์ด์ง 3๊ฐ ๋ง๋ค์ด๋ณด๊ธฐ
- ์์ธ ํ์ด์ง๋ฅผ ๋ง๋ค ๋๋ URL ์ฃผ์๋ฅผ ์ด๋ค ์์ผ๋ก ๋ง๋ค์ง๋ถํฐ ์๊ฐํ๋ ๊ฒ ์ข๋ค.
- ๋๋ ์ผ๋ฐ์ ์ผ๋ก ๋ธ๋ก๊ทธ, ์ผํ๋ชฐ์์ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ๋ง๋ค์ด๋ณด์๋ค.
- /detail/0 ์ผ๋ก ์ ์ํ๋ฉด 0๋ฒ์งธ ์ํ์ ์์ธ ํ์ด์ง ๋ณด์ฌ์ฃผ๊ธฐ
- /detail/1 ์ผ๋ก ์ ์ํ๋ฉด 1๋ฒ์งธ ์ํ์ ์์ธ ํ์ด์ง ๋ณด์ฌ์ฃผ๊ธฐ
- /detail/2 ์ผ๋ก ์ ์ํ๋ฉด 2๋ฒ์งธ ์ํ์ ์์ธ ํ์ด์ง ๋ณด์ฌ์ฃผ๊ธฐ
function App(){
return (
<div>
<Route path="/detail/0">
<Detail shoes={shoes}/>
</Route>
<Route path="/detail/1">
<Detail shoes={shoes}/>
</Route>
<Route path="/detail/2">
<Detail shoes={shoes}/>
</Route>
</div>
)
}
- ํ์ง๋ง ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋นํจ์จ์ ์ด๋ฉฐ ํ์ฅ์ฑ์ด ๋จ์ด์ง๋ค.
- ๋ฐ๋ผ์, URL ์ ๋ง๋ค ๋์๋ URL ํ๋ผ๋ฏธํฐ ๋ฌธ๋ฒ์ ์ด์ฉํด ์ถ์ฝ์ ์์ผ์ฃผ๋ ๊ฒ ์ข๋ค.
function App(){
return (
<div>
<Route path='/detail/:id'>
<Detail shoes={shoes} />
</Route>
</div>
)
}
- ํ๋ผ๋ฏธํฐ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด ์์ ๊ฐ์ด ๊น๋ํ๊ฒ ์ฝ๋๋ฅผ ์ถ์ฝํ ์ ์๋ค.
- ํ๋ผ๋ฏธํฐ ๋ฌธ๋ฒ์ ์ฝ๋ก ๊ธฐํธ( : )์ ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ ์กฐํฉํ์ฌ ์ฌ์ฉํ๋ฉด ๋๋ค.
- ๋์ ๊ฒฝ์ฐ :id ๋ก ๋ง๋ค์๋๋ฐ, ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ /detail/ ๋ค์ ์ด๋ค ๋ฌธ์๊ฐ ์ ๋ ฅ๋์ด๋ Detail Component ๋ฅผ ๋ณด์ฌ๋ฌ๋ผ๋ ์๋ฏธ๊ฐ ๋๋ค.
- ํ์ง๋ง ๊ถ๊ทน์ ์ผ๋ก ๋ด๊ฐ ์ํ๋ ๊ฒ์ /detail/ ๋ค์ ๋ถ๋ 0, 1, 2 ๋ผ๋ ์ซ์์ ๋ฐ๋ผ ํด๋นํ๋ ์ํ์ ์์ธ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด๋ค.
import React, { useState } from "react";
import { useHistory, useParams } from 'react-router-dom';
function Detail(props) {
let history = useHistory();
let { id } = useParams();
return (
<div className="container">
<div className="row">
<div className="col-md-7">
<img src={`https://codingapple1.github.io/shop/shoes${props.shoes[id].id + 1}.jpg`} width="100%" />
</div>
<div className="col-md-5 mt-4">
<h4 className="pt-5">{props.shoes[id].title}</h4>
<p>{props.shoes[id].content}</p>
<p>{props.shoes[id].price}</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;
- ์ฆ, URL ์์์ :id ์๋ฆฌ์ ์ ๋ ฅํ ์ซ์๋ฅผ ์ธ๋ฑ์ค๊ฐ ๋ค์ด์๋ ์๋ฆฌ์ ๋ค์ด๊ฐ๊ธธ ์ํ๋ค.
- ์ด๋ฅผ ์ํด Router ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ฉ๋ฒ์ ์ฐพ์๋ณด๋ฉด useParams() ๋ผ๋ hook ์ ์ฌ์ฉํ๋ฉด ๋๋ค๊ณ ํ๋ค.
(React Router Library - useParams() ๋ณด๋ฌ๊ฐ๋ ค๋ฉด ํด๋ฆญ!!) - useParams() ์ฌ์ฉ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
- useParams ๋ฅผ import ํด์ค๋ค.
- import ํ useParams ๋ฅผ ๋ณ์์ ์ ์ฅํ๋ค.
let { id } = useParams();
- useParams() ํจ์์๋ URL ์ ์ ํ ๋ชจ๋ ํ๋ผ๋ฏธํฐ๋ฅผ {ํ๋ผ๋ฏธํฐ1, ํ๋ผ๋ฏธํฐ2} ์ ๊ฐ์ ํํ๋ก ์ ์ฅํด์ค๋ค.
- ๊ทธ๋ฆฌ๊ณ ๊ตฌ์กฐ ๋ถํด ํ ๋น ๋ฌธ๋ฒ์ ์ด์ฉํ๋ฉด ๋ฐ๋ก๋ฐ๋ก ๋ณ์๋ก ๋นผ์ ์ ์ฅ์ด ๊ฐ๋ฅํ๋ค.
- ๋ด๊ฐ URL ์ /detail/0 ๊ณผ ๊ฐ์ด ์์ฑํ๋ค๋ฉด useParams() ํจ์๋ { 0 } ์ผ๋ก ์ ์ฅ๋์ด ์์ ๊ฑฐ๊ณ , ๊ตฌ์กฐ ๋ถํด ํ ๋น ๋ฌธ๋ฒ์ ํตํด id ์ 0 ์ด๋ผ๋ ๊ฐ์ด ์ ์ฅ๋๋ ๊ฒ์ด๋ค.
๐ ์์๋ฃ์ ๋ณ๊ฒฝ์ ์ํฅ๋ฐ์ง ์๋ ์์ธ ํ์ด์ง ๋ง๋ค๊ธฐ
import React, { useState } from "react";
import { useHistory, useParams } from 'react-router-dom';
function Detail(props) {
let history = useHistory();
let { id } = useParams();
let findId = props.shoes.find(function(item) {
return item.id == id;
});
return (
<div className="container">
<div className="row">
<div className="col-md-7">
<img src={`https://codingapple1.github.io/shop/shoes${parseInt(findId.id)+1}.jpg`} width="100%" />
</div>
<div className="col-md-5 mt-4">
<h4 className="pt-5">{findId.title}</h4>
<p>{findId.content}</p>
<p>{findId.price}</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;
- ๊ธฐ์กด์๋ shoes ๋ผ๋ state ์์ ์ ์ฅ๋ ์๋ฃ๋ค์ ์ธ๋ฑ์ค์ id ํ๋ผ๋ฏธํฐ๋ฅผ ์ผ์น์์ผฐ๊ธฐ ๋๋ฌธ์, shoes ๋ผ๋ state ์์ ์ ์ฅ๋ ์๋ฃ๋ค์ ์์๊ฐ ๋ณ๊ฒฝ๋์ด ์ธ๋ฑ์ค๊ฐ ๋ฐ๋์ด๋ฒ๋ฆฌ๋ฉด id ํ๋ผ๋ฏธํฐ๋ ์ํฅ์ ๋ฐ๋๋ค.
- ๋ฐ๋ผ์ ์ด๋ฐ ์ํฅ์ ๋ฐ์ง ์๋ ์์ธ ํ์ด์ง๋ฅผ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด JavaScript ๋ฌธ๋ฒ์ ํ์ฉํด์ผ ํ๋ค.
- find() ๋ผ๋ ES6 ์ ๋ฌธ๋ฒ์ ์ด์ฉํ๋ฉด array ์์์ ์ํ๋ ์๋ฃ๋ฅผ ์ฐพ๊ธฐ ์ฝ๋ค.
let findId = props.shoes.find(function(item) {
return item.id == id;
});
- props.shoes ๋ array ์๋ฃํ์ด๋ฏ๋ก ์ด ๋ค์ find() ํจ์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- ๊ทธ๋ฆฌ๊ณ find() ํจ์ ์์๋ ์ฝ๋ฐฑํจ์๋ก ์กฐ๊ฑด์ ์์ฑํด์ฃผ๋ฉด ๋๋ค.
- ์์๋ก ์์ฑํ item ์ด๋ผ๋ ํ๋ผ๋ฏธํฐ๋ props.shoes ์ ์ ์ฅ๋ array ์๋ฃํ์ ์๋ฃ ํ๋ํ๋๋ฅผ ์๋ฏธํ๋ค.
- return ์กฐ๊ฑด์ ๊ณผ ๊ฐ์ ํํ๋ก ์์ฑํด์ฃผ๋ฉด ํด๋น ์กฐ๊ฑด์์ ๋ํด ์ฐธ์ธ ๋ฐ์ดํฐ๋ง ๋ฐํํด์ฃผ๋๋ฐ, ์ด๋ฅผ ์๋ก์ด ๋ณ์์ ์ ์ฅํ์ฌ ํ์ํ ๊ณณ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
- ์ฐธ๊ณ ๋ก ๋ด๊ฐ ์์ฑํ ์กฐ๊ฑด์์ props.shoes ์ ์ ์ฅ๋์ด ์๋ ์๋ฃ ํ๋ํ๋์ id ์ URL ์์ ๋ฐ์์จ id ๋ผ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๋น๊ตํ์ฌ ๊ฐ์ ๊ฒ๋ง ์ฐพ์๋ฌ๋ผ๋ ์๋ฏธ์ด๋ค.
- ์ฐพ์ ๋ฐ์ดํฐ๋ object ํ์ ์ผ๋ก findId ๋ณ์์ ์ ์ฅ๋๋ฏ๋ก ํด๋น ๋ฐ์ดํฐ์ id, title, content, price ์ ๊ฐ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์ค๋ ค๋ฉด findId.id, findId.title, findId.content, findId.price ์ ๊ฐ์ ํํ๋ก ๊ฐ์ง๊ณ ์ค๋ฉด ๋๋ค.
728x90
๋ฐ์ํ
'[๊ฐ๋ฐ] Practice > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] CSS ๋์ SASS ์ฌ์ฉํด๋ณด๊ธฐ (0) | 2022.03.25 |
---|---|
[React] styled-components ๋ก CSS ์คํ์ผ๋งํ๊ธฐ (0) | 2022.03.25 |
[React] React Router 2 : Link, Switch, history ๊ธฐ๋ฅ ์์๋ณด๊ธฐ (0) | 2022.03.24 |
[React] React Router : ์ ํ ํ ๊ธฐ๋ณธ ๋ผ์ฐํ ํด๋ณด๊ธฐ (0) | 2022.03.24 |
[React] ์ํ๋ชฉ๋ก Component ๋ก ๋ง๋ค์ด ๋ฐ๋ณต๋ฌธ ๋๋ฆฌ๊ธฐ (0) | 2022.03.23 |