Layout: Template Bersama Antar Halaman
Memahami layout.tsx, nested layout, dan kenapa layout tidak re-render saat pindah halaman.
Apa itu layout?
Layout adalah template yang membungkus halaman. Navbar dan footer yang muncul di semua halaman adalah contoh klasik. Di Next.js, file app/layout.tsx adalah root layout yang wajib ada:
// app/layout.tsx
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="id">
<body>
<nav>Navbar selalu tampil</nav>
{children}
<footer>Footer selalu tampil</footer>
</body>
</html>
);
}children akan diisi halaman yang sedang dibuka (atau layout di bawahnya).
Nested layout
Setiap folder bisa punya layout.tsx sendiri. Layout ini membungkus semua halaman di folder tersebut:
app/
├── layout.tsx # root: navbar + footer
└── dashboard/
├── layout.tsx # tambah sidebar khusus dashboard
└── page.tsx → /dashboard
Halaman /dashboard akan dibungkus sidebar layout dulu, lalu root layout. Hasilnya tersarang rapi.
Keunggulan: tidak re-render
Saat pindah dari /dashboard ke /dashboard/profil, layout yang sama tidak di-render ulang. State di layout (misal menu sidebar yang terbuka) tetap terjaga. Ini beda dengan pola lama yang me-render ulang seluruh halaman setiap navigasi.
Template vs layout
Butuh perilaku sebaliknya, yaitu me-render ulang setiap navigasi (misal animasi masuk tiap halaman)? Pakai template.tsx. Namanya mirip, perilakunya kebalikan dari layout.
Kesalahan umum pemula
- Lupa tag
<html>dan<body>di root layout. Ini wajib dan error-nya muncul saat build. Layout anak tidak boleh menambah tag ini lagi. - Menaruh
"use client"di root layout. Akibatnya seluruh aplikasi jadi Client Component dan keuntungan Server Component hilang. - Menyimpan state halaman di layout. Layout tidak re-render saat navigasi, jadi state form yang disimpan di layout akan terbawa ke halaman lain. Simpan state di halaman atau komponennya.
Latihan singkat
- Buat nested layout di
app/blog/layout.tsxyang menambah judul "Blog" di atas setiap artikel. - Pindah dari
/blog/ake/blog/b(buat dua artikel dummy) dan perhatikan layout tidak berkedip atau re-render.
Rangkuman
layout.tsxmembungkus halaman dengan template bersama seperti navbar dan footer.app/layout.tsxadalah root layout wajib dengan tag<html>dan<body>.- Layout bersarang (nested) dan tidak re-render saat navigasi di segmen yang sama.
- Butuh re-render tiap navigasi? Pakai
template.tsx.
Catatan teknis: Root layout wajib me-render tag
<html>dan<body>. Kalau lupa, Next.js akan error saat build. Layout di bawah root tidak boleh menambah<html>lagi.