No — layouts in the App Router do NOT re-render when their child route changes. This is one of the most important performance advantages of the App Router over the Pages Router. Layouts are preserved across navigations, meaning only the part of the UI that actually changed is re-rendered.
In the Pages Router, every route change caused the entire page — including shared UI like headers, sidebars and navbars — to unmount and remount. The App Router solves this with Partial Rendering. When you navigate between routes that share a layout, only the segment below the shared layout re-renders. The layout itself stays mounted, preserving its state, scroll position, and avoiding unnecessary re-fetches.
Next.js identifies the shared layout between the current and target route
Only the route segments below the shared layout are re-rendered
The shared layout stays mounted — it is NOT unmounted and remounted
Layout state (useState, scroll position, form input) is preserved across navigations
Layout data fetching does NOT re-run on child route changes
React Server Components diffing ensures only changed segments are updated in the DOM
Pages Router — _app.jsx re-renders on EVERY route change including shared UI
Pages Router — no built-in nested layouts, must be manually implemented
Pages Router — layout state resets on every navigation
App Router — layouts are preserved across child route navigations
App Router — nested layouts each preserve independently at their own segment level
App Router — only the changed route segment re-renders (Partial Rendering)
App Router — layout data fetching does not re-run on child navigations
Layouts do NOT re-render when child routes change — this is by design for performance
Only the route segment that changed is re-rendered — called Partial Rendering
Layout state (useState, scroll, form values) is preserved across child navigations
Use template.jsx instead of layout.jsx when you explicitly need re-mount on every navigation
Layout data fetching runs once — use router.refresh() or revalidatePath() to update it after mutations
usePathname in a layout updates reactively without triggering a full layout re-render
Layouts re-render only when you enter or leave their own route segment — not their children