๐Ÿ’ป My Work/๐Ÿ”ฅ React

[React] useNavigate, useParams๋กœ ๋™์ ๋ผ์šฐํŒ…(Dynamic Routing) ํ•˜๊ธฐ (GET - URL์— ํŒŒ๋ผ๋ฏธํ„ฐ)

Jaeseo Kim 2022. 10. 10. 22:59

ํŽ˜์ด์ง€๋Š” ๋˜‘๊ฐ™์€๋ฐ, ์•ˆ์—์„œ ๋ Œ๋”๋˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋“ค ์žˆ์ฃ !

์˜ˆ๋ฅผ ๋“ค์–ด, ์œ ํŠœ๋ธŒ์˜ ๊ฐ ์˜์ƒ ์ƒ์„ธํŽ˜์ด์ง€๊ฐ€ ์žˆ๊ฒ ๋„ค์š”. ๐Ÿคฉ

 

์ด๋ ‡๊ฒŒ Routes์˜ ๊ฒฝ๋กœ(URL)์— ํŠน์ • ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์–ด์„œ ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฑฐ์ฃ .

 

์ œ๊ฐ€ ๊ตฌํ˜„ํ•œ ๋ฐฉ๋ฒ•์„ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ์„  ์ˆœ์„œ๋Š” ์ด๋ ‡๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  1. url์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋ Œ๋”๋  ํŽ˜์ด์ง€(A) ๊ตฌํ˜„
    1. (A)๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก <Route path = "์ฃผ์†Œ/:id" component={(A)} /> ์ถ”๊ฐ€
  2. ํŽ˜์ด์ง€(B)์—์„œ ๋ฐ์ดํ„ฐ์˜ id๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ useNavigate ์‚ฌ์šฉํ•˜์—ฌ (A)๋กœ ์ด๋™
  3. (A)์˜ ํ˜„์žฌ url์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฝ‘์•„์„œ ๋ฐ์ดํ„ฐ GET ์š”์ฒญ ๋ณด๋‚ด๊ธฐ

 

 

00. ๋ Œ๋”ํ•  ํŽ˜์ด์ง€ ๊ตฌํ˜„


A.js

import * as React from "react";

export default function A() {
  return (
    <div>
      <h1>(A) ํŽ˜์ด์ง€</h1>
    </div>
  );
}

 

Router.js

import { BrowserRouter, Routes, Route } from "react-router-dom";
import A from "./A";

const AppRouter = () => {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="a/:id" element={<A />} />
      </Routes>
    </BrowserRouter>
  );
};

export default AppRouter;

๊ฐ„๋‹จํ•˜๊ฒŒ ์šฐ์„ ! a ์—์„œ ๋ Œ๋”๋˜๋„๋ก ํ–ˆ๊ณ , id์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๊ฐ€ ๋ Œ๋” ๋˜๋„๋ก url์„ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

: ๋Š” ๋’ค์— ๋ณ€์ˆ˜๊ฐ€ ์˜ฌ ๊ฒƒ์ด๋‹ค! ๋ผ๊ณ  ํ‘œ๊ธฐํ•˜๋Š” ๊ฒ๋‹ˆ๋‹ค.
: ๋’ค์—” ์ž„์˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ €๋Š” id๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค ๐Ÿคฉ๐Ÿคฉ

 

 

01. ๋ฐ์ดํ„ฐ์˜ id๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ useNavigate ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€ ์ด๋™


import * as React from "react";
import { useNavigate } from "react-router-dom";

export default function B() {
  /** ํŽ˜์ด์ง€ ์ด๋™ hook */
  const navigate = useNavigate();

  /** ํ€ด์ฆˆ ํŽ˜์ด์ง€๋กœ */
  function handlePage() {
    navigate(`/a/${id}`);
  }
  
  return (
    <div>
      <h1>(B) ํŽ˜์ด์ง€</h1>
      <button onClick={handlePage}>A๋กœ ๊ฐ€๊ธฐ</button>
    </div>
  );
}

 

โœจโœจโœจ handlePage์— ์žˆ๋Š” navigate ์† url์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค!!โœจโœจโœจ

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ, ๋งค๊ฐœ๋ณ€์ˆ˜ url ์„ค์ •์€ ์ž์‹ ์ด ๋ณด๋‚ด๋ ค๋Š” ์ฃผ์†Œ์— ๋งž๊ฒŒ ์ž˜ ์„ค์ •ํ•ด์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค!

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜๋Š” id๊ฐ€ 1์ธ A ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค.

 

1. ํ˜„์žฌ ํŽ˜์ด์ง€๋ฅผ ์ƒ์œ„๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณด๋‚ด url ๋ Œ๋”(ํ˜„์žฌ B ํŽ˜์ด์ง€์—์„œ ๋ Œ๋” -> /b/a/1)

2. ํ˜„์žฌ ํŽ˜์ด์ง€์™€ ์ƒ๊ด€์—†์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณด๋‚ด ๋ Œ๋”ํ•  ํŽ˜์ด์ง€url ๋ Œ๋”(ํ˜„์žฌ B ํŽ˜์ด์ง€ ์ƒ๊ด€ x -> /a/1)

 

02. ํ˜„์žฌ url์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฝ‘์•„๋‚ด๊ธฐ


์˜ˆ๋ฅผ ๋“ค์–ด, ๋งค๊ฐœ๋ณ€์ˆ˜ 1์„ ๊ฐ€์ง€๊ณ  A ํŽ˜์ด์ง€๋กœ ์™”๋‹ค๊ณ  ํ•ฉ์‹œ๋‹ค!

๊ทธ๋ ‡๋‹ค๋ฉด, ํ˜„์žฌ ํŽ˜์ด์ง€์˜ url์€ /a/1 ์ด๋„ค์š”!

1์€ ์•„๊นŒ Route์—์„œ ์„ค์ •ํ•œ <Route path="a/:id" element={<A />} />์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ž๋ฆฌ์— ์ž˜ ๋“ค์–ด์žˆ๋„ค์š”!

 

 import { useParams } from "react-router-dom";
 
 const { id } = useParams();
useParams๋Š” ํ˜„์žฌ URL์— ํฌํ•จ๋˜์–ด์žˆ๋Š” Key, Value ํ˜•์‹์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด, ์œ„์™€ ๊ฐ™์ด ํ•ด์„œ url์— ์žˆ๋Š” 1์„ ๋ฝ‘์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!!

{ id }๋Š” Route์—์„œ ์„ค์ •ํ•œ ์ž„์˜์˜ ๋ณ€์ˆ˜ ์ด๋ฆ„์ด์ฃ ! โ˜บ๏ธโ˜บ๏ธ

 

 

03.  ๋งค๊ฐœ๋ณ€์ˆ˜ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ GET ์š”์ฒญ ๋ณด๋‚ด๊ธฐ


import * as React from "react";
import { useParams } from "react-router-dom";

export default function A() {
  const { id } = useParams();

  /** API */
  async function loadData() {
    /** get param */
    let params = {
      id: id
    };

    await APIํ•จ์ˆ˜๋ช…(params).then((res) => {
      console.log(res);
    });
  }

  return (
    <div>
      <h1>(A) ํŽ˜์ด์ง€</h1>
    </div>
  );
}

์ด๋ ‡๊ฒŒ ํ•ด์„œ, get ์š”์ฒญ APIํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ณด๋‚ด์ค์‹œ๋‹ค.

 

import axios from "axios";

/** get API */
async function APIํ•จ์ˆ˜๋ช…(params = {}) {
  let data;
  try {
    await axios
      .get(`API์š”์ฒญ์ฃผ์†Œ/${params.id}`)
      .then((response) => {
        // console.log(response);
        data = response.data;
      });
    return data;
  } catch (error) {
   ...
  }
}

export default APIํ•จ์ˆ˜๋ช…;

API ์š”์ฒญ์„ ๋ณด๋‚ผ ์ฃผ์†Œ์— ๋ณ€์ˆ˜๋ฅผ ์‚ฝ์ž…ํ•ด์ค๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ,, ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜ ๋ฐ›์œผ์‹ค ์ˆ˜ ์žˆ์œผ๋ฆฌ๋ผ,, ๋ฏฟ์Šต๋‹ˆ๋‹ค!

 

ํ™”์ดํŒ… ๐ŸŒž๐ŸŒž