Layouts and templates help organize pages in a web app. They make your site look consistent and easier to build.
Layout vs template difference in NextJS
export default function Layout({ children }) { return ( <html> <body> <header>Site Header</header> {children} <footer>Site Footer</footer> </body> </html> ) } function Template() { return ( <div> <h1>Page Title</h1> <p>Page content here</p> </div> ) }
Layout wraps pages and adds common parts like header and footer.
Template is the page content inside the layout.
export default function Layout({ children }) { return ( <div> <nav>Menu</nav> {children} <footer>Footer info</footer> </div> ) }
export default function Template() { return ( <main> <h2>Welcome!</h2> <p>This is the home page.</p> </main> ) }
This example shows a Layout component that adds a header and footer around the page content. The Template component is the actual page content inside the layout. The Page component combines them to render a full page.
import React from 'react'; function Layout({ children }) { return ( <html lang="en"> <body> <header style={{backgroundColor: '#eee', padding: '1rem'}}> <h1>My Website</h1> </header> <main>{children}</main> <footer style={{backgroundColor: '#eee', padding: '1rem', marginTop: '2rem'}}> <p>Ā© 2024 My Website</p> </footer> </body> </html> ); } function Template() { return ( <section> <h2>About Us</h2> <p>We build simple and clear websites.</p> </section> ); } export default function Page() { return ( <Layout> <Template /> </Layout> ); }
Layouts wrap around templates to keep site design consistent.
Templates hold the unique content for each page.
Using layouts and templates helps you avoid repeating code.
Layouts provide the common page structure like headers and footers.
Templates are the unique content inside layouts.
Together, they make building and maintaining pages easier and cleaner.
Practice
layout component?Solution
Step 1: Understand layout purpose
Layouts in Next.js wrap pages to provide shared UI elements like headers and footers.Step 2: Differentiate from templates
Templates hold unique page content, not common structure.Final Answer:
To provide common page structure like headers and footers -> Option BQuick Check:
Layout = common structure [OK]
- Confusing layouts with templates
- Thinking layouts handle data fetching
- Assuming layouts manage state
Solution
Step 1: Check export and props
Layouts must be default exported and receivechildrenprop to wrap page content.Step 2: Validate syntax
export default function Layout({ children }) { return{children} } correctly exports a function with{ children }and returns JSX wrapping children.Final Answer:
export default function Layout({ children }) { return <div>{children}</div> } -> Option AQuick Check:
Default export + children prop = export default function Layout({ children }) { return{children}} [OK]
- Not exporting default
- Missing children prop
- Using lowercase function name for layout
export default function Layout({ children }) {
return (
<html>
<body>
<header>Site Header</header>
{children}
<footer>Site Footer</footer>
</body>
</html>
)
}And a page component:
export default function Page() {
return <main>Welcome!</main>
}What will be the rendered HTML structure?
Solution
Step 1: Understand layout wrapping
The layout wraps the page content inside <html> and <body> tags, adding header and footer around children.Step 2: Insert page content
The page returns <main>Welcome!</main>, which is placed where {children} is in layout.Final Answer:
<html><body><header>Site Header</header><main>Welcome!</main><footer>Site Footer</footer></body></html> -> Option AQuick Check:
Layout wraps page content with header/footer [OK]
- Ignoring layout wrapping
- Thinking page replaces entire layout
- Missing header or footer in output
export default function Layout() {
return (
<div>
<header>Header</header>
{children}
<footer>Footer</footer>
</div>
)
}But the page content does not render inside the layout. What is the problem?
Solution
Step 1: Check function parameters
The layout must accept{ children }as a parameter to render page content inside.Step 2: Identify missing children prop
The code misses{ children }in the function signature, so it cannot render page content.Final Answer:
The layout function does not accept the children prop -> Option CQuick Check:
Missing children prop causes no page content [OK]
- Forgetting to add children parameter
- Thinking header/footer cause error
- Believing layouts must be class components
Solution
Step 1: Identify shared and conditional UI
The header is shared by all pages, so it belongs in the main layout. Sidebar is conditional, so it fits in nested layouts.Step 2: Use nested layouts
Create a main layout with header, then nest layouts for pages needing sidebar to add it without affecting others.Final Answer:
Create a main layout with header, then nested layouts for pages with sidebar -> Option DQuick Check:
Nested layouts handle conditional UI [OK]
- Putting all UI in one layout causing unwanted sidebar
- Adding sidebar directly in pages losing layout benefits
- Avoiding layouts and mixing shared UI in templates
Ready to prove it?
Pass the test and this pattern moves unknown
