☑️
인스타그램 클론 코딩에서 생성한 HTML 파일은 Login페이지에서 로그인에 성공 후 Main 페이지로 넘어가는 형태로 구성되어 있다.
React-router
는 리액트의 라우팅 기능을 위해 가장 많이 사용되는 라이브러리react-router
를 추가하여 routing을 구현한다.npm install react-router-dom --save
//--save => 최신버전 설치
//Router.js
import React from "react";
import { BrowserRouter, Routes, Route } from "react-router-dom";
import Nav from "./components/Nav/Nav";
import Footer from "./components/Footer/Footer";
import Login from "./pages/Login/Login";
import Signup from "./pages/Signup/Signup";
import Main from "./pages/Main/Main";
function Router() {
return (
<BrowserRouter>
<Nav />
<Routes>
<Route path="/" element={<Login />} />
<Route path="/signup" element={<Signup />} />
<Route path="/main" element={<Main />} />
</Routes>
<Footer />
</BrowserRouter>
);
}
export default Router;
import로 BrowserRouter, Routes, Route를 react-router-dom모듈에서 가져온다.
Router 함수에 <BrowserRouter>
component를 사용하여 다른 url 주소로 통하는 경로를 작성한다.
이때 경로들을 path
라는 속성을 사용하고 해당 파일의 경로를 작성한 후 element
속성으로 자바스크립트를 JSX에서 표현할 때 작성하는 중괄호 안에 component로 작성한다.
모든 <Routes>
태그는 감싸는 태그가 있어야 하기에 <Routes>
태그로 감싸준다.
마지막으로 Router
를 export default
한다.
ReactDOM.render(<Router />, document.getElementById('root'));
//이전버전
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<Router />);
//최신버전
CRA로 만든 앱에 routing 기능을 적용하기 위해서는 index.js를 수정한다.
전 블로그 글에 남긴 내용과 같이 ReactDom
객체의 render 메소드를 사용하여 <Router />
component를 <div id="root"></div>
안에 보여질 수 있게 설정한다.
1.
<Link>
component 사용
import React from "react";
import { Link } from "react-router-dom";
function Login() {
return (
<div>
<Link to="/signup">회원가입</Link>
</div>
);
}
export default Login;
react-router-dom 모듈에서 <Link>
component를 가져온다.
Router.js에서 설정한 path로 이동하기 위해서 <Link>
component를 사용해야 하기 때문이다.
react-router-dom에서 제공하는 <Link />
component는 DOM에서 <a>
로 변환된다(compile)
JSX → Babel → Javascript
<a>
vs <Link />
<a>
→ 외부 사이트로 이동하는 경우
<Link />
→ 프로젝트 내에서 페이지 전환하는 경우
2.
useNavigate
사용
import React from "react";
import { useNavigate } from "react-router-dom";
function Login() {
const navigate = useNavigate();
const goToMain = () => {
navigate("/main");
};
// 실제 활용 예시
// const goToMain = () => {
// if(response.message === "valid user"){
// navigate('/main'); 괄호 안에 경로입력
// } else {
// alert("가입된 회원이 아닙니다. 회원가입을 먼저 해주세요.")
// navigate('/signup');
// }
// }
return (
<div>
<button className="loginBtn" onClick={goToMain}>
로그인
</button>
</div>
);
}
export default Login;
goToMain
함수에서 구현된 것처럼, useNavigate
훅을 통해 페이지 이동할 수 있다.
useNavigate
훅을 실행하면 페이지 이동을 할 수 있게 해주는 함수를 반환한다. 해당 함수를 navigate
라는 변수에 저장한다.
이후, navigate
의 인자로 Router.js 에서 설정한 path
를 넘겨주면, 해당 경로로 이동할 수 있다.
💡주의사항
만약 button에 onClick={변수 또는 함수 이름}을 명시할 때, button에 적용했던 속성disabled를 삭제해야 useNavigate이 정상적으로 작동한다.
<Link />
를 사용하며 언제 useNavigate
를 사용할까?1.
<Link />
📌클릭 시 바로 이동하는 로직 구현 시에 사용한다.
ex. Nav Bar, Aside Menu, 아이템 리스트 페이지에서 아이템 클릭 시 > 상세 페이지로 이동
2.
useNavigate
📌페이지 전환 시 추가로 처리해야 하는 로직이 있는 경우
ex. 로그인 버튼 클릭 시
Backend API로 데이터(User Info) 전송
User Data 인증 / 인가
response message
Case 1 : 회원 가입되어 있는 사용자 > Main 페이지로 이동
Case 2 : 회원 가입이 되어 있지 않은 사용자 > Signup 페이지로 이동