Ya, Server Component boleh import Client Component secara langsung di App Router Next.js. Kamu tidak perlu dynamic import atau API tambahan. File dengan use client otomatis jadi batas client boundary, kode interaktifnya jalan di browser sementara induknya tetap dirender di server.
Contoh umum: page.tsx sebagai Server Component me-render SearchBar yang memakai useState dan onChange.
Jawaban Cepat: Pola Import yang Benar
Import berjalan satu arah. Server mengimpor client, bukan sebaliknya untuk logika server.
- Server Component mengimpor Client Component seperti komponen React biasa.
- Semua isi file
use clientbeserta imporannya ikut terkirim ke client. - Event handler,
useState, danuseEffecthanya hidup di dalam file client tersebut.
Langkah Import Client Component ke Server
Kesalahan paling sering: lupa menulis use client di baris pertama file anak, lalu memanggil hook dari Server Component.
- Buat file Client Component dan tulis
use clientdi baris paling atas. - Import komponen itu di Server Component seperti biasa.
- Kirim hanya props yang serializable, seperti string, number, boolean, array, dan object polos.
- Jalankan aplikasi dan cek error hidrasi bila tampilan server dan client berbeda.
// components/SearchBar.tsx
'use client';
import { useState } from 'react';
export default function SearchBar({ placeholder }: { placeholder: string }) {
const [query, setQuery] = useState('');
return (
<input
value={query}
onChange={(e) => setQuery(e.target.value)}
placeholder={placeholder}
/>
);
}
// app/page.tsx
import SearchBar from '../components/SearchBar';
export default function Page() {
return (
<main>
<h1>Katalog</h1>
<SearchBar placeholder="Cari produk..." />
</main>
);
}
Batasan Props dan Composition
- Props yang dikirim dari server ke client harus serializable. Function, Date khusus, class instance, atau object non-plain tidak bisa lewat batas ini.
- Untuk menyisipkan Server Component ke dalam Client Component, kirim lewat
children, bukan import langsung di file client. - Semua
onClick,onChange, hook, dan akseswindowharus tetap di fileuse client.
Masalah | Penyebab | Solusi
| Masalah | Penyebab | Solusi |
|---|---|---|
| Client Component dibuat async | Komponen client tidak mendukung async langsung | Pindahkan fetch ke Server induk, kirim datanya sebagai props |
| Props function hilang | Function tidak bisa diserialisasi melewati boundary | Pindahkan handler ke file client atau pakai Server Action |
useState error di server |
Hook dipanggil di Server Component | Pindahkan state ke file use client terpisah |
FAQ
Apakah Server Component bisa import Client Component langsung?
Ya, import langsung didukung dan ini pola resmi di App Router.
Kenapa function tidak bisa dikirim sebagai props?
Batas server ke client memakai serialisasi, sehingga function tidak bisa dipertahankan bentuknya.
Bagaimana jika Client Component butuh Server Component di dalamnya?
Kirim Server Component tersebut dari induk server melalui props children.