Buat file bernama template.tsx di dalam folder segmen yang ingin di-reset, lalu export komponen default yang menerima children. Next.js akan membuat instance baru setiap kali pengguna pindah route seinduk, sehingga state lama tidak terbawa. Ini langkah yang paling sering terlewat: banyak yang mengedit layout.tsx lalu heran kenapa input form atau animasi tidak mulai dari awal.
Jawaban Cepat: template.tsx Bukan layout.tsx
Simpan template.tsx sedekat mungkin dengan segmen yang bermasalah, misalnya app/dashboard/template.tsx. Struktur minimalnya sama seperti layout, hanya perilakunya berbeda saat navigasi.
export default function Template({ children }: { children: React.ReactNode }) {
return <div>{children}</div>;
}
- Gunakan
template.tsxbila tiap halaman butuh remount. - Tambahkan
"use client"hanya bila memakaiuseState,useEffect, atau event browser. - Biarkan sebagai Server Component bila hanya membungkus markup.
Langkah Membuat template.tsx di App Router
Ikuti urutan ini agar tidak tertukar dengan layout bersarang.
- Tentukan folder segmen tujuan di dalam
app, contohapp/checkout/. - Buat file
template.tsxdengan struktur minimal seperti contoh di atas. - Atur
children, state lokal, atau animasi masuk bila diperlukan. - Uji navigasi antar route seinduk, misalnya
/checkout/alamatke/checkout/bayar, lalu pastikan input dan fokus kembali ke awal.
Perbedaan Template dan Layout yang Sering Tertukar
Layout mempertahankan instance antar navigasi. Template menghancurkannya lalu membuat yang baru. Dampaknya terasa pada form wizard, tab, dan animasi transisi.
- Gunakan template untuk animasi masuk, form wizard, atau reset fokus.
- Gunakan layout untuk sidebar, navbar, dan state persisten seperti menu aktif.
- Jangan membungkus root
app/template.tsxkecuali semua halaman memang harus reset.
| Perilaku | Layout | Template |
|---|---|---|
| State saat navigasi | Dipertahankan | Dibuat ulang |
| Efek dan animasi | Tidak jalan ulang | Jalan ulang |
| Cocok untuk | Navbar, sidebar | Wizard, transisi |
Kesalahan Umum dan Cara Memperbaikinya
- Hook browser di Server Component: pindahkan
useStateatauwindowke Client Component terpisah. - Template di semua segmen tanpa alasan: batasi ke segmen yang memang butuh remount agar cache dan interaksi tetap hemat.
- Lupa validasi data dinamis di dalam template: validasi tetap di server atau Server Action, bukan hanya di input client.
FAQ
Apakah template.tsx bisa bersarang bersama layout?
Ya, setiap level template akan remount mengikuti segmen aktifnya.
Kapan memakai template dibanding loading.tsx?
Pakai template untuk reset UI saat navigasi, pakai loading.tsx untuk fallback selama data dimuat.
Apakah template harus Client Component?
Tidak, jadikan client hanya bila memakai state, efek, atau API browser.