라우팅은 네트워크에서 경로를 선택하는 프로세스를 말한다.
즉 네트워크의 주소에 맞는 프로세스로 이동시켜주는 작업이다.
SPA(single page application)을 구현할 수 있게 해주는 패키지
모든 React Router 웹 프로젝트에 권장되는 라우터이며 DOM History API를 사용하여 URL을 업데이트하고 히스토리 스택을 관리한다.
import {createBrowserRouter,RouterProvider,} from "react-router-dom"
const router =createBrowserRouter([{
path:'/',
element : <Layout/>
children:[
{
path:"/",
element:<Home/>,
},
{
path:"profile",
element:<Profile/>,
}
]
},
{
path:'/login',
element : <Login/>,
},
{
path:'/signup',
element:<Signup/>,
}])
...
children
모든 데이터 라우터 객체는 이 구성 요소에 전달되어 앱을 렌더링하고 나머지 데이터 API를 활성화한다.
function App() {
const [isLoading,setIsLoading]=useState(true);
async function init() {
await auth.authStateReady();
setIsLoading(false);
}
useEffect(()=>{init()},[]);
return (
<Wrapper>
<GlobalStyles/>
{isLoading ? <LoadingScreen/> :<RouterProvider router={router}/>}
</Wrapper>
)
}
깨끗한 URL을 사용하여 브라우저의 주소창에 현재 위치를 저장하고 브라우저의 내장된 기록 스택을 사용하여 탐색한다.
import { BrowserRouter ,Routes,Route} from "react-router-dom";
function App() {
return (
<BrowserRouter>
<Routes>
<Route/>
</Routes>
</BrowserRouter>
)
}
export default App
사용자가 클릭하거나 탭하여 다른 페이지로 이동할 수 있게 해주는 요소
html의 a태그와 기능이 같음
import { Link, useNavigate } from 'react-router-dom
export default function Signup(){
...
return (
...
<Link to="/login">Do you have an Account?</Link>
)
}
렌더링될 때 현재 위치를 변경하며 useNavigate를 둘러싼 구성 요소 래퍼이며 props와 동일한 인수를 모두 허용한다.
import { Navigate } from 'react-router-dom';
import { auth } from '../routes/firebase';
export default function ProtectedRoute({children}){
// 로그인 되어있지 않은 상태
if(auth.currentUser===null){
return <Navigate to="/login"/>
}
return children;
}
하위 경로 요소를 렌더링하려면 상위 경로 요소에서 Outlet을 사용해야 한다.
이를 통해 하위 경로가 렌더링될 때 중첩된 UI가 표시될 수 있다.
상위 경로가 정확히 일치하면 하위 인덱스 경로가 렌더링이 된다.
function Dashboard() {
return (
<div>
<h1>Dashboard</h1>
<Outlet />
</div>
);
}
function App() {
return (
<Routes>
<Route path="/" element={<Dashboard />}>
<Route
path="messages"
element={<DashboardMessages />}
/>
<Route path="tasks" element={<DashboardTasks />} />
</Route>
</Routes>
);
}
<DashborardMessages/>
가 온다.<DashboardTasks />
가 온다.React Router 앱에서 가장 중요한 부분 , 라우터 생성 기능에 전달되는 객체
앱의 어느 곳에서나 렌더링되는
<Routes>
는 현재 위치의 하위 경로 집합과 일치한다.
<Routes>
<Route path="/" element={<Dashboard />}>
<Route
path="messages"
element={<DashboardMessages />}
/>
<Route path="tasks" element={<DashboardTasks />} />
</Route>
<Route path="about" element={<AboutPage />} />
</Routes>
위치가 변경될 때마다 <Routes>
는 모든 하위 경로를 조사하여 가장 일치하는 항목을 찾고 UI의 해당 분기를 렌더링한다.
<Route>
요소는 중첩된 URL 경로에 해당하는 중첩된 UI를 나타내기 위해 중첩될 수 있다.
상위 경로는 <Outlet>
을 렌더링하여 하위 경로를 렌더링한다.
로 이동시켜주켜주는 react-router-dom의 hook
첫번째 인자 : 이동시킬 경로 or 히스토리 스택에 들어가고 싶은 델타를 전달 ex. Nnavigate(-1)은 뒤로 돌아가는것과 같다.
두번째 인자(옵션) : 추후에 알아보겠음
import { useNavigate } from 'react-router-dom';
import { auth } from './firebase'
export default function Home(){
const navigate= useNavigate();
function handleLogout(){
// 로그아웃
auth.signOut();
navigate('/login');
}
return <button onClick={handleLogout}>Sign out</button>
}