๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒŒ | WEB DEV/React

[React] 11. ๋ผ์šฐํŒ…-3 ์–‘์‚ฐํ˜• ๋ผ์šฐํŒ…

by KASSID 2023. 10. 3.

๋ชฉ์ฐจ

    728x90

    ์ด์ „ ๊ธ€ โ–ผ

    ๋”๋ณด๊ธฐ

    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

    7. 2023.07.03 - [๐ŸŒŒ | WEB DEV/React] - [React] 7. ์ด๋ฏธ์ง€ ์‚ฝ์ž…ํ•˜๊ธฐ(css, html, publicํด๋”์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ)

    8. 2023.07.06 - [๐ŸŒŒ | WEB DEV/React] - [React] 8. ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

    9. 2023.07.09 - [๐ŸŒŒ | WEB DEV/React] - [React] 9. ๋ผ์šฐํŒ…-1 (react-router-dom์„ธํŒ…, Routes, Route, Link)

    10. 2023.07.10 - [๐ŸŒŒ | WEB DEV/React] - [React] ๋ผ์šฐํŒ…-2 (useNavigate, 404page, Nested Routes, Outlet)

     

    ๋ผ์šฐํŒ…์„ ํ•  ๋•Œ ๋น„์Šทํ•œ 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ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ผ์น˜์‹œ์ผœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค!

     

     

    ๋Œ“๊ธ€