리액트
리액트 - Outlet
개발자 포비
2024. 12. 23. 22:40
React Router의 Outlet 이해하기
Outlet이란?
Outlet은 React Router v6에서 도입된 컴포넌트로, 부모 라우트가 자식 라우트 엘리먼트를 렌더링할 수 있게 해주는 도구입니다. 중첩 라우팅을 구현할 때 특히 유용합니다.
Outlet의 주요 특징
- 부모 라우트의 레이아웃 내에서 자식 라우트의 컴포넌트를 렌더링할 위치를 지정할 수 있습니다
- 공통 레이아웃을 유지하면서 특정 부분만 동적으로 변경할 수 있습니다
- 코드의 재사용성을 높이고 구조를 더 깔끔하게 만들 수 있습니다
기본 사용 예제
// App.jsx
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Layout from './Layout';
import Home from './Home';
import About from './About';
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Layout />}>
<Route index element={<Home />} />
<Route path="about" element={<About />} />
</Route>
</Routes>
</BrowserRouter>
);
}
// Layout.jsx
import { Outlet } from 'react-router-dom';
function Layout() {
return (
<div>
<header>
<nav>
<Link to="/">홈</Link>
<Link to="/about">소개</Link>
</nav>
</header>
<main>
<Outlet /> {/* 자식 라우트가 렌더링되는 위치 */}
</main>
<footer>
<p>푸터 영역입니다</p>
</footer>
</div>
);
}
중첩 라우팅 예제
// App.jsx
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Layout from './Layout';
import UserLayout from './UserLayout';
import Home from './Home';
import UserProfile from './UserProfile';
import UserSettings from './UserSettings';
import UserPosts from './UserPosts';
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Layout />}>
<Route index element={<Home />} />
<Route path="user" element={<UserLayout />}>
<Route index element={<UserProfile />} />
<Route path="settings" element={<UserSettings />} />
<Route path="posts" element={<UserPosts />} />
</Route>
</Route>
</Routes>
</BrowserRouter>
);
}
// UserLayout.jsx
import { Outlet, Link } from 'react-router-dom';
function UserLayout() {
return (
<div>
<nav>
<Link to="/user">프로필</Link>
<Link to="/user/settings">설정</Link>
<Link to="/user/posts">게시물</Link>
</nav>
<div className="user-content">
<Outlet /> {/* 사용자 관련 컴포넌트가 렌더링되는 위치 */}
</div>
</div>
);
}
Outlet Context 활용
Outlet은 context를 통해 자식 라우트에 데이터를 전달할 수도 있습니다:
// ParentLayout.jsx
function ParentLayout() {
const userData = {
name: "김철수",
role: "관리자"
};
return (
<div>
<h1>부모 레이아웃</h1>
<Outlet context={userData} />
</div>
);
}
// ChildComponent.jsx
import { useOutletContext } from 'react-router-dom';
function ChildComponent() {
const userData = useOutletContext();
return (
<div>
<h2>사용자 이름: {userData.name}</h2>
<p>역할: {userData.role}</p>
</div>
);
}
이러한 구조를 통해 웹 애플리케이션의 레이아웃을 효율적으로 관리하고, 코드의 재사용성을 높일 수 있습니다.