域名 AXUM.RS 将于 2025 年 10 月到期。我们无意再对其进行续费,如果你有意接续这个域名,请与我们取得联系。
  • AXUM.RS 现仅需人民币 3000 元(大写:叁仟元整。接受适度议价
  • 按照行业规则,AXUM.RS 到期后,大概率会进入长时间的赎回期,该期间内,如果你想拥有该域名,将要付出高额的费用
  • 我们已启用 AXUM.EU.ORG 域名,并将持续运营
  • 仅接受微信或支付宝交易
如果你对 AXUM.RS 有兴趣,请和我们进行联系:

布局

layout.js

在《约定即配置》章节里我们讲到,layout.js 是属于约定文件之一,它就是用来布局的。在创建完项目之后,默认会生成一个 app/layout.js文件,它是整个应用程序的全局布局文件,也称为*根布局(root layout)*文件。

App 路由中,每个路由都可以有自己的 layout.js,Next.js 的策略是:

  • 只需要定义 layout.js 即可,Next.js 会将路由组件(页面)做为布局组件的子组件进行自动调用
  • 每个层级的布局文件是层级调用的
  • 如果当前路由没有布局文件,那么它会往上级路由找,直到 app/layout.js

修改 app/layout.js

// app/layout.js

export default function RootLayout({ children }) {
  return (
    <html lang="zh-Hans">
      <body style={{ background: "#fecaca" }}>{children}</body>
    </html>
  );
}

现在访问任一页面,都会看到自动应用了这个样式,因为 Next.js 自动将页面作为布局组件的子组件进行调用。

news 添加布局

添加 news/layout.js

// app/news/layout.js

export default function NewsLayout({ children }) {
  return (
    <div style={{ background: "#ffedd5", padding: "10px" }}>{children}</div>
  );
}

代码很简单,使用 <div> 包裹,并添加了淡黄色背景,为了便于观察,我们还添加了填充。

现在分别访问 /news/news/123,你会惊奇地发现:

  • 自动使用了 app/news/layout.js 的布局
  • 同时,还使用了 app/layout.js 的布局
  • 并且,这两个布局形成了层级:即全局布局在外层,路由布局在内层

news/[id] 添加布局

// app/news/[id]/layout.js

export default function NewsDetailLayout({ children }) {
  return (
    <div style={{ background: "#cffafe", padding: "10px", margin: "20px" }}>
      {children}
    </div>
  );
}

这个布局的样式是淡青色的背景,现在分别访问

  • /news:和之前没变化,还是使用了 app/news/layout.jsapp/layout.js
  • /news/123:同时使用了 app/news/[id]/layout.jsapp/news/layout.jsapp/layout.js

最终效果:

本章代码位于02/布局分支。

要查看完整内容,请先登录