/[appId]/layout.tsx
中的 [appId]
代表 动态路由(Dynamic Route Segment),用于匹配 URL 中的变量部分。在 Next.js 13+ App Router 里,它的作用类似于 占位符,用于创建动态路径。
1. [appId]
是什么?
在 Next.js App Router(app/
目录)中,[变量名]
代表动态路由,用于匹配 URL 中的动态部分。
示例:
假设你的 app/
目录结构如下:
app/
├── [appId]/
│ ├── layout.tsx // 作用于所有 /123 /456 这样的路径
│ ├── page.tsx // 访问 /123 时渲染这个文件
│ ├── settings/
│ │ ├── page.tsx // 访问 /123/settings
如果用户访问:
/123
→ 匹配app/[appId]/page.tsx
,appId="123"
/456/settings
→ 匹配app/[appId]/settings/page.tsx
,appId="456"
appId
的值由 URL 决定,可以在 page.tsx
和 layout.tsx
中通过 params
获取。
2. [appId]/layout.tsx
的作用
如果 layout.tsx
在 [appId]
目录下,它会作用于所有 /[appId]/*
相关的页面,让这些页面共享相同的布局。
示例:app/[appId]/layout.tsx
export default function AppLayout({ children, params }: { children: React.ReactNode, params: { appId: string } }) {
return (
<div>
<h1>当前 App ID: {params.appId}</h1>
<main>{children}</main>
</div>
);
}
app/[appId]/page.tsx
export default function AppPage({ params }: { params: { appId: string } }) {
return <h2>这是 App ID {params.appId} 的页面</h2>;
}
访问 /123
页面时:
<h1>当前 App ID: 123</h1>
<h2>这是 App ID 123 的页面</h2>
访问 /456/settings
页面时:
<h1>当前 App ID: 456</h1>
<h2>这是 App ID 456 的设置页面</h2>
layout.tsx 作用于所有 /[appId]/*
页面,让它们共享 App ID
相关的布局!
3. [appId]
和 (group)
的区别
特性 | [appId] |
(group) |
---|---|---|
是否影响 URL | ✅ 是,[appId] 代表 URL 变量 |
❌ 否,(group) 只是文件组织 |
是否创建动态页面 | ✅ 是,比如 /123 , /456 |
❌ 否,(commonLayout) 只是用于布局 |
是否能访问 params.appId |
✅ 可以获取 | ❌ 没有 params |
适用于 | 需要基于 URL 变化的页面 | 仅仅是代码管理,URL 结构不变 |
4. 结论
[appId]
是动态路由,会匹配/123
、/456
这样的路径,并让params.appId
代表不同的 ID。[appId]/layout.tsx
让/123/*
、/456/*
等页面共享相同的布局,比如显示App ID
。- 和
(group)
不同,[appId]
会影响 URL 结构,适用于需要基于参数切换页面的情况。
Next.js 这种 app/
目录结构让动态路由+布局变得更强大!