React Router

์ดํ•˜์˜ยท2022๋…„ 4์›” 12์ผ
0
post-thumbnail

๐Ÿญ spa์—์„œ ํ™”๋ฉด์„ ์ „ํ™˜์‹œํ‚ค๋Š” router, ๊ทธ๋ฆฌ๊ณ  ์Šคํƒ€์ผ๋ง์€ ํŽธํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” css์ „์ฒ˜๋ฆฌ๊ธฐ์ธ sass์— ๋Œ€ํ•ด ์„ค๋ช… ์‹€์ด์ด์ด์ด์ด์ด์ž‘!

SPA

songle page application ํŽ˜์ด์ง€๊ฐ€ ํ•œ ๊ฐœ์ธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜

Routing

๋‹ค๋ฅธ ๊ฒฝ๋กœ(url์ฃผ์†Œ)์— ๋”ฐ๋ฅธ ๋‹ค๋ฅธ view(ํ™”๋ฉด)์„ ๋ณด์—ฌ์ฃผ๋Š”๊ฒƒ (ํ™”๋ฉด์ „ํ™˜)
๋ผ์šฐํ„ฐ๋Š” ๋ฆฌ์•กํŠธ์˜ ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์„ ์œ„ํ•ด ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋‹ค.

๐Ÿ‘พ React Router

react-router ์„ค์น˜

ํ„ฐ๋ฏธ๋„์— npm install react-router-dom --save ๊ฐ’์„ ์ž…๋ ฅํ•˜์—ฌ ์„ค์น˜

react router ์ปดํฌ๋„ŒํŠธ

1. router ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ํ•˜๊ธฐ

import React from "react";
import { BrowserRouter, Routes, Route } from "react-router-dom";
import Login from "./pages/Login/Login";
import Main from "./pages/Main/Main";

function Router() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<Login />} />
        <Route path="/main" element={<Main />} />
      </Routes>
    </BrowserRouter>
  );
}

export default Router;

Router.js ํŒŒ์ผ์— ๋„ฃ์–ด์ค€ ์ฝ”๋“œ์ด๋‹ค.
๋จผ์ € ๋กœ๊ทธ์ธ์ฐฝ์—์„œ ๋ฉ”์ธํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ€๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” Routes๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ์—ˆ๋‹ค.

2. index.js ์—ฐ๊ฒฐ

ReactDOM.render(<Router />, document.getElementById('root'));

Router ์ปดํฌ๋„ŒํŠธ๋กœ ์„ค์ •ํ•ด์คฌ๋‹ค.

3. Route ์ด๋™ํ•˜๊ธฐ

์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • Link : to prop์„ ๊ฐ–๋Š”๋‹ค.
  • useNavigate : path prop์„ ๊ฐ–๋Š”๋‹ค.

3-1. Link

import React from "react";
import { Link } from "react-router-dom";

function Login() {
  return (
    <div>
      <Link to="/signup">ํšŒ์›๊ฐ€์ž…</Link>
    </div>
  );
}

export default Login;

์ด๋Ÿฐ์‹์œผ๋กœ ํšŒ์›๊ฐ€์ž…์„ ํด๋ฆญํ•˜๋ฉด ์‚ฌ์ดํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฐœ๋…์ด๋‹ค.
Link/ ์ปดํฌ๋„ŒํŠธ๋Š” aํƒœ๊ทธ์™€ ๊ฐ™์ด ์ง€์ •ํ•œ ๊ฒฝ๋กœ๋กœ ๋ฐ”๋กœ ์ด๋™์‹œ์ผœ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.


ํ•˜์ง€๋งŒ ๋‘๊ฐœ์˜ ํƒœ๊ทธ์˜ ์ฐจ์ด์ ์€ aํƒœ๊ทธ๋Š” ์™ธ๋ถ€ ์‚ฌ์ดํŠธ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๊ณ , Link๋Š” ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ํŽ˜์ด์ง€ ์ „ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

3-2. useNavigate

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

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

  const goToMain = () => {
    navigate("/main");
  };

  return (
    <div className="login">
      <h1 className="login_logo">Westagram</h1>
      <div className="login_input">
        <input
          type="text"
          className="inputId"
          placeholder="์ „ํ™”๋ฒˆํ˜ธ, ์‚ฌ์šฉ์ž ์ด๋ฆ„ ๋˜๋Š” ์ด๋ฉ”์ผ"
        />
        <input type="password" className="inputPw" placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ" />
        <button className="login_btn" onClick={goToMain}>
          ๋กœ๊ทธ์ธ
        </button>
      </div>
      <div className="forget_pw">
        <a className="forgetPwLink" href="#">
          ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์žŠ์œผ์…จ๋‚˜์š”?
        </a>
      </div>
    </div>
  );
};

export default Login;

useNavigate๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ†ตํ•ด ํŽ˜์ด์ง€๋ฅผ ์ด๋™์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

goToMain ์—์„œ ๊ตฌํ˜„ํ•œ๊ฒƒ์ฒ˜๋Ÿผ useNavigate ํ›…์„ ํ†ตํ•ด ํŽ˜์ด์ง€ ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ์ด๋™์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๊ณ  ํ•ด๋‹น ํ•จ์ˆ˜๋Š” navigate๋ผ๋Š” ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค ๊ทธ๋‹ค์Œ navigate์˜ ์ธ์ž๋กœ Router.js์—์„œ ์„ค์ •ํ•œ path๋ฅผ ๋„˜๊ฒจ์ฃผ๋ฉด ํ•ด๋‹น ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

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