[TIL] react-router-dom

ํ˜ฑยท2023๋…„ 11์›” 13์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
33/85
post-thumbnail

๐Ÿ‘‰ ๋ผ์šฐํŒ…์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํŒจํ‚ค์ง€
https://reactrouter.com/en/6.18.0

installation

yarn add react-router-dom 
npm install react-router-dom

configuration

Static Routing (์ •์  ๋ผ์šฐํŒ…)

// shared/router.js
import React from "react";
import { BrowserRouter, Route, Routes } from "react-router-dom";
import Home from "../pages/Home";
import About from "../pages/About";
import Contact from "../pages/Contact";
import Works from "../pages/Works";

const Router = () => {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="/contact" element={<Contact />} />
        <Route path="/works" element={<Works />} />
      </Routes>
    </BrowserRouter>
  );
};

export default Router;

route์—๋Š” react-router-dom์—์„œ ์ง€์›ํ•˜๋Š” props๋“ค์ด ์žˆ๋‹ค.
path์—๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด๋™ํ•˜๊ณ  ์‹ถ์€ ์ฃผ์†Œ๋ฅผ ๋„ฃ๋Š”๋‹ค.
element์—๋Š” ํ•ด๋‹น ์ฃผ์†Œ๋กœ ์ด๋™ํ–ˆ์„ ๋•Œ ๋ณด์—ฌ์ค„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋„ฃ๋Š”๋‹ค.

// App.jsx
import React from "react";
import Router from "./shared/Router";

function App() {
  return <Router />;
}

export default App;

๊ฐ€์žฅ ์ตœ์ƒ๋‹จ ์ปดํฌ๋„ŒํŠธ์ธ App.jsx์— Router๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

Dynamic Routing (๋™์  ๋ผ์šฐํŒ…)

๐Ÿ‘‰ path์— ์œ ๋™์ ์ธ ๊ฐ’์„ ๋„ฃ์–ด์„œ ํŠน์ • ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ

์˜ˆ๋ฅผ ๋“ค์–ด works ํŽ˜์ด์ง€์— ์—ฌ๋Ÿฌ๊ฐœ์˜ work๊ฐ€ ์žˆ๊ณ  work๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

// shared/router.js
const Router = () => {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="/contact" element={<Contact />} />
        <Route path="/works" element={<Works />} />
				{/* ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”. ๐Ÿ‘‡ */}
        <Route path="/works/:id" element={<Work />} />
      </Routes>
    </BrowserRouter>
  );
};

export default Router;

works/:id๋ผ๋Š” ๊ฒƒ์ด ๋™์ ์ธ ๊ฐ’ (id) ์„ ๋ฐ›๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
works/1 works/2 works/3 ๋ชจ๋‘ <Work /> ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  :id๋Š” useParams Hook์„ ํ†ตํ•ด ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ด ๋œ๋‹ค. (ํ›„์ˆ )

<Link>

๐Ÿ‘‰ <Link> ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ํƒญํ•˜์—ฌ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์š”์†Œ์ด๋‹ค. HTML์—์„œ <a> ํƒœ๊ทธ์™€ ์œ ์‚ฌํ•˜๋‹ค.

JSX ์—์„œ <a>ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ <Link>๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
์™œ๋ƒํ•˜๋ฉด <a> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜๋ฉด์„œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ƒˆ๋กœ๊ณ ์นจ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ƒˆ๋กœ๊ณ ์นจ ๋˜๋ฉด ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋˜์–ด์•ผ ํ•˜๊ณ , ์šฐ๋ฆฌ๊ฐ€ redux๋‚˜ useState๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ์ƒ์— ๊ตฌ์ถ•ํ•ด๋†“์€ ๋ชจ๋“  ์ƒํƒœ๊ฐ’์ด ์ดˆ๊ธฐํ™” ๋œ๋‹ค. ์ด๋Š” ๋ถˆํ•„์š”ํ•œ ์›€์ง์ž„์ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์„ฑ๋Šฅ์— ์•…์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

function Works() {
  return (
    <div>
      <Link to={"/contact"}>contact๋กœ ์ด๋™</Link>
      <h3>ํ• ์ผ ๋ชฉ๋ก</h3>
      {data.map((item) => (
        <li key={item.id}>
          <Link to={`/works/${item.id}`}>
            {item.id} : {item.todo}
          </Link>
        </li>
      ))}
    </div>
  );
}

export default Works;

useNavigate

๐Ÿ‘‰ useNavigate Hook์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ navigate ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
๐Ÿ‘‰ ์–ด๋–ค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

// src/pages/home.js
import { useNavigate } from "react-router-dom";

const Home = () => {
  const navigate = useNavigate();

  return (
    <button
      onClick={() => {
        navigate("/works");
      }}
    >
      works๋กœ ์ด๋™
    </button>
  );
};

export default Home;

useLocation

๐Ÿ‘‰ useLocation Hook์€ ํ˜„์žฌ ์œ„์น˜ ์ •๋ณด์— ๋Œ€ํ•œ object๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด Hook์€ ํ˜„์žฌ ์œ„์น˜๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค side effect๋ฅผ ๋‹ค๋ฃจ๋ ค๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๋‹ค.
(ํŽ˜์ด์ง€ ์•ˆ์—์„œ์˜ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง ๋“ฑ)

// src/pages/works.js
import { useLocation } from "react-router-dom";

function Works() {
  const location = useLocation();
  console.log(location); // ์ฝ˜์†”์— ์ฐ์–ด๋ณด์ž
  return (
    <div></div>
  );
}

export default Works;

useParams

๐Ÿ‘‰ useParams hook์€ <Route path>์— ์˜ํ•ด ์ผ์น˜๋œ ํ˜„์žฌ URL์—์„œ ๋™์  ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํ‚ค/๊ฐ’ ์Œ์˜ object๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
๐Ÿ‘‰ useParams๋Š” path์— ์žˆ๋Š” ๋™์  ํŒŒ๋ผ๋ฏธํ„ฐ (ex. :id)์˜ ๊ฐ’์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Hook ์ด๋‹ค.

// src/pages/Work.js
import { useParams } from "react-router-dom";
import { data } from "../shared/data";

function Work() {
  const params = useParams();
  console.log(params); // ์ฝ˜์†”์— ์ฐ์–ด๋ณด์ž
  const { id } = useParams();
  const work = data.find((item) => item.id === parseInt(id));
  return (
    <div>
      {work.id} : {work.todo}
    </div>
  );
}

export default Work;

profile
๋Š๋ฆฌ๋”๋ผ๋„ ์กฐ๊ธˆ์”ฉ, ๊พธ์ค€ํžˆ

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