Outlet — это специальный компонент в библиотеке React Router, который используется для реализации вложенной маршрутизации. Он действует как контейнер, в котором отображается дочерний маршрут текущего родительского маршрута. Это ключевой элемент при построении сложных приложений с многоуровневой навигацией.
Outlet позволяет:
Для использования Outlet маршруты организуются иерархически.
Родительский маршрут содержит компонент, в котором располагается
<Outlet />. Дочерние маршруты автоматически
рендерятся внутри этого Outlet.
Пример:
import { BrowserRouter, Routes, Route, Outlet } from "react-router-dom";
function Dashboard() {
return (
<div>
<h1>Панель управления</h1>
<Outlet />
</div>
);
}
function Users() {
return <h2>Список пользователей</h2>;
}
function Settings() {
return <h2>Настройки</h2>;
}
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="dashboard" element={<Dashboard />}>
<Route path="users" element={<Users />} />
<Route path="settings" element={<Settings />} />
</Route>
</Routes>
</BrowserRouter>
);
}
В этом примере компонент Dashboard содержит
<Outlet />. Когда пользователь переходит на
/dashboard/users, React Router рендерит компонент
Users внутри Outlet, сохраняя при этом шапку и другие
элементы Dashboard.
React Router поддерживает вложенность на любом уровне. Это позволяет строить структуры, например, с панелью навигации, основным контентом и вкладками внутри него:
function Layout() {
return (
<div>
<Header />
<Outlet />
<Footer />
</div>
);
}
function MainContent() {
return (
<div>
<Sidebar />
<Outlet />
</div>
);
}
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Layout />}>
<Route path="main" element={<MainContent />}>
<Route path="tab1" element={<Tab1 />} />
<Route path="tab2" element={<Tab2 />} />
</Route>
</Route>
</Routes>
</BrowserRouter>
);
}
Каждый <Outlet /> рендерит дочерний маршрут,
соответствующий текущему URL. Это позволяет создавать многослойные
интерфейсы с единым корневым компонентом и вложенными зонами для
навигации.
Outlet совместим с динамическими маршрутами и параметрами. Параметры
маршрута автоматически доступны дочерним компонентам через хук
useParams:
function UserProfile() {
const { userId } = useParams();
return <div>Профиль пользователя {userId}</div>;
}
<Routes>
<Route path="users" element={<Users />}>
<Route path=":userId" element={<UserProfile />} />
</Route>
</Routes>
В этом случае, при переходе на /users/42, компонент
UserProfile будет рендериться внутри Outlet компонента
Users, получая параметр userId со значением
42.
Для навигации между дочерними маршрутами можно использовать
Link или NavLink, создавая структуру
интерфейса, где родительский компонент содержит общую навигацию, а
Outlet отвечает за рендер конкретного содержимого:
function Dashboard() {
return (
<div>
<nav>
<NavLink to="users">Пользователи</NavLink>
<NavLink to="settings">Настройки</NavLink>
</nav>
<Outlet />
</div>
);
}
Такое разделение позволяет хранить общие элементы интерфейса на одном уровне и не перерендеривать их при смене дочернего маршрута, улучшая производительность и упрощая структуру компонентов.
Outlet является основным инструментом для построения вложенной маршрутизации в React Router. Он обеспечивает гибкую архитектуру, позволяя создавать модульные, многослойные интерфейсы с сохранением общей структуры приложения и эффективной навигацией между уровнями.