Nested routes and layouts help organize your app by showing parts inside other parts. This makes your pages load faster and keeps your code clean.
Nested routes and layouts in Remix
app/
├── root.tsx // Root layout (wraps all routes)
└── routes/
├── index.tsx // / (home)
├── about.tsx // /about
└── dashboard/
├── layout.tsx // Nested layout inside dashboard
├── index.tsx // Dashboard home
└── settings.tsx // Dashboard settingsEach folder or file under app/routes becomes a route.
Files named layout.tsx define layouts that wrap child routes.
// app/root.tsx import { Outlet } from '@remix-run/react'; export default function RootLayout() { return ( <html lang="en"> <head> <title>My Remix App</title> </head> <body> <header>My Site Header</header> <main> <Outlet /> </main> <footer>My Site Footer</footer> </body> </html> ); }
// app/routes/dashboard/layout.tsx import { Outlet } from '@remix-run/react'; export default function DashboardLayout() { return ( <div> <nav>Dashboard Menu</nav> <section> <Outlet /> </section> </div> ); }
// app/routes/dashboard/settings.tsx
export default function Settings() {
return <h2>Dashboard Settings Page</h2>;
}This example shows a main layout with header and footer. Inside the dashboard folder, a nested layout adds a sidebar menu. The dashboard home and settings pages appear inside that nested layout.
// app/root.tsx import { Outlet } from '@remix-run/react'; export default function RootLayout() { return ( <html lang="en"> <head> <title>My Remix App</title> </head> <body> <header style={{ padding: '1rem', backgroundColor: '#eee' }}> <h1>Site Header</h1> </header> <main style={{ padding: '1rem' }}> <Outlet /> </main> <footer style={{ padding: '1rem', backgroundColor: '#eee' }}> Site Footer </footer> </body> </html> ); } // app/routes/dashboard/layout.tsx import { Outlet } from '@remix-run/react'; export default function DashboardLayout() { return ( <div style={{ display: 'flex' }}> <nav style={{ width: '200px', backgroundColor: '#ddd', padding: '1rem' }}> <ul> <li>Dashboard Menu</li> <li>Settings</li> </ul> </nav> <section style={{ flex: 1, padding: '1rem' }}> <Outlet /> </section> </div> ); } // app/routes/dashboard/index.tsx export default function DashboardHome() { return <h2>Welcome to the Dashboard Home</h2>; } // app/routes/dashboard/settings.tsx export default function Settings() { return <h2>Dashboard Settings Page</h2>; }
Use the <Outlet /> component to show child routes inside a layout.
Layouts help keep parts like headers or menus from reloading when you switch pages inside them.
Nested routes match URLs by folder structure, so /dashboard/settings uses both the root and dashboard layouts.
Nested routes let you build pages inside pages for better structure.
Layouts wrap child routes and keep shared parts visible.
Use <Outlet /> to show nested content inside layouts.
Practice
Solution
Step 1: Understand nested routes concept
Nested routes allow you to build pages inside other pages, creating a clear hierarchy and structure.Step 2: Identify the main purpose
This helps keep your app organized and lets you reuse layouts and components easily.Final Answer:
To organize pages inside other pages for better structure -> Option CQuick Check:
Nested routes = organize pages [OK]
- Thinking nested routes are for styling
- Confusing nested routes with database connections
- Believing nested routes speed up script loading
Solution
Step 1: Recall the special component for nested routes
Remix uses<Outlet />to render child routes inside a parent layout.Step 2: Check the options
Only<Outlet />is the correct built-in component for this purpose.Final Answer:
<Outlet /> -> Option AQuick Check:
Nested content uses <Outlet /> [OK]
- Using custom tags instead of
- Forgetting to include in layouts
- Confusing with React children
/routes
├── layout.tsx
└── dashboard.tsx
└── dashboard/
└── settings.tsx
If layout.tsx contains a <Outlet />, what will happen when the user visits /dashboard/settings?Solution
Step 1: Analyze route nesting rules
In Remix, file and folder structures define nested routes by path prefixes.dashboard.tsxmatches/dashboardas parent,dashboard/settings.tsxmatches/dashboard/settingsas child.Step 2: Understand rendering hierarchy
layout.tsx(root layout) with<Outlet />wraps all routes.dashboard.tsxrenders inside layout's Outlet, containing settings via its own Outlet.Step 3: Result of visiting /dashboard/settings
Layout renders with nested dashboard + settings content inside.Final Answer:
The layout component renders and inside it the settings page content -> Option AQuick Check:
Layout <Outlet /> + nesting = settings inside [OK]
- Thinking file + folder structure causes 404
- Believing only settings renders without parents
- Expecting dashboard without child content
export default function Layout() {
return (
<div>
<header>Header</header>
<main>Content</main>
</div>
);
}
Why does the nested route content not appear inside this layout when visiting a nested page?Solution
Step 1: Check layout structure for nested content placeholder
The layout must include<Outlet />to render nested routes inside the layout.Step 2: Identify missing
Here, the layout only renders header and main with static content, no<Outlet /><Outlet />is present.Step 3: Effect of missing
Without<Outlet /><Outlet />, nested route content has no place to render, so it does not appear.Final Answer:
Because <Outlet /> is missing inside the layout component -> Option DQuick Check:
Missing <Outlet /> = no nested content [OK]
- Forgetting to add in layout
- Thinking export default affects nested rendering
- Assuming header blocks nested content
/routes
└── blog.tsx
└── blog/
├── layout.tsx
└── post.tsx
Which setup correctly shows the sidebar on all blog pages including individual posts?Solution
Step 1: Understand nested layout purpose
The sidebar should appear on all blog pages like /blog and /blog/post, so place it in the nested layout route.Step 2: Identify correct folder for nested layout
blog/layout.tsxis the nested layout wrapping all blog child routes includingpost.tsx.Step 3: Use
Add sidebar and<Outlet />in nested layout<Outlet />inblog/layout.tsxto render nested content alongside sidebar.blog.tsxis the parent route for /blog but does not wrap nested routes inside the folder.Final Answer:
Put the sidebar in blog/layout.tsx and use <Outlet /> there -> Option BQuick Check:
Nested layout blog/layout.tsx + <Outlet /> = shared sidebar [OK]
- Using blog.tsx (parent route) for nested layout
- Placing sidebar only in post.tsx
- Forgetting in nested layout
Ready to prove it?
Pass the test and this pattern moves unknown
