Buat komponennya async lalu panggil await fetch() langsung di body Server Component. Itu cara menggunakan async Server Component Next.js untuk fetch data di App Router, tanpa useEffect dan tanpa use client.
Bentuk Async yang Valid di App Router
Fungsi komponen async hanya berlaku untuk Server Component. Bentuk paling umum yaitu export default async function Page().
Di dalamnya kamu bisa menunggu fetch API atau query database sebelum JSX dirender di server.
export default async function Page() {
const res = await fetch("https://api.example.com/posts");
const posts = await res.json();
return (
<ul>
{posts.map((post) => (
<li key={post.id}>{post.title}</li>
))}
</ul>
);
}
File di atas tidak memakai use client, hook, atau browser API.
Langkah Fetch Data dengan Async Server Component
1. Buat file page.tsx sebagai Server Component async.
2. Tunggu data di server dengan await, lalu render JSX dari hasilnya.
3. Teruskan data yang sudah siap render sebagai props ke Client Component untuk bagian interaktif.
- Jangan pakai
useStateatauuseEffectdi file async. - Jangan menulis event handler seperti
onClickdi komponen async. - Jangan mengakses
window,document, ataulocalStoragedi sana. - Pindahkan tombol, form, dan state ke Client Component terpisah.
Batasan Async dan Pola yang Benar
| Pola | Status | Catatan |
|---|---|---|
| async Page | Valid | Pola utama untuk fetch data halaman |
| async layout bersyarat | Terbatas | Hindari bila membuat layout ikut dinamis |
| async Client Component | Dilarang | Client Component harus fungsi sync |
Client Component tetap sync dan menerima data lewat props. Logika klik, form, dan state tinggal di sana.
Untuk dua fetch yang tidak saling tergantung, jalankan paralel dengan Promise.all. Tangani kegagalan render dengan file error.js di folder route yang sama.
FAQ
Apakah semua Server Component harus async?
Tidak. Buat async hanya bila komponen tersebut memakai await di dalamnya.
Mengapa async Client Component error?
Karena Client Component harus sync, jadi pindahkan logika async ke effect, event handler, atau Server Component.
Di mana validasi data async?
Validasi di server sebelum render dan jangan hanya mengandalkan validasi client.