๐Ÿ“–[React]๋ผ์šฐํ„ฐ ๊ตฌํ˜„,react-router-dom

ํ˜ฑยท2022๋…„ 10์›” 15์ผ

React

๋ชฉ๋ก ๋ณด๊ธฐ
21/28

โœ”๏ธ router ์‹œ์ž‘

  1. npm install react-router-dom 5.2.0 ์„ ์ด์šฉํ•˜์—ฌ router ์„ค์น˜
  2. App.js์—์„œ import {BrowserRouter, Route, Switch} from 'react-router-dom';
  3. App.js์—์„œ return์ดํ›„ ์ „์ฒด๋ฅผ <BrowserRouter> ๋กœ ๊ฐ์‹ธ๊ธฐ
  4. App.js์—์„œ url์— ์˜ํ•ด ๊ฐ๊ฐ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋ฅผ ๋ณด์ด๋Š” ๋ถ€๋ถ„๋งŒ <Switch>๋กœ ๊ฐ์‹ธ์ฃผ๊ธฐ
    <Switch> ์™ธ๋ถ€๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€ ๊ณตํ†ต์œผ๋กœ ๋…ธ์ถœ
  5. <Router path='/'> ๋ฉ”์ธํŽ˜์ด์ง€ ์ฝ”๋“œ</Router>
  6. <Router path='/url'> ๋ฐ”๋€Œ๋Š” ํŽ˜์ด์ง€ ์ฝ”๋“œ</Router>
    <Switch> ๋กœ <Router> ๋“ค์„ ๊ฐ์‹ธ๋ฉด ์ผ์น˜ํ•˜๋Š” ์ฒซ๋ฒˆ์งธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์คŒ.
    ์ฆ‰, /url์—๋„ /๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์ธํŽ˜์ด์ง€ ์ฝ”๋“œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ!
    ๋”ฐ๋ผ์„œ ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” <Router exact path='/'> : ์ •ํ™•ํ•˜๊ฒŒ /์ผ๋•Œ๋งŒ ๋ณด์—ฌ์คŒ

โœ”๏ธ router ์—ฐ๊ฒฐ

  1. <html>์€ <a> ์‚ฌ์šฉ ๊ทธ๋Ÿฌ๋‚˜ <Router>๋Š” <Link to="/url">์‚ฌ์šฉ
  2. url๋กœ ํŽ˜์ด์ง€ ๋ Œ๋”๋ง์„ ํ•˜๊ณ  ์‹ถ์€ ๋ถ€๋ถ„์— <Link to="/url"></Link>๋กœ ๋ฌถ์Œ
  3. ํ•ด๋‹น ํŒŒ์ผ ์œ„์— import {Link} from 'react-router-dom';
  4. ๋‹ค์–‘ํ•œ url์—์„œ๋Š” <Router path='/url'>๋ฅผ :์„ ์ด์šฉํ•˜์—ฌ ๋ฐ”๊พธ์–ด์คŒ
  5. <Router path='/url/:day'>
    day1๋กœ ๋“ค์–ด์™”์„ ๋•Œ day๋ผ๋Š” ๋ณ€์ˆ˜๋กœ 1์ด๋ผ๋Š” ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์Œ
    ๋งŒ์•ฝ id๋ฉด id์˜ ๋ณ€์ˆ˜๋กœ 1์˜ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ!

โœ”๏ธ useParams

Url ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ์กฐํšŒ

โœ”๏ธ ์˜ˆ์‹œ

App.js

import "./App.css";
import DayList from "./component/DayList";
import Header from "./component/Header";
import Day from "./component/Day";
import { BrowserRouter, Route, Switch } from "react-router-dom";
import EmptyPage from "./component/EmptyPage";>
function App() {
  return (
    <BrowserRouter>
      <div className="App">
        <Header />
        <Switch>
          <Route exact path="/">
            <DayList />
          </Route>
          <Route path="/day">
            <Day />
          </Route>
          <Route>
            <EmptyPage />
          </Route>
        </Switch>
      </div>
    </BrowserRouter>
  );
}

export default App;

Header.js

import { Link } from "react-router-dom";

export default function Header() {
  return (
    <div className="header">
      <h1>
        <Link to="/">ํ† ์ต ์˜๋‹จ์–ด(๊ณ ๊ธ‰)</Link>
      </h1>
      <div className="menu">
        <a href="#x" className="link">
          ๋‹จ์–ด ์ถ”๊ฐ€
        </a>
        <a href="#x" className="link">
          Day ์ถ”๊ฐ€
        </a>
      </div>
    </div>
  );
}

Day.js

import dummy from "../db/data.json";
import { useParams } from "react-router-dom";
export default function Day() {
  //dummy.words ์‚ฌ์šฉ
  const wordList = dummy.words.filter((word) => word.day === Number(day));
  const day = useParams().day;
  // const {day} = useParams();

  console.log(wordList);
  return (
    <>
      <h2>Day {day} </h2>
      <table>
        <tbody>
          {wordList.map((word) => (
            <tr key={word.id}>
              <td>{word.eng}</td>
              <td>{word.kor}</td>
            </tr>
          ))}
        </tbody>
      </table>
    </>
  );
}

DayList.js

import dummy from "../db/data.json";
import { Link } from "react-router-dom";

export default function DayList() {
  console.log(dummy);
  return (
    <ul>
      <li className="list_day">
        {dummy.days.map((day) => (
          <li key={day.id}>
            <Link to={`/day/${day.day}`}>Day {day.day}</Link>
          </li>
        ))}
      </li>
    </ul>
  );
}

EmptyPage.js

import { Link } from "react-router-dom";

export default function EmptyPage() {
  return (
    <>
      <h2>์ž˜๋ชป๋œ ์ ‘๊ทผ์ž…๋‹ˆ๋‹ค.</h2>
      <Link to="/">๋Œ์•„๊ฐ€๊ธฐ</Link>
    </>
  );
}

์•Œ์•„๋‘˜ ๊ฒƒ

ํ˜„์žฌ router๋Š” v.6์œผ๋กœ, <Switch>๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
๋Œ€์‹  ์ด๋•Œ๋Š” <Routes> ๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.

App.js

import './App.css';
import Day from './component/Day';
import DayList from './component/DayList';
import Header from './component/Header';
import { BrowserRouter, Route , Routes } from 'react-router-dom';
import EmptyPage from './component/EmptyPage';

function App() {
  return ( 
      <div className='App'>
      <BrowserRouter>
        <Header />
        <Routes>
          <Route path="/" element={<DayList/>} />
          <Route path="/day/:day" element={<Day/>} />
          <Route path="*" element={<EmptyPage/>} />
        </Routes>
        </BrowserRouter>
      </div>
  );
}

๋น„๊ณ ...

์ฝ”๋”ฉ์•™๋งˆ๋‹˜์˜ ์ฝ”๋“œ๋ฅผ ์ •๋ง ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ณต๋ถ™ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋˜‘๊ฐ™์ด ๋”ฐ๋ผํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ, router๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์•˜๊ณ  (url์€ ๋ฐ”๋€Œ์—ˆ์ง€๋งŒ ํ™”๋ฉด์ด ์ถœ๋ ฅ๋˜์ง€ ์•Š์Œ) ์ฝ”๋”ฉ์•™๋งˆ๋‹˜์˜ code๋ฅผ cloneํ•œ ๋’ค ๋‚ด ๊ฒƒ๊ณผ ๋น„๊ตํ•˜๊ธฐ๋„ ํ•˜๊ณ  ์ƒˆ๋กœ์šด vs code ์ฐฝ์—์„œ ์ƒˆ๋กœ์šด ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ์ •๋ง ๋˜‘๊ฐ™์ด ํ•œ ๋’ค ๋น„๊ตํ•ด๋ณด๊ธฐ๋„ ํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ ๊ณ„์† ํ•ด์„œ ๋œจ๋Š” ๊ฒƒ์€ node_module์—์„œ index.js ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ์˜ค๋ฅ˜๋‚˜ ํ™”๋ฉด์ด ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์—ˆ๋‹ค... ๊ฒฐ๊ตญ node_moudule์„ ์ฝ”๋”ฉ์•™๋งˆ๋‹˜ ๊ฒƒ๊ณผ ๋น„๊ตํ•ด๋ณด์•˜๊ณ  ์ง€๊ธˆ์€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” module ๋“ค์ด ์žˆ๊ณ  ๊ทธ๊ฒƒ๋“ค์ด router๊ณผ ๊ด€๋ จ๋˜์–ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๋А๋‚Œ์„ ๋ฐ›์•˜๋‹ค.
node์˜ ๊ณต์‹ ํŽ˜์ด์ง€์—๋„ soure-map-resolve ๋“ฑ์ด ์“ฐ์ด์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์—ˆ๋‹ค. ์ด๋ฏธ router๋„ ๋ฒ„์ „์ด ํ•œ ๋ฒˆ ์—…๋ฐ์ดํŠธ ๋˜์—ˆ๊ณ  ๊ทธ์— ๋งž์ถฐ node๋„ ๋ฐ”๋€ ๊ฒƒ์ธ์ง€ ์ „ํ˜€ router๊ฐ€ ๋“ค์ง€ ์•Š์•„ ์ง„์งœ ์„œ์น˜๋ž‘์„œ์น˜๋Š” ๋‹ค ํ•ด๋ณด๊ณ  ๊ฑฐ์˜ 3์‹œ๊ฐ„์„ ์ด ๋ฌธ์ œ๋งŒ ์žก๊ณ  ์žˆ์—ˆ๋‹ค... ๊ทธ๋Ÿฌ๋‚˜ ์•„๋ฌด๋ฆฌ ์ƒ๊ฐํ•ด๋„ ์—…๋ฐ์ดํŠธ๋œ node์™€ router์˜ ์ถฉ๋Œ์ด ์•„๋‹๊นŒ? ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ์ฝ”๋”ฉ์•™๋งˆ๋‹˜์˜ ๊ฐ•์˜๊ฐ€ ๋„ˆ๋ฌด ์ข‹์ง€๋งŒ ์ด๋Ÿฐ ๋ถ€๋ถ„์—์„œ๋Š” ๊ฝค ์•„์‰ฝ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๊ณ  ์ผ๋‹จ clone๋œ ์ฝ”๋“œ๋กœ ๊ณ„์†ํ•ด์„œ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ์ด์–ด๋‚˜๊ฐ€๊ณ  ์–ด์ฐจํ”ผ ์งง์€ ๊ฐ•์˜๋‹ˆ, ์ดํ›„ react๋ฅผ ์กฐ๊ธˆ ๋” ๊ณต๋ถ€(์ฝ”๋”ฉ์• ํ”Œ ๋ฐ ์ฑ…)ํ•œ ๋’ค์— v6์„ ์ด์šฉํ•ด์„œ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ œ๋Œ€๋กœ ๊ณ ์ณ๋‚˜๊ฐˆ ๊ณ„ํš์ด๋‹ค... ํ™”์ดํŒ…์ด๋‹ค ์—ํ˜€

profile
new blog: https://hae0-02ni.tistory.com/

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