Front/React

[ Vite + React ] Route, Routes 페이지 이동

Yume Dev 2024. 10. 5. 13:56
반응형

 

Route를 활용하여 페이지 이동을 할 수 있다.

npm install react-router-dom

 

react-router-dom을 설치하여 Route와 Routes를 import

 

App.tsx ( 타입스크립트를 사용하기에 js 파일이 아닌 tsx확장자를 가진다.) 에 Route, Routes를 import

import React from 'react';
import { Route, Routes } from "react-router-dom";

 

이후 index 파일에서 <app/> 을 <BrowserRouter> 로 감싸주면 Rotue를 사용할 수 있다.

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.scss';
import App from './App';
import reportWebVitals from './reportWebVitals';
import {BrowserRouter} from "react-router-dom";

const root = ReactDOM.createRoot(
  document.getElementById('root') as HTMLElement
);
root.render(
  // <React.StrictMode>
      <BrowserRouter>
        <App />
      </BrowserRouter>
  // </React.StrictMode>
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

Routes, Route

Routes 로 사용할 Route를 감싸준다.

Route에서는 path는 해당 경로로 접속시 element에 넣은 component를 화면에 보여준다.

import React from 'react';
import { Route, Routes } from "react-router-dom";
import './App.css';
import Main from "./Main";
import * as Pages from './page/Pages';


function App() {
  return (
    <div className="App">
      <Routes>
        <Route path="/" element={<Main/>}>
            <Route path="" element={<Pages.Login.Login/>}/>
            <Route path="home" element={<Pages.Home.Home/> }/>
        </Route>
      </Routes>
    </div>
  );
}

 

Route안에 Route를 설정하면

불필요한 경로를 입력을 하지 않아도 된다.

path="/" 로 되어있는 route 안에 추가적으로 path를 넣어주면

/ 경로인 경우에는 Login 화면으로 경로가 설정되며

/home 경로는 home 화면으로 설정된다.

 

import {Outlet} from "react-router-dom";
import Header from "./component/header/Header";
import Footer from "./component/footer/Footer";
import './main.scss'

function Main() {
    return(
        <div className="default-padding">
            <Header/>
            <Outlet></Outlet>
            <Footer/>
        </div>)
}

export default Main;

default "/" 경로에 Main을 넣어 어느 페이지에서든지 header와 footer는 항상 나오도록 설정

이후 outlet을 활용하여 모든 컴포넌트는 outlet 영역에서 만들어지도록 한다.

 

> page들을 import할때 좀 더 관리를 하기 위해 Pages파일을 만들어 파일들을 하나로 묶어서 export를 진행

 

로그인 관련 component를 한번에 export하기 위해 Login.ts파일에서 login관련된 파일들을 모두 export 진행

Home 도 마찬가지로 home.ts파일에서 모두 export를 진행

export {default as Login} from './LoginMain';

 

이후 pages.ts파일에서 export한 모든 파일들을 전부 export 

export * as Login from "./login/Login";
export * as Home from "./home/Home";

 

마지막으로 App에 import하면

Pages.Login.Login 처럼 좀 더 구조를 갈끔하게 관리할 수 있다.


Navigator

useNavigate를 활용하여 버튼을 누르면 해당 페이지로 이동하도록 기능을 구현

간단하게 로그인 버튼을 만들어 onClick 이벤트에서 navigator를 사용하여 이동할 경로를 지정해준다.

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

function LoginMain() {
    const navigator = useNavigate()

    function handleLogin() {
        navigator('/home');
    }
    return(
        <>
            <div className="login-container">
                <button onClick={handleLogin}>
                    로그인
                </button>
            </div>
        </>
    )
}

export default LoginMain;

 

로그인 버튼을 누르면 home으로 이동되며 route에서 설정한 home 페이지로 이동하게 된다.

 

로그인 버튼을 누르면 홈 화면으로 이동이 되며

최종적으로 로그인 화면과 홈 화면에서 header와 footer는 그대로 남아있고 outlet으로 설정한 부분만 화면이 바뀌게 된다.

 

localhost:3000

localhost:3000/home

728x90
반응형