reactjs 如何将NextJS应用程序的根目录布局与帐户布局分开?

lrpiutwd  于 2023-10-17  发布在  React
关注(0)|答案(2)|浏览(176)

我正在尝试构建一个NextJS(APP ROUTING)Web应用程序,其中包含两个部分:
1.网站
1.账户
我想让用户通过域访问受限帐户部分。tld/帐户,而该网站的生活在域。tld
问题:在根布局中声明了一个navbar组件,如下所示:

export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <html lang="en">
      <body className={poppins.className}>
        <Navbar />
        {children}
      </body>
    </html>
  );
}

应用目录中的所有页面组件都共享上述布局。这里是我的/帐户页面组件:

export default async function Account() {
  return (
    <>
      <p>My Account</p>
    </>
  );
}

这将返回我不想在帐户部分的web导航栏组件。我如何将根布局分离为web,并为帐户或管理员提供不同的子布局?

34gzjxbg

34gzjxbg1#

有两种方法可以显示除/account路由及其子路由之外的所有路径的导航栏。选择正确的一个取决于你的结构的其余部分。
1.一般来说,你可以从根布局中删除<Navbar />,并将其放置在/foo/layout.tsx中,以确保只有/foo和所有子路由显示导航栏,而/account不显示。
1.否则,特别是当它是根级别的区别时,您必须使用所谓的route groups,这是文件夹和路径的逻辑分离,不会直接影响路由。路由组由名称类似于(groupname)的文件夹表示。在你的例子中,你应该声明如下结构:

app/
├─ (group1)/
│  ├─ account/
│  │  ├─ page.tsx
│  ├─ layout.tsx
├─ (group2)/
│  ├─ page.tsx
│  ├─ layout.tsx
├─ layout.tsx

在这个例子中,你仍然有一个位于app/layout.tsx的根布局,它定义了所有路径的根布局,同时可以将你的<Navbar />添加到app/(group1)/layout.tsx(根据你的需要命名组),这将只应用于(group1)路由组中的所有路径,包括/account路径。
我还没有测试过它,但是如果你的(group1)只包含/account路由,我认为你甚至可以简化它如下:

app/
├─ account/
│  ├─ page.tsx
│  ├─ layout.tsx
├─ (main)/
│  ├─ page.tsx
│  ├─ layout.tsx
├─ layout.tsx
iyr7buue

iyr7buue2#

我在我的nextjs应用程序中这样做了,它工作正常。

import Layout from '../components/Layout'
import { useRouter } from 'next/router'
import { SessionProvider } from "next-auth/react"

export default function App({Component,pageProps: { session, ...pageProps }}) {

  const router = useRouter()

  if (router.pathname.includes('/account')) { //if the pathname include account no layout 
    return (
      <SessionProvider session={session}>
            <Component {...pageProps} theme={useTheme}/>
      </SessionProvider>
    )
  }

  return ( //here there is layout 
    <SessionProvider session={session}>
        <Layout setThemeChanged={setThemeChanged}> 
            <Component {...pageProps} theme={useTheme} />
        </Layout>
    </SessionProvider>
  )
}

相关问题