๋ชฉ์ฐจ
์ด์ ๊ธ โผ
0. 2023.05.05 - [๐ | WEB DEV/React] - [React] 0. React๋ฅผ ์ฌ์ฉํ๋ ์ด์ & ์ด๊ธฐ ์ธํ
1. 2023.05.07 - [๐ | WEB DEV/React] - [React] 1. JSX
2. 2023.05.26 - [๐ | WEB DEV/React] - [React] 2. state (๋ณ์, array, object)
2-1. 2023.05.27 - [๐ | WEB DEV/React] - [React] 2-1. array state ์ ๋ ฌํ๊ธฐ ( .sort()ํ์ฉ)
3. 2023.05.28 - [๐ | WEB DEV/React] - [React] 3. ์ปดํฌ๋ํธ (Component)
4. 2023.05.28 - [๐ | WEB DEV/React] - [React] 4. ๋์ ์ธ UI ์ ์ํ๊ธฐ
5. 2023.05.28 - [๐ | WEB DEV/React] - [React] 5. ๋ฐ๋ณต๋๋ ๋ถ๋ถ ์ถ์ฝํ๊ธฐ (map)
6. 2023.05.29 - [๐ | WEB DEV/React] - [React] 6. props
8. 2023.07.06 - [๐ | WEB DEV/React] - [React] 8. ๋ค๋ฅธ ํ์ผ์์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
๋ผ์ฐํ ์ ํ ๋ ๋น์ทํ url์ ํ์ด์ง๋ค์ ๋ง๋ค์ด์ ๊ด๋ฆฌํด์ผํ ๋๊ฐ ์๋ค.
์๋ฅผ ๋ค์ด ์ปจํ ์ธ ์ ํ์ด์ง ํน์ ์ด ๋ธ๋ก๊ทธ์ ํฌ์คํธ url ๊ฐ์ ๊ฒ์ฒ๋ผ
์์ ๋ณํ๋ก ๋ผ์ฐํ ์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ ํ๋์ฉ ๋ง๋ค๊ธฐ๋ ๊ท์ฐฎ์ ์ ์๋ค.
ex) https://bluishhot-star.tistory.com/189(์ซ์ ๋ณํ๋ก ๊ตฌ๋ถ๋จ)
์ด๋ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค!
1. ์์ธํ์ด์ง ์ฌ๋ฌ๊ฐ ๋ง๋ค๊ธฐ ( :URL ํ๋ผ๋ฏธํฐ )
์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ์ :URLํ๋ผ๋ฏธํฐ(ํ์ด์ง๊ตฌ๋ถ๋ณ์) ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด๋ค.
์ฌ์ฉ๋ฒ
<Route path="/URL/:๊ตฌ๋ถ๋ณ์" element={ ... }/>
์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉํ๋ค.
/:~ ์ ๊ฐ์ ํ์์ผ๋ก path๋ฅผ ์๋ช ํ ๋ค
/๋ถ๋ชจURL/์์path ๋ฅผ ์ ๋ ฅํ๋ฉด ์์ ์ ์๋ element๋ฅผ ๋ฐํํ๋ ๊ฒ์ด๋ค.
์ด๋ ํ๋ผ๋ฏธํฐ๋ ์ฌ๋ฌ๊ฐ ์ง์ ํ ์ ์๋ค.
/URL/:ํ๋ผ๋ฏธํฐ1/:ํ๋ผ๋ฏธํฐ2/ ...
์์
<Route path="/detail/:idx" element={<Detail/>}></Route>
detail/0, detail/1, ... ๋ฑ์ผ๋ก url์ ๊ตฌ์ฑํ ์ ์๊ฒ ๋์๋ค.
ํ์ง๋ง ์ฌ๊ธฐ๊น์ง๋ง ์งํ์ ํ๋ค๋ฉด url์ ๋ค๋ฅด์ง๋ง element๊ฐ ๋ชจ๋ ๊ฐ์ ๊ฒ์ ๋ฐํํ ๊ฒ์ด๋ค.
์ด๋ฅผ ๊ตฌ๋ถํด๋ณด์!
2. path๋ณ ๊ตฌ๋ถํ๊ธฐ ( props ์ด์ฉํ๊ธฐ & useParams )
path๋ณ๋ก ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง์ด๋ค.
1) props ์ฌ์ฉํ๊ธฐ
element์ props๋ฅผ ํ์ฉํ์ฌ ์ปดํฌ๋ํธ์ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ๋ ์ด์ฉํ ์ ์๋ค.
์์
// App.js
...
{
data.map(function(a,i) {
const idx = i+1
return(
<Route path={"/detail/"+idx} element={<Detail data={data} i={i}/>}></Route>
)
})
}
...
//Detail.js
function Detail(props){
const imgIdx = props.i+1
return(
<div className="container">
<div className="row">
<div className="col-md-6">
<img src={"https://codingapple1.github.io/shop/shoes"+imgIdx+".jpg"} width="100%" />
</div>
<div className="col-md-6">
<div className="item-detail-container">
<h4 className='item-detail-title'>{props.data[props.i].title}</h4>
<p className='item-detail-price'>โฉ{props.data[props.i].price}</p>
<p className='item-detail-content'>{props.data[props.i].content}</p>
<button className="btn btn-danger">์ฃผ๋ฌธํ๊ธฐ</button>
</div>
</div>
</div>
</div>
)
}
export default Detail;
2) useParams()
useParams()๋ผ๋ ์๋ก์ด ํ ์ ์ฌ์ฉํด๋ณด์.
์ ์ ๊ฐ URL ํ๋ผ๋ฏธํฐ(/:~)์ ์ ๋ ฅํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ๋ ์ฌ์ฉํ๋ค.
(1) import
import { useParams } from 'react-router-dom'
import ์์น๋ URLํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํ ํ์ด์ง์ด๋ค.
(2) ์ฌ์ฉํ๊ธฐ
<Route>์ path์ ์ง์ ํ URL ํ๋ผ๋ฏธํฐ๋ฅผ ๊ทธ๋๋ก ์ด์ฉํ์ฌ์ผํ๋ค.
์์
//App.js
...
<Route path={"/detail/:idx"} element={<Detail data={data}/>}></Route>
...
<Route>์์ URLํ๋ผ๋ฏธํฐ๋ช ์ idx๋ก ์ง์ ํ์๋ค.
//Detail.js
import { useParams } from 'react-router-dom'
function Detail(props){
// ์ง์ ํ URLํ๋ผ๋ฏธํฐ๋ช
๊ทธ๋๋ก
let {idx} = useParams();
return(
// ... (๋ ๋๋งํ html)
)
}
export default Detail;
URLํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ path์ ์ ์ํ ๊ฒฝ์ฐ,
๋ฐํํ ํ์ด์ง์ useParams()๋ฅผ import ํ๋ค.
์ด๋ ์ง์ ํ๋ ํ๋ผ๋ฏธํฐ๋ช ์ผ๋ก ์๋ณํ์ฌ ๊ฐ์ ธ์ฌ ์ ์๋ค.
<Route>์ path ๋๋ก
idx๋ detail/ ๋ค์์ ๋ถ์ ๊ฐ์ ๊ฐ์ ธ์ค๊ฒ ๋๋ค.
์ถ๊ฐ Tip! โผ
[๋ ์ฝ๋๋ฅผ ์ํด์!]
๋ฐ์ดํฐ์ ์ ๊ทผ์ ํ ๋ DB์ ์ ์ฅ๋ ์์๋ก ์ ๊ทผํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง
id ๋ฑ์ ์๋ณ์๋ฅผ ์ด์ฉํด์ ์ ๊ทผํ ๋ค ๋ฐ์ธ๋ฉ์ ํ๊ฒ ๋๋ค๋ฉด
sorting์ ํ๋ ๋ฑ์ ์ถ๊ฐ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋์๋ ๊ฐํธํ๋ค.
data = [
{id:0, ...},
{id:1, ...},
...
]
์ด๋ ๊ฒ ๋ฐ์ดํฐ์ ์๋ณ์๋ฅผ ์ง์ ํด ๋์ ๋ค
//Detail.js
import { useParams } from 'react-router-dom'
function Detail(props){
let {idx} = useParams();
// data sorting ํด๋ ๋ฌธ์ ์๋๋ก ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ์ idx๋ฅผ ์์๊ฐ ์๋ id๋ก ์ผ์น์ํค๊ธฐ
//find : ์ฒซ๋ฒ์งธ ์์ ๋ฐํ / filter : ๋ง์กฑํ๋ ์์ array๋ก ๋ฐํ
let item = props.data.find((data)=> data.id == idx-1);
// let item = props.data.filter((data)=> data.id == idx-1)[0];
return(
// ... (๋ ๋๋งํ html)
)
}
export default Detail;
arrayํํ์ ๋ฐ์ดํฐ์ผ ๊ฒฝ์ฐ .find() ํน์ .filter() ๋ฑ์ ๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ ๋ฐ์ดํฐid์ URLํ๋ผ๋ฏธํฐ๋ฅผ ์ผ์น์์ผ ์ ๊ทผํ ์ ์๋ค!
๋๊ธ