๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

react

React / Router

React Router 

React์—์„œ SPA ๋ฐฉ์‹์œผ๋กœ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

* ๋ผ์šฐํŒ… : ์š”์ฒญ ์ฃผ์†Œ์— ๋งž๋Š” ํ™”๋ฉด์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ

 

 

 

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

์„ค์น˜

์ด๋ฏธ ์ƒ์„ฑ๋œ react ํ”„๋กœ์ ํŠธ์— ์„ค์น˜ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

npm i react-router-dom

 

 

 

 

 

์ฃผ์š” ์ปดํฌ๋„ŒํŠธ

<BrowserRouter>

React Router๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ณณ์„ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ผ๋‹ค.

์ด ๋•Œ ์•„๋ž˜์ฒ˜๋Ÿผ App ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ์‹ธ๊ฒŒ ๋˜๋ฉด ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์„ ์•ฑ ์ „์ฒด์— ์ ์šฉ์‹œ์ผœ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์ด ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

 

* StrictMode๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋ฅผ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•œ ๋„๊ตฌ๋กœ, UI๋Š” ๋ Œ๋”๋งํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ž์†๋“ค์— ๋Œ€ํ•œ ๋ถ€๊ฐ€์ ์ธ ๊ฒ€์‚ฌ์™€ ๊ฒฝ๊ณ ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

createRoot(document.getElementById('root')).render(
  <StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </StrictMode>,
);

 

<Link>

ํŽ˜์ด์ง€์˜ ์ƒˆ๋กœ ๊ณ ์นจ ์—†์ด ์ด๋™ํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ๋กœ, to ์†์„ฑ์„ ์ด์šฉํ•ด ์ด๋™ํ•˜๊ณ  ์‹ถ์€ ์ฃผ์†Œ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๋•Œ Link ์ปดํฌ๋„ŒํŠธ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ <a>์š”์†Œ๋กœ ํ‘œ์‹œ๋˜๋Š”๋ฐ, a์š”์†Œ์™€ ๋‹ฌ๋ฆฌ ์ƒˆ๋กœ๊ณ ์นจ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ์ฃผ์†Œ๋งŒ ๋ณ€๊ฒฝ๋œ๋‹ค.

 

์‹ค์Šต ์‹œ ์•„๋ž˜ ์ฝ”๋“œ์—์„œ ๋ฉ”์ธ์„ ๋ˆŒ๋ €์„ ๋•Œ, ์ฃผ์†Œ๊ฐ€ http://localhost:5173/main์œผ๋กœ ์ด๋™๋  ๊ฒƒ์ด๋‹ค.

function App() {
  return (
    <nav>
      <Link to="/main">๋ฉ”์ธ</Link>
      <Link to="/mypage">๋งˆ์ดํŽ˜์ด์ง€</Link>
      <Link to="/test">ํ…Œ์ŠคํŠธ</Link>
    </nav>
  );
}

 

 

<Routes>

<Route> ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ฌถ์–ด์ฃผ๋Š” ์—ญํ• 

 

<Route>

์ฃผ์†Œ์— ๋งž๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œ

function App() {
  return (
    <>
      <nav>
        <Link to="/main">๋ฉ”์ธ</Link>
        <Link to="/mypage">๋งˆ์ดํŽ˜์ด์ง€</Link>
        <Link to="/test">ํ…Œ์ŠคํŠธ</Link>
      </nav>

      <Routes>
        <Route path="/main" element={<Main />} />
        <Route path="/mypage" element={<Mypage />} />
        <Route path="/test" element={<Test />} />
      </Routes>
    </>
  );
}

function Main() {
  return <div>mainPage</div>;
}

function Mypage() {
  return <div>myPage</div>;
}

function Test() {
  return <div>test</div>;
}

 

 

 

์ฃผ์š” ํ•จ์ˆ˜

useNavigate()

ํŠน์ • ์ฃผ์†Œ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜ ์ƒ์„ฑ

์ด ๋•Œ ์ธ์ž๊ฐ’์œผ๋กœ ์ˆซ์ž๋ฅผ 1, -1์ด์•„๋‹ˆ๋ผ 2, -2๋กœํ•˜๋ฉด ๋‘๋ฒˆ ์•ž์œผ๋กœ ๊ฐ€๊ฑฐ๋‚˜ ๋’ค๋กœ๊ฐ€๊ฒŒ ๋œ๋‹ค.

 

const navi = useNavigate()
navi('/main') // main์œผ๋กœ ์ด๋™
navi(1) // ์•ž์œผ๋กœ ๊ฐ€๊ธฐ
navi(-1) // ๋’ค๋กœ ๊ฐ€๊ธฐ

 

Link์ปดํฌ๋„ŒํŠธ ๋Œ€์‹  useNavigate๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

const navi = useNavigate();

return (
<>
  <nav>
    <button onClick={() => navi('/main')}>๋ฉ”์ธ</button>
    <button onClick={() => navi('/mypage')}>๋งˆ์ดํŽ˜์ด์ง€</button>
    <button onClick={() => navi('/test')}>ํ…Œ์ŠคํŠธ</button>
  </nav>

  <Routes>
    <Route path="/main" element={<Main />} />
    <Route path="/mypage" element={<Mypage />} />
    <Route path="/test" element={<Test />} />
  </Routes>
</>
);

 

 

useLocation()

ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ์œ„์น˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๊ฐ์ฒด ์ƒ์„ฑ

const location = useLocation()
location.pathname // ํ˜„์žฌ ๊ฒฝ๋กœ๋ช…
location.search // ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด

 

์ฝ˜์†”์ฐฝ์œผ๋กœ ํ™•์ธํ•ด๋ณด๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์ถœ๋ ฅ๋œ๋‹ค.

const location = useLocation();
console.log(location);
console.log(location.pathname);
console.log(location.search);

 

 

์ด๋•Œ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง๊ฐ’์ธ search๊ฐ€ ์•„์˜ˆ ''์ธ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์•„์ง ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง ๊ฐ’์„ ๋”ฑํžˆ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์•„์„œ ๊ทธ๋Ÿฐ ๊ฒƒ์ธ๋ฐ, ์ฃผ์†Œ์— ์ž„์˜๋กœ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ์ด๋ ‡๊ฒŒ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

์ฟผ๋ฆฌ ์ŠคํŠธ๋ง โฌ‡๏ธ

๋”๋ณด๊ธฐ

์ฟผ๋ฆฌ ์ŠคํŠธ๋ง(์ฟผ๋ฆฌ ๋ฌธ์ž์—ด, ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ)์ด๋ž€ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐฉ์‹์œผ๋กœ ๋ณดํ†ต get ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ?๋กœ ์‹œ์ž‘ํ•˜๋ฉฐ ํ‚ค=๊ฐ’์˜ ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚ด๊ณ , ์—ฌ๋Ÿฌ ์Œ์ผ ๊ฒฝ์šฐ &๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค.

 

๋‚˜๋ฌด์œ„ํ‚ค๊ฐ™์€ ํŽ˜์ด์ง€์—์„œ๋Š” ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ํ†ตํ•ด ์–ด๋А ๊ฒ€์ƒ‰์–ด๋กœ๋ถ€ํ„ฐ ์™”๋ƒ๋Š” ํ‘œํ˜„์œผ๋กœ from์ด๋ผ๋Š” ํ‚ค์˜ ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด ๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‚ด๊ฐ€ ๋‚˜๋ฌด์œ„ํ‚ค ๊ฒ€์ƒ‰์ฐฝ์— '์—”๋ฏน์Šค'๋ฅผ ๊ฒ€์ƒ‰ํ–ˆ์„ ๋•Œ, ์—”๋ฏน์Šค์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋ฌธ์„œ๋Š” NMIXX์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œํ˜„๋œ๋‹ค.

https://namu.wiki/w/NMIXX?from=์—”๋ฏน์Šค

 

 

 

useParams()

์ฃผ์†Œ์˜ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ๋‹ด์€ ๊ฐ์ฒด ์ƒ์„ฑ.
url ํŒจํ„ด์— ๋งž๊ฒŒ ๋ณ€์ˆ˜๋ฅผ ๋™์ ์œผ๋กœ ์ฝ์–ด๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์ปดํฌ๋„ŒํŠธ๋งˆ๋‹ค ๋‹ค๋ฅธ url ๊ฐ’์„ ์ „๋‹ฌ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

const params = useParams()
params.param1 // param1์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋“ค์–ด์˜จ ๊ฐ’
params.name // name์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋“ค์–ด์˜จ ๊ฐ’

 

๋ผ์šฐํŠธ ๊ฒฝ๋กœ์—์„œ name์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ด์คฌ์„ ๋•Œ ๊ฒฝ๋กœ ๋ณ€์ˆ˜๋ช…์ธ name์ด key๊ฐ€ ๋˜๊ณ , name์˜ ๊ฐ’์ด ๋ฌธ์ž์—ด๋กœ ๋“ค์–ด์˜จ๋‹ค.

      <Routes>
        <Route path="/main/:name" element={<Main />} />
        <Route path="/mypage" element={<Mypage />} />
        <Route path="/test" element={<Test />} />
      </Routes>
    </>
  );
}

function Main() {
  const params = useParams();
  console.log(params.name);
  return <div>mainPage</div>;
}


์ด ๋•Œ ์ด ์ฝ”๋“œ์—์„  ์•„์ง name์— ๊ฐ’์„ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž„์˜๋กœ ์ฃผ์†Œ์— ๊ฐ’์„ ์ž…๋ ฅํ•ด์ฃผ๋ฉด

 

params.name = "hello"

 

 

 

useSearchParams() 

์ฃผ์†Œ์˜ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด์™€ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜ ์ƒ์„ฑ

const[searchParams, setSearchParams] = useSearchParams()
searchParams.get('name') // name์œผ๋กœ ๋“ค์–ด์˜จ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง
setSearchParams({name:'ํ•˜์—ฐ'}) // name ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง ์ˆ˜์ •

 

๋ณดํ†ต ์ˆ˜์ •์€ ์•ˆํ•˜๊ณ  ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ํ•œ๋‹ค...

      <Routes>
        <Route path="/main" element={<Main />} />
        <Route path="/mypage" element={<Mypage />} />
        <Route path="/test" element={<Test />} />
      </Routes>
    </>
  );
}

function Main() {
  const [searchParams, setSearchparams] = useSearchParams();
  console.log(searchParams.get('name'));
  console.log(searchParams.get('school'));
  return <div>mainPage</div>;
}

 


์ด๋ฒˆ์—๋„ ์•„์ง ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง ๊ฐ’์ด ๋”ฑํžˆ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰์‹œํ‚จ ์ƒํƒœ์—์„œ ์ด๋ฒˆ์—” ์ฟผ๋ฆฌ์ŠคํŠธ๋ง ๊ฐ’์„ ์—ฌ๋Ÿฌ๊ฐœ ๋„ฃ์–ด์คฌ๋‹ค

 

 

๊ฐ๊ฐ name์˜ ๊ฐ’๊ณผ school์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.