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

[React] useNavigate Hook์œผ๋กœ ํŽ˜์ด์ง€ ์ด๋™ํ•˜๊ธฐ(Hook ์ง์ ‘ ๋งŒ๋“ค๊ธฐ)

Jaeseo Kim 2022. 10. 12. 22:47

A์—์„œ B, C / B์—์„œ A, C / C์—์„œ A, B ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„

React Hook๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ๊ฐ’ ์ ‘๊ทผ๊ณผ ์ž์‹ ์š”์†Œ์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

๋ฆฌ์•กํŠธ๋Š” useState, useEffect ๊ฐ™์€ ๋‚ด์žฅ Hook์„ ์ œ๊ณตํ•ด์ฃผ๋Š”๋ฐ, ์ด ์ค‘ useNavigate๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•ด๋ณผ๊ฒŒ์š”~!

 

์ €๋Š” Hook์„ ์ง์ ‘ ๋งŒ๋“ค๊ฑด๋ฐ, ํ•œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ useNavigate()๋ฅผ ์„ ์–ธํ•˜์—ฌ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

=> ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ์ด์œ ๋Š” ๋งจ ๋ฐ‘์—์„œ ์†Œ๊ฐœ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค!

 

 

 

00. useNavigate


usePage ๋ผ๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

usePage.js

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

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

  return ;
}
export default usePage;

 

 

01. ํŽ˜์ด์ง€ ์ด๋™ ํ•จ์ˆ˜์— url์ธ์ž ๋ณด๋‚ด๊ธฐ


์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ๋Š” ์ฃผ์†Œ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

 

usePage.js

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

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

  const handlePage = (url) => {
    navigate(url);
  };

  return {
    handlePage
  };
}
export default usePage;

A.js

import * as React from "react";
import usePage from "./usePage";

export default function A() {
  /** usePage์— ์žˆ๋Š” handlePage ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ */
  const { handlePage } = usePage();
  
  return (
    <div>
      <h1>(A) ํŽ˜์ด์ง€</h1>
      <button onClick={() => handlePage("/b")}>(B)๋กœ ๊ฐ€๊ธฐ</button>
      <button onClick={() => handlePage("/c")}>(C)๋กœ ๊ฐ€๊ธฐ</button>
    </div>
  );
}

(B.js์™€ C.js ๋„ A.js ์™€ ๋น„์Šทํ•˜๊ฒŒ ๊ตฌํ˜„)

 

 

 

๐Ÿ”ฅ 02. ํŽ˜์ด์ง€ ์ด๋™ ํ•จ์ˆ˜์— url์ธ์ž ์•ˆ ๋ณด๋‚ด๊ณ , ๋ฏธ๋ฆฌ url์„ค์ •ํ•ด๋†“๊ธฐ ๐Ÿ”ฅ


์ €๋Š” ์ด ๋ฐฉ๋ฒ•์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค!โœจโœจโœจ

01(ํŽ˜์ด์ง€ ์ด๋™ ํ•จ์ˆ˜์— url์ธ์ž ๋ณด๋‚ด๊ธฐ)๋ฒˆ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋„, ์ผ์ผ์ด ์ธ์ž๋ฅผ ๋„ฃ์–ด์ค˜์•ผ ํ•˜๋Š” ๋ถˆํŽธํ•จ์ด ๋‚จ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ๋‚˜, url์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—” ๋”๋”์šฑ์ด์š”!!!

(-> ๊ทผ๋ฐ, ์ƒํ™ฉ๋”ฐ๋ผ ๋‹ค๋ฅด๊ธด ํ•˜๊ฒ ์ฃ  ํ•˜ํ•ซ)

 

usePage.js

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

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

  const handlePageA = () => {
    navigate("/a");
  };
  const handlePageB = () => {
    navigate("/b");
  };
  const handlePageC = () => {
    navigate("/c");
  };

  return {
    handlePageA,
    handlePageB,
    handlePageC
  };
}
export default usePage;

A.js

import * as React from "react";
import usePage from "./usePage";

export default function A() {
  const { handlePageB, handlePageC } = usePage();
  return (
    <div>
      <h1>(A) ํŽ˜์ด์ง€</h1>
      <button onClick={handlePageB}>(B)๋กœ ๊ฐ€๊ธฐ</button>
      <button onClick={handlePageC}>(C)๋กœ ๊ฐ€๊ธฐ</button>
    </div>
  );
}

(B.js์™€ C.js ๋„ A.js ์™€ ๋น„์Šทํ•˜๊ฒŒ ๊ตฌํ˜„)

 

+ ์ถ”๊ฐ€๋กœ, ์ด๋ ‡๊ฒŒ๋„ ํ•  ์ˆ˜ ์žˆ์–ด์š”! (์ด๊ฑฐ ์ง„์งœ ํŽธํ•ด์š”) ๐ŸŒž๐ŸŒž๐ŸŒž

import * as React from "react";
import usePage from "./usePage";

export default function A() {
  const { handlePageB : hB, handlePageC : hC } = usePage();
  return (
    <div>
      <h1>(A) ํŽ˜์ด์ง€</h1>
      <button onClick={hB}>(B)๋กœ ๊ฐ€๊ธฐ</button>
      <button onClick={hC}>(C)๋กœ ๊ฐ€๊ธฐ</button>
    </div>
  );
}

์œ„์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ, handlePageB ์„ hB ๋ผ๊ณ  ์ด๋ฆ„์„ ๋ช…์‹œํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

+ 03. ๋’ค๋กœ ๊ฐ€๊ธฐ, ์ด์ „ ํŽ˜์ด์ง€ ๋ชป ๋Œ์•„๊ฐ€๊ฒŒ ํ•˜๊ธฐ


  • ์ฒซ ๋ฒˆ์งธ ์ธ์ž์ธ ์ฃผ์†Œ ์ž๋ฆฌ์—, -1 ๊ฐ™์€ ์ˆซ์ž๋ฅผ ๋„ฃ์œผ๋ฉด ๊ทธ ์ˆซ์ž๋งŒํผ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    => -1 : ๋’ค๋กœ 1 ํŽ˜์ด์ง€ ๊ฐ€๊ธฐ, 1 : ์•ž์œผ๋กœ 1 ํŽ˜์ด์ง€ ๊ฐ€๊ธฐ
  • ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ { replace, state } ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    => true : navigate์— ์ ํžŒ ์ฃผ์†Œ๋กœ ๋„˜์–ด๊ฐ„ ํ›„ ๋’ค๋กœ๊ฐ€๊ธฐ๋ฅผ ํ•ด๋„, ๋ฐฉ๊ธˆ ํŽ˜์ด์ง€๋กœ ๋Œ์•„์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    => false : ๋’ค๋กœ๊ฐ€๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. (๊ธฐ๋ณธ๊ฐ’)

 

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

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

  /** ๋’ค๋กœ ๊ฐ€๊ธฐ */
  const backPage = () => {
    navigate(-1);
  };
  
  /** ์ด์ „ ํŽ˜์ด์ง€ ๋ชป ๋Œ์•„๊ฐ€๊ฒŒ ํ•˜๊ธฐ */
  const backPageReplace = () => {
    navigate( url์ฃผ์†Œ , { replace: true });
  };

  return {
    backPage,
    backPageReplace
  };
}
export default usePage;

 

 

 

 

๊ทธ๋ž˜์„œ, ์ €๋Š” ํ•œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ useNavigate()๋ฅผ ์„ ์–ธํ•˜์—ฌ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ ์ด์œ ๋Š”์š”????

=> ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ์š”!

 

 

์œ„์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘, ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๋ณผ๊นŒ์š”?

 

Router.js

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

const AppRouter = () => {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/a" element={<A />} />
        <Route path="/b" element={<B />} />
        <Route path="/c" element={<C />} />
      </Routes>
    </BrowserRouter>
  );
};

export default AppRouter;

A.js

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

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

  function handlePageB() {
    navigate("/b");
  }
  function handlePageC() {
    navigate("/c");
  }

  return (
    <div>
      <h1>(A) ํŽ˜์ด์ง€</h1>
      <button onClick={handlePageB}>(B)๋กœ ๊ฐ€๊ธฐ</button>
      <button onClick={handlePageC}>(C)๋กœ ๊ฐ€๊ธฐ</button>
    </div>
  );
}

B.js

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

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

  function handlePageA() {
    navigate("/a");
  }
  function handlePageC() {
    navigate("/c");
  }

  return (
    <div>
      <h1>(B) ํŽ˜์ด์ง€</h1>
      <button onClick={handlePageA}>(A)๋กœ ๊ฐ€๊ธฐ</button>
      <button onClick={handlePageC}>(C)๋กœ ๊ฐ€๊ธฐ</button>
    </div>
  );
}

C.js

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

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

  function handlePageA() {
    navigate("/a");
  }
  function handlePageB() {
    navigate("/b");
  }

  return (
    <div>
      <h1>(C) ํŽ˜์ด์ง€</h1>
      <button onClick={handlePageA}>(A)๋กœ ๊ฐ€๊ธฐ</button>
      <button onClick={handlePageB}>(B)๋กœ ๊ฐ€๊ธฐ</button>
    </div>
  );
}

๊ฐ๊ฐ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ useNavigate Hook์„ ๋ถˆ๋Ÿฌ์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ์ค‘๋ณต ์ฝ”๋“œ๊ฐ€ ๋งŽ์ด ์ƒ๊ฒจ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค..!

const navigate = useNavigate();๋„ ์ผ์ผ์ด ์จ์ค˜์•ผ๊ฒ ๋„ค์š”. ๐Ÿค”๐Ÿค”

 

๋”ฐ๋ผ์„œ, ํ•œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”~~

 

 

โœจ์ค‘๋ณต ์ฝ”๋“œ๋Š” ํž˜๋“ค์–ด์šฉโœจ