Latihan 1 dari materi Proyek Solid di SolidJS — praktek dengan editor kode interaktif, test case otomatis, dan hint terpandu. Langsung jalan di browser.
Kode awal sudah punya signal todos (array kosong) dan input (string kosong), plus addTodo yang baru memanggil e.preventDefault(). Lengkapi:
Impor juga createMemo dan For (dan Show kalau perlu) dari "solid-js".
Buat const remaining = createMemo(() => todos().filter((t) => !t.done).length).
Di addTodo, sesudah e.preventDefault(): if (!input().trim()) return, lalu setTodos((t) => [...t, { id: Date.now(), text: input(), done: false }]), lalu setInput("").
Buat toggleTodo(id) yang membalik done lewat map, dan removeTodo(id) yang memakai setTodos((t) => t.filter((todo) => todo.id !== id)).
Di dalam <div>: <h1>Todo App</h1>, <p>{remaining()} tersisa</p>, lalu <form onSubmit={addTodo}> berisi <input value={input()} onInput={(e) => setInput(e.target.value)} /> dan <button type="submit">Tambah</button>.
Di bawah form, <ul> dengan <For each={todos()}>: tiap <li> berisi checkbox onChange={() => toggleTodo(todo.id)}, teks todo, dan <button onClick={() => removeTodo(todo.id)}>Hapus</button>.
Yang dicek:
Ada <h1> dan <form>.
Kodemu memuat createMemo(, For, onClick, dan filter(.
Ketik Belajar Solid, klik Tambah: <ul> memuat Belajar Solid, dan kotak isiannya kosong lagi. Lalu klik Hapus: gak ada <li> lagi di <ul>.
Klik Tambah dengan kotak kosong: gak ada <li> di <ul>.
Dari awal lagi: sebelum ada todo, <p> berisi persis 0 tersisa. Ketik Belajar Solid, klik Tambah: 1 tersisa. Lalu centang checkbox-nya: 0 tersisa lagi.
Hint
Todo app ini punya empat bagian yang saling terkait: isi kotak, daftar todo, status tiap todo, dan jumlah yang belum selesai. Jumlahnya diturunkan dari daftar, bukan disimpan sendiri.
addTodo: berhenti kalau input().trim() kosong, tambahkan objek baru ke array lama, lalu kosongkan input. removeTodo menyusun array baru tanpa todo itu dengan filter. Daftarnya digambar dengan For di dalam <ul>, di bawah form.