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();๋ ์ผ์ผ์ด ์จ์ค์ผ๊ฒ ๋ค์. ๐ค๐ค
๋ฐ๋ผ์, ํ ํจ์ํ ์ปดํฌ๋ํธ ๋ด์์ ์ฌ์ฉํ๋ ๊ฑด ์ด๋จ๊น์~~
โจ์ค๋ณต ์ฝ๋๋ ํ๋ค์ด์ฉโจ