在 React 18 中,Outlet 是由 React Router(通常是 react-router-dom)提供的组件,用于在嵌套路由中渲染子路由的内容。它是 React Router v6 及以上版本中实现嵌套路由的核心组件。
Outlet 的作用
Outlet 充当子路由的占位符,告诉 React Router 在父路由的组件中どこ子路由的组件应该被渲染。换句话说,它是父路由布局中用来动态插入子路由内容的地方。
使用场景
- 嵌套路由:当你需要在父路由的布局中保留一些固定内容(比如导航栏、侧边栏),同时动态渲染子路由的内容时,
Outlet非常有用。 - 布局路由:
Outlet常用于创建共享布局,子路由的内容会根据当前 URL 动态填充到Outlet的位置。
示例代码
以下是一个简单的使用 Outlet 的例子:
import { Routes, Route, Outlet, Link } from 'react-router-dom';
// 父路由组件(包含布局)
function Layout() {
return (
<div>
<nav>
<Link to="/home">Home</Link> | <Link to="/about">About</Link>
</nav>
<hr />
{/* 子路由的内容会在这里渲染 */}
<Outlet />
</div>
);
}
// 子路由组件
function Home() {
return <h2>Home Page</h2>;
}
function About() {
return <h2>About Page</h2>;
}
// 路由配置
function App() {
return (
<Routes>
<Route element={<Layout />}>
<Route path="/home" element={<Home />} />
<Route path="/about" element={<About />} />
</Route>
</Routes>
);
}
export default App;
工作原理
- 路由配置:在
Routes中,父路由的element设置为Layout组件,子路由(如/home和/about)嵌套在父路由中。 - Outlet 渲染:当 URL 匹配到子路由(比如
/home),Outlet会渲染对应的子路由组件(Home)。如果 URL 匹配到/about,Outlet渲染About组件。 - 布局保留:
Layout组件中的导航栏等内容始终保留,只有Outlet的内容会根据子路由动态变化。
注意事项
- React Router v6 专属:
Outlet是 React Router v6 引入的,v5 及以下版本没有这个组件。 - 必须在父路由中使用:
Outlet只有在嵌套路由的上下文中才会生效,直接在非路由组件中使用不会渲染任何内容。 - 动态上下文:可以通过
useOutletContext钩子在父路由中向子路由传递数据。例如:// 父路由 function Layout() { const value = "Hello from parent"; return ( <div> <Outlet context={{ value }} /> </div> ); } // 子路由 function Child() { const { value } = useOutletContext(); return <p>{value}</p>; }
总结
Outlet 是 React Router v6 中用于嵌套路由渲染的核心组件,简化了布局和子路由内容的动态管理。它让开发者能够轻松实现共享布局,同时保持子路由的灵活性。通过结合 useOutletContext,还可以实现父子路由间的数据传递,非常适合构建复杂的单页应用(SPA)。
如果你有更具体的问题或需要更详细的示例,请告诉我!
前端工程师、程序员

浙公网安备 33010602011771号