template.js
A template file is similar to a layout in that it wraps a layout or page. Unlike layouts that persist across routes and maintain state, templates are given a unique key, meaning children Client Components reset their state on navigation.
They are useful when you need to:
- Resynchronize
useEffect
on navigation. - Reset the state of a child Client Components on navigation. For example, an input field.
- To change default framework behavior. For example, Suspense boundaries inside layouts only show a fallback on first load, while templates show it on every navigation.
Convention
A template can be defined by exporting a default React component from a template.js
file. The component should accept a children
prop.

app/template.tsx
export default function Template({ children }: { children: React.ReactNode }) {
return <div>{children}</div>
}
In terms of nesting, template.js
is rendered between a layout and its children. Here's a simplified output:
Output
<Layout>
{/* Note that the template is given a unique key. */}
<Template key={routeParam}>{children}</Template>
</Layout>
Props
children
(required)
Template accepts a children
prop.
Output
<Layout>
{/* Note that the template is automatically given a unique key. */}
<Template key={routeParam}>{children}</Template>
</Layout>
Behavior
- Server Components: By default, templates are Server Components.
- Remount on navigation: Templates receive a unique key automatically. Navigating to a new route causes the template and its children to remount.
- State reset: Any Client Component inside the template will reset its state on navigation.
- Effect re-run: Effects like
useEffect
will re-synchronize as the component remounts. - DOM reset: DOM elements inside the template are fully recreated.
Version History
Version | Changes |
---|---|
v13.0.0 | template introduced. |
Was this helpful?