[shop-project] Router

kirin.logยท2021๋…„ 4์›” 27์ผ
0
post-custom-banner

๐ŸŒˆ Router

  • Routing = ํŽ˜์ด์ง€ ๋‚˜๋ˆ„๊ธฐ
  • SPA๋กœ ๊ตฌ์„ฑ๋œ web-app์„ ๋งŒ๋“ค ๋•Œ ํ•„์ˆ˜์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ.

SPA(Single Page Application)

  • ์‹ฑ๊ธ€ ํŽ˜์ด์ง€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ํŽ˜์ด์ง€๊ฐ€ 1๊ฐœ์ธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ผ๋Š” ๋œป.

  • ์—ฌ๋Ÿฌ ํ™”๋ฉด์œผ๋กœ ๊ตฌ์„ฑ๋œ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค๋ฉด, react-router๋Š” ํ•„์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

๐ŸŽ router ์„ค์น˜ ๋ฐฉ๋ฒ•

1. npm install react-router-dom ํ„ฐ๋ฏธ๋„์— ์„ค์น˜

2. index.jsํŒŒ์ผ์— ์…‹ํŒ…

2-1. import { BrowserRouter } from 'react-router-dom' import ํ•ด์ฃผ๊ธฐ
2-2. <App.js>๋ฅผ <BrowserRouter>๋กœ ๊ฐ์‹ธ์ค€๋‹ค
โžก <BrowserRouter> <App /> </BrowserRouter>

โ— <BrowserRouter> ๋Œ€์‹  <HashRouter>๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค (Routing์„ ๋”์šฑ ์•ˆ์ „ํ•˜๊ฒŒ #)

3. App.js ํŒŒ์ผ์— importํ•ด์ฃผ๊ธฐ

3-1. import { Link, Route, Switch } from 'react-router-dom' ์ƒ๋‹จ์— import ํ•ด์ฃผ๊ธฐ


  • Link โžก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ <a>ํƒœ๊ทธ์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ
  • Route โžก ๋ณด์—ฌ์ค„ ํŽ˜์ด์ง€๋ฅผ ๋‹ด๋Š” ๊ณต๊ฐ„ (ํŽ˜์ด์ง€๋งˆ๋‹ค ๊ฐ์‹ธ์ฃผ๊ธฐ)
  • Switch โžก Route๋ฅผ ์ „์ฒด ํ•œ ๋ฒˆ์— ๊ฐ์‹ผ๋‹ค(route๋งˆ๋‹ค ์Šค์œ„์น˜ ๋˜๋„๋ก ์„ค์ •)

๐ŸŽƒ <Route> โžก ๋ณด์—ฌ์ค„ ํŽ˜์ด์ง€์˜ ๊ฒฝ๊ณ„ ๊ฐ์‹ธ๊ธฐ

  • <Route exact path="/"> ๊ธฐ๋ณธ ํŽ˜์ด์ง€ ๋‚ด์šฉ </Route>
  • <Route path="/detail"> detail ํŽ˜์ด์ง€ ๋‚ด์šฉ </Route>
  • <Route path="/login"> login ํŽ˜์ด์ง€ ๋‚ด์šฉ </Route>

โ— ๋ชจ๋“  ํŽ˜์ด์ง€์— ์Šฌ๋ž˜์‹œ(/)๊ฐ€ ์ค‘๋ณต๋˜๋ฏ€๋กœ ๊ธฐ๋ณธ(๋ฉ”์ธ)ํŽ˜์ด์ง€์˜ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•  ๋•Œ, exact๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค
(=๊ฒฝ๋กœ๊ฐ€ ์Šฌ๋ž˜์‹œ์™€ ์ •ํ™•ํžˆ ์ผ์น˜ํ• ๋•Œ๋งŒ ๊ธฐ๋ณธํŽ˜์ด์ง€ ๋ณด์—ฌ์ฃผ๊ธฐ)

// App.js ํŒŒ์ผ
import React, { useState } from 'react';
import Data from './data.js'; 
import Detail from './component/Detail.js'; 

function App() {

  let [shoes, setShose] = useState(Data);

  return (
  // ๋ฉ”์ธ ํŽ˜์ด์ง€ ์ ‘์†ํ–ˆ์„ ๋•Œ ๋ณด์—ฌ์ค„ ๋‚ด์šฉ 
  <Router>
      <jumbotron ํƒœ๊ทธs>
      <Product ํƒœ๊ทธs>
  </Router>

  // detail ํŽ˜์ด์ง€ ์ ‘์†ํ–ˆ์„ ๋•Œ ๋ณด์—ฌ์ค„ ๋‚ด์šฉ 
  <Router>
      <Detail />  // ์ปดํฌ๋„ŒํŠธํ™” ํ•˜์—ฌ์„œ ํ•˜์œ„์ปดํฌ๋„ŒํŠธ 1์ค„๋กœ๋งŒ ๋„ฃ์„ ์ˆ˜๋„ ์žˆ๋‹ค
  </Router>
  )
}

๐ŸŒ <Route path="/:id"> </Route> : /๋ชจ๋“ ๋ฌธ์ž ๋ผ๋Š” ๊ฒฝ๋กœ๋ฅผ ์˜๋ฏธ


  • ๊ธฐ๋ณธ ๋ฌธ๋ฒ•: <Link to="๊ฒฝ๋กœ"> ๋ฒ„ํŠผ </Link>

<Link to="/detail"> ๋ฒ„ํŠผ </Link> โžก detail ํŽ˜์ด์ง€๋กœ ์ด๋™
<Link to="/login"> ๋ฒ„ํŠผ </Link> โžก login ํŽ˜์ด์ง€๋กœ ์ด๋™

๐Ÿป ๋’ค๋กœ๊ฐ€๊ธฐ ๊ธฐ๋Šฅ ๋ฒ„ํŠผ ๋งŒ๋“ค๊ธฐ

  • ๋ฒ„ํŠผ์— onClick์ด๋ฒคํŠธ ๊ธฐ๋Šฅ์„ ๋‹ฌ๊ณ , ๋’ค๋กœ ์ด๋™ํ•˜๋ ค๋Š” ๊ธฐ๋Šฅ์—๋Š” useHistory()ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•œ๋‹ค.
  • goBack() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐ”๋กœ ์ด์ „ ๋‹จ๊ณ„ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.
  <button onClick={ () => { history.goBack(); } }
  • push() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํŠน์ • ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜์—ฌ ํ•ด๋‹น ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.
  <button onClick={ () => { history.push('/'); } }  // ๋ฉ”์ธ ํŽ˜์ด์ง€๋กœ ๊ฒฝ๋กœ์ง€์ •

๐Ÿ’ก useHistory() ํ•จ์ˆ˜ ํ™œ์šฉ ๋ฐฉ๋ฒ•

  1. ์ƒ๋‹จ์— import ํ•ด์ฃผ๊ธฐ (router๋ฅผ importํ•  ๋•Œ ์ ์šฉํ•˜๋Š” ์ค‘๊ด„ํ˜ธ์— ์ถ”๊ฐ€)
    import { useHistory } from 'react-router-dom
  1. ๋ณ€์ˆ˜์— ์ €์žฅ ํ•ด์ฃผ๊ธฐ
    let history = useHistory();
  1. onClick ์ด๋ฒคํŠธ ๋‚ด์— history ๋„ฃ์–ด์ฃผ๊ธฐ (goBack() ํ•จ์ˆ˜ ๋˜๋Š” push() ํ•จ์ˆ˜์™€ ํ•จ๊ป˜์“ฐ๊ธฐ)
    <button onClick={ () => { history.goBack(); } }

โ— useHistory() ํ•จ์ˆ˜์˜ ๊ธฐ๋Šฅ์€, ๋ฐฉ๋ฌธ ๊ธฐ๋ก ๋“ฑ์„ ์ €์žฅํ•ด๋†“๋Š” object์ด๋‹ค.
react์˜ hook์˜ ์ผ์ข…
(useHistory๋ผ๋Š” ํ›… import / useHistory()ํ›… ์‚ฌ์šฉ / ์ด๋ฒคํŠธ์— ์‚ฌ์šฉํ•  ๋•Œ, ๋ชจ๋“  ๋ฐฉ๋ฌธ๊ธฐ๋ก์„ ๋‹ด๋Š” history ๋’ค์— ์–ด๋–ค ๊ฒฝ๋กœ๋กœ ๊ฐˆ์ง€ ํ•จ์ˆ˜๋กœ ๋ถ™์—ฌ์ค€๋‹ค(goBack() ๋˜๋Š” push())


๐ŸŽƒ <Switch> โžก ์—ฌ๋Ÿฌ๊ฐœ์˜ ํŽ˜์ด์ง€๊ฐ€ ๋งž์•„๋„ ํ•˜๋‚˜๋งŒ ๋ณด์—ฌ์ฃผ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ธฐ๋Šฅ

  • ๋ชจ๋“  router๋ฅผ ํ•˜๋‚˜๋กœ ๊ฐ์‹ธ์ค€๋‹ค. ํ•˜๋‚˜์˜ router๊ฐ€ ์ผœ์ง€๋ฉด ๋‚˜๋จธ์ง€๋Š” ๊บผ์ง€๋„๋ก ๋งŒ๋“œ๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.
    โ— router ์ค‘๋ณต ์ถœํ˜„ ๋ถˆ๊ฐ€
  • <Route path="/:id"> </Route> ๋Š” ์ง€์ • ์™ธ ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ๋ณด์—ฌ์ฃผ๋„๋ก ์ง€์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ, ์ง€์ •๋œ ๊ฒฝ๋กœ์™€ ๊ฒน์น  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ํƒœ๊ทธ๋ฅผ ๋งจ ๋งˆ์ง€๋ง‰์— ์œ„์น˜์‹œํ‚จ ํ›„ Switch๋กœ ๊ฐ์‹ธ์ฃผ๋ฉด ์œ„์˜ router๋“ค์ด ๋ชจ๋‘ ํ•ด๋‹น๋˜์ง€ ์•Š์„ ๋•Œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.
// App.js ํŒŒ์ผ
import React, { useState } from 'react';
import Detail from './component/Detail.js'; 

function App() {

  return (
    <Switch>
        <Router>
            <jumbotron ํƒœ๊ทธs>
            <Product ํƒœ๊ทธs>
        </Router>

        <Router>
            <Detail /> 
        </Router>

        <Router path="/:id">  
            <div />
        </Router>
    </Switch>
  )
}
profile
boma91@gmail.com
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€