Todo App dengan Penyimpanan Permanen
Tugas tersimpan di localStorage sehingga tidak hilang saat halaman di-refresh.
Masalah: Data Hilang Saat Refresh
Todo app modul sebelumnya menyimpan tugas di variabel. Refresh halaman = variabel di-reset = semua tugas hilang. Pengguna nyata tidak akan memakai aplikasi yang "lupa ingatan" setiap dibuka.
Solusi: localStorage
localStorage adalah gudang kecil di browser (kapasitas sekitar 5MB) yang bertahan meski tab ditutup. Cara pakai:
- Simpan:
localStorage.setItem("todos", JSON.stringify(todos)) - Baca:
JSON.parse(localStorage.getItem("todos"))
Kenapa JSON? localStorage hanya menyimpan string. JSON.stringify mengubah array/object menjadi string, JSON.parse mengubah kembali. Ini pola wajib untuk menyimpan data terstruktur.
Langkah Membangun
Ambil kode todo sebelumnya, tambah dua hal:
- Saat aplikasi dibuka: baca localStorage. Kalau ada data tersimpan, pakai sebagai
todosawal. Bungkus dengan try-catch karena data bisa rusak. - Setiap ada perubahan (tambah/toggle/hapus): panggil
simpan()yang menulis ke localStorage. Paling mudah: panggil di akhirrender().
Tambahan fitur: tombol "Hapus yang selesai" dan edit tugas dengan klik dua kali (prompt sederhana).
Batasan localStorage
- Hanya string (harus JSON untuk object).
- Maksimal sekitar 5MB.
- Tidak aman untuk data sensitif (bisa dibaca siapa saja lewat DevTools).
- Berbeda per browser dan per domain.
Kesalahan Umum
- Lupa JSON.stringify sehingga tersimpan "[object Object]".
- Tidak menangani data null saat pertama dibuka (
getItemmengembalikan null). - Menyimpan terlalu sering di tiap keystroke untuk data besar (untuk todo ini aman).
Tantangan
Tantangan: Tenggat Waktu Tugas
Tambahkan tanggal tenggat (input type="date") untuk tiap tugas. Tugas yang tenggatnya lewat hari ini tampil dengan label merah "Terlambat!". Urutkan daftar berdasarkan tenggat terdekat.
Tugas
Tugas: Todo App Produksi Mini
Bangun todo app lengkap dari nol dengan: (1) tambah, toggle, hapus, edit (klik dua kali); (2) filter Semua/Aktif/Selesai; (3) semua tersimpan di localStorage dan bertahan setelah refresh; (4) penghitung tugas aktif; (5) tombol "Hapus yang selesai". Tulis sendiri tanpa mencontek playground, lalu kirim kodenya untuk dinilai AI tutor.
Kriteria penilaian:
- CRUD lengkap: tambah, centang, hapus, edit
- Filter Semua/Aktif/Selesai berfungsi
- Data bertahan setelah halaman di-refresh (localStorage + JSON)
- Ada penghitung tugas aktif dan tombol hapus yang selesai
- Kode rapi: satu array sebagai sumber kebenaran, fungsi render terpisah
AI tutor akan memeriksa bug, kesalahan syntax, dan memberi saran perbaikan.