Search code examples
javascriptnext.jsserver-side-rendering

Nextjs pages in folder share container


Is there any way to make all the pages in a folder share a container in NextJS?

I imagine it'd look something like this:

// pages/folder/index.js
export default function Container({ children }) {
    return <Container>{children}</Container>
}

// pages/folder/child.js
export default function Child() {
    return <Child />
}

Solution

  • I believe what you're looking for is Layouts.

    // components/layout.js
    
    import Navbar from './navbar'
    import Footer from './footer'
    
    export default function Layout({ children }) {
      return (
        <>
          <Navbar />
          <main>{children}</main>
          <Footer />
        </>
      )
    }
    

    Single Shared Layout with Custom App

    // pages/_app.js
    
    import Layout from '../components/layout'
    
    export default function MyApp({ Component, pageProps }) {
      return (
        <Layout>
          <Component {...pageProps} />
        </Layout>
      )
    }
    
    

    Per-Page Layouts

    // pages/index.js
    
    import Layout from '../components/layout'
    import NestedLayout from '../components/nested-layout'
    
    export default function Page() {
      return (
        /** Your content */
      )
    }
    
    Page.getLayout = function getLayout(page) {
      return (
        <Layout>
          <NestedLayout>{page}</NestedLayout>
        </Layout>
      )
    }
    
    // pages/_app.js
    
    export default function MyApp({ Component, pageProps }) {
      // Use the layout defined at the page level, if available
      const getLayout = Component.getLayout || ((page) => page)
    
      return getLayout(<Component {...pageProps} />)
    }