核心概念
Next.js 组件与布局是构建现代 Web 应用的基础模块化单元。组件封装可复用的 UI 片段(如按钮、表单),布局则定义应用的共享结构(如导航栏、页脚)。通过组合使用,开发者可以像搭积木一样构建复杂界面,同时确保样式和功能的统一性。
基础语法
页面组件
// pages/index.tsx
export default function Home() {
return (
<main>
<h1>首页</h1>
<p>欢迎访问我的 Next.js 应用</p>
</main>
)
}
页面组件直接定义路由路径,组件内容对应页面渲染
全局布局
// components/Layout.tsx
function Layout({ children }) {
return (
<div>
<header>全局导航栏</header>
<div>{children}</div>
<footer>统一页脚</footer>
</div>
)
}
export default Layout
通过 children prop 实现内容注入,保持布局结构一致性
嵌套布局
// app/dashboard/layout.tsx
export default function DashboardLayout({ children }) {
return (
<div>
<nav>仪表盘专用导航</nav>
<section>{children}</section>
</div>
)
}
Next.js 13+ 的 app 目录结构支持嵌套布局,父级布局包裹子级组件
进阶特性
| 特性 | 说明 | 代码示例 |
|---|---|---|
| 布局嵌套 | 支持多级布局结构 |
// app/layout.tsx
export default function RootLayout({ children }) {
return (
<html>
<body>
<Layout>{children}</Layout>
</body>
</html>
)
}
``` |
| 动态布局 | 根据路由参数切换布局 |
```tsx
// app/[slug]/layout.tsx
export default function DynamicLayout({ children, params }) {
return (
<div>
<h2>{params.slug} 页面</h2>
{children}
</div>
)
}
``` |
| Server Components | 布局组件支持服务端渲染 |
```tsx
// app/layout.tsx
"use server"
export default function ServerLayout({ children }) {
return <div>{children}</div>
}
``` |
## 实战应用
### 仪表盘页面布局
```tsx
// app/dashboard/page.tsx
import DashboardLayout from '@/components/DashboardLayout'
export default function DashboardPage() {
return (
<DashboardLayout>
<div>数据看板内容</div>
<div>图表展示区域</div>
</DashboardLayout>
)
}
嵌套布局实现仪表盘专属结构,保持与全局布局的协同
电商产品页
// app/products/[id]/page.tsx
export default function ProductPage({ params }) {
return (
<div>
<h1>商品 {params.id}</h1>
<div>商品详情</div>
<div>用户评价</div>
</div>
)
}
动态路由参数自动匹配对应布局,实现个性化页面
注意事项
- 组件职责分离:避免将布局组件与页面组件混用。布局应专注于结构定义,页面组件负责具体业务逻辑
- 过度嵌套风险:超过 3 层嵌套布局时,考虑使用组合式设计。例如:
// 优化前
<RootLayout>
<DashboardLayout>
<ProductLayout>
<PageContent />
</ProductLayout>
</DashboardLayout>
</RootLayout>
// 优化后
<RootLayout>
<DashboardLayout>
<ProductLayout>
<PageContent />
</ProductLayout>
</DashboardLayout>
</RootLayout>
- 动态布局性能:使用
next/dynamic加载非关键布局组件:
import dynamic from 'next/dynamic'
const Sidebar = dynamic(() => import('@/components/Sidebar'), {
loading: () => <div>加载中...</div>
})
总结
Next.js 组件与布局机制通过模块化设计和嵌套结构,实现了可维护的复杂界面构建模式,是现代 React 项目开发的核心实践。