Server State vs Client State
Membedakan data yang sumber kebenarannya berada di server dari state UI sementara yang hanya hidup di browser.
Tujuan belajar
- Menjelaskan perbedaan server state dan client state
- Mengidentifikasi sumber kebenaran untuk data produk yang umum
- Memisahkan data hasil request dari pilihan UI sementara
- Memilih solusi sederhana sebelum memakai query library
Isi lesson
6 blok- 1.Tanyakan siapa yang memiliki sumber kebenaranBelum selesaiWajib
- 2.Catalog course memiliki dua jenis stateBelum selesaiWajib
- 3.Coding practiceBelum selesaiWajib
- 4.Cek pemahamanBelum selesaiWajib
- 5.Jangan menyebut semua data API sebagai state lokalBelum selesaiWajib
- 6.RingkasanBelum selesaiWajib
Tanyakan siapa yang memiliki sumber kebenaran
WajibServer state adalah data yang datang dari luar UI dan sumber kebenarannya bukan component saat ini: daftar lesson dari API, profile tersimpan, status bookmark, atau hasil pencarian dari server. Data ini dapat berubah karena user lain, request lain, atau aturan server. Client state adalah state yang hanya mengatur pengalaman UI saat ini, misalnya modal terbuka, tab aktif, nilai filter sementara, atau field yang sedang difokuskan.
Keduanya dapat muncul dalam satu feature. Halaman catalog course dapat menerima daftar course dari server, sementara input pencarian dan dialog detail hidup sebagai client state. Jangan memaksa semua state masuk ke satu useState hanya karena tampil bersama. Pisahkan berdasarkan kepemilikan dan lifecycle agar saat request, refresh, atau mutation terjadi, kamu tahu data mana yang harus dipercaya.
Bagian ini memengaruhi progres lesson.
Catalog course memiliki dua jenis state
Wajibimport { useState } from "react";
type Course = {
id: string;
title: string;
isBookmarked: boolean;
};
type CatalogProps = {
courses: Course[];
};
export function CourseCatalog({ courses }: CatalogProps) {
const [query, setQuery] = useState("");
const [isFilterOpen, setIsFilterOpen] = useState(false);
const visibleCourses = courses.filter((course) =>
course.title.toLowerCase().includes(query.toLowerCase()),
);
return (
<section>
<button type="button" onClick={() => setIsFilterOpen(true)}>
Buka filter
</button>
<input
aria-label="Cari course"
value={query}
onChange={(event) => setQuery(event.target.value)}
/>
{isFilterOpen ? <p>Filter sedang dibuka.</p> : null}
<p>{visibleCourses.length} course terlihat.</p>
</section>
);
}courses dan isBookmarked berasal dari data yang pada akhirnya harus dikonfirmasi server. query serta isFilterOpen hanya mengatur tampilan catalog saat ini. Filter boleh menghitung visibleCourses di client, tetapi jangan menganggap hasil filter sebagai data server baru. Saat API berubah atau data di-refresh, source courses dapat diganti tanpa perlu mereset modal atau input secara sembarangan.
Bagian ini memengaruhi progres lesson.
Coding practice
WajibDibuka di workspace khususClassify course server and client state
Klasifikasikan data catalog berdasarkan sumber kebenarannya agar data server dan pilihan UI tidak tercampur. Preview tidak mengambil data API.
Tujuan awal: Fokus di tab TSX.
Practice ini dibuka di workspace khusus. Buka practice untuk memakai editor, preview, dan cek otomatis.
Tombol selesai aktif setelah semua validasi wajib lolos.
Cek pemahaman
WajibJawab duluCek pemahaman singkat
Manakah contoh yang paling tepat disebut client state pada halaman daftar course?
Progres lesson naik setelah jawaban benar.
Kesalahan umum
WajibJangan menyebut semua data API sebagai state lokal
Menyalin response API ke useState kadang diperlukan untuk interaksi sementara, tetapi itu tidak memindahkan sumber kebenaran ke browser. Tetapkan kapan data harus di-fetch ulang atau dikonfirmasi setelah mutation. Untuk feature kecil, fetch sederhana dan state yang eksplisit sering cukup. Query library membantu ketika kebutuhan cache, deduplication, mutation, atau refresh sudah benar-benar berulang.
Bagian ini memengaruhi progres lesson.
Ringkasan
Wajib- Server state berasal dari sumber eksternal dan dapat berubah di luar component saat ini.
- Client state mengatur interaksi serta tampilan sementara di browser user.
- Satu feature dapat memiliki keduanya tanpa perlu mencampur tanggung jawabnya.
- Pilih state dan tooling berdasarkan kepemilikan data, bukan hanya lokasi render-nya.
- Berikutnya, data server membutuhkan loading, error, empty, dan success state yang jujur.
Bagian ini memengaruhi progres lesson.
Langkah berikutnya
Selesaikan bagian penting lesson ini
Lanjutkan blok wajib berikutnya: Tanyakan siapa yang memiliki sumber kebenaran.