웹사이트에 html파일이 하나면 SPA(Single Page Application), 2개 이상이면 MPA(Multi Page Application) 라고한다.
html파일이 하나기 때문에 다른 UI를 렌더링 하고 싶을 때는 라우팅 기능을 사용해야 한다.
하지만 리액트에는 라우팅 기능이 없다.
그래서 리액트를 라우팅 해줄 react-router-dom라는 라이브러리를 다운 받아야 한다.
/
로 하면 Index페이지가 된다.)root.render(<Router />);
로 바꾸면 화면에 잘 렌더링 된다.라우터 컴포넌트를 생성하기 전에는 index.js 내부 render메소드의 인자를 바꿔 해당 컴포넌트를 보여줬다.
하지만 라우터 컴포넌트를 생성하면 render메소드 인자를 일일이 바꾸는 것이 아니라 url을 이용해서 경로에 맞는 컴포넌트를 보여준다. 따라서 컴포넌트 import도 index.js가 아니라 Router.js에서 진행하면 된다.
import React from 'react';
import { BrouserRouter, Routes, Route } from "react-router-dom"
const Router = () => {
return (
<BrouserRouter>
<Routes>
<Route path='/' element={<Login />} />
<Route path='/main' element={<Main />} />
</Routes>
<BrouserRouter>
);
};
export default Router;
특정 동작으로 경로 이동을 하려면 Link Component, useNavigate hook 2가지 방법이 있다.
import React from 'react';
import { Link } from 'react-router-dom';
const LoginBtn = () => {
return (
<button>
<Link to="/Main">로그인</Link>;
</button>
);
};
export default LoginBtn;
부모요소를 동작하면 자식요소인 Link의 to 속성값인 경로로 조건없이 이동한다.
그럼 a태그와는 어떤 차이점이 있을까?
import React from 'react';
import { useNavigate } from 'react-router-dom';
const LoginBtn= () => {
const navigate = useNavigate();
return (
<button
onClick={()=>{
navigate("/main");
}}>
로그인
</button>
);
};
export default LoginBtn;
버튼을 클릭했을 때 조건에 부합하면 navigate의 인자인 경로로 이동한다.
hook은 규칙상 컴포넌트 최상단에서만 호출해야 한다. 그래서 변수에 할당해서 컴포넌트 내부에 넣어준다.
리액트를 잠시나마 해보면서 render메소드 인자로 계속 보고싶은 컴포넌트 이름을 넣어줘야 하나 라는 의문이 들었는데 router라는 걸 알게되어서 그 의문이 풀렸다.