next项目如何实现不同页面使用不同的布局结构,比如login不使用全局的layout

122 阅读2分钟

大家好,我是1024小神,技术群 / 私活群 / 股票群 或 交朋友 都可以私信我。 如果你觉得本文有用,一键三连 (点赞、评论、关注),就是对我最大的支持~

在目前常见的中后台管理系统中,比较常见的是固定的布局方式包裹页面,但一些特殊页面,比如:登录页面注册页面忘记密码页面这些页面是不需要布局包裹的。next默认在app目录有一个全局的layout布局文件,所有的页面都会被这个布局包裹,然后展示,其中详细的原理可以看官网介绍:nextjs.org/docs/app/ge…

但是实际情况就有可能主页面和大部分页面都带有全局的头部组建:

但是登陆页或个人中心等页面的布局是不一样的,或者甚至没有头部组建:

我们希望这些特殊页面不需要父级 layout 包裹,那这个问题该怎么去解决呢?

解决方案大概有三个

1.如果你不嫌麻烦,RootLayout 根布局留空,然后在需要的页面下都新建一个 layout.tsx 文件。

这种方式相当麻烦,每个页面都要单独搞一个布局文件,很繁琐,不推荐

app/
 ├─ layout.tsx        // 全局 layout,里面只有空白的html和body
 ├─ page.tsx          // 首页
 └─ login/
     └─ page.tsx      // 登录页
     └─ layout.tsx.   // 登陆页布局

2.使用独立的路由分组,比如空白布局单独一个路由布局,通用的路由单独一个路由布局

这种方式结构目录应该是比较清晰的,就是把不同的页面结构进行了分组,然后根据不同的分组展示不同的布局结构。我更推荐使用这种方式,我的项目就是这样。

app/
 ├─ (main)/
 │   ├─ layout.tsx  // 主站 layout
 │   ├─ page.tsx
 │   └─ dashboard/page.tsx
 └─ (auth)/
     ├─ page.tsx   // 登陆页
     └─ layout.tsx// 另外一个分组的布局

3.条件判断式 layout,根据路由地址,在布局结构中动态判断要展示哪些布局组建

这种就是在根布局中,通过判断路由路径,来动态控制展示哪些布局组建,相当于条件判断。也不推荐使用,因为每次路由跳转,都需要动态判断一次,会影响网站性能

// app/layout.tsx
import { usePathname } from 'next/navigation'

export default function RootLayout({ children }: { children: React.ReactNode }) {
  const pathname = usePathname()
  const isLogin = pathname === '/login'

  return (
    <html lang="en">
      <body>
        {!isLogin && <Header />}
        {children}
        {!isLogin && <Footer />}
      </body>
    </html>
  )
}

大家好,我是1024小神,技术群 / 私活群 / 股票群 或 交朋友 都可以私信我。 如果你觉得本文有用,一键三连 (点赞、评论、关注),就是对我最大的支持~