ReactJS #22: useReducer
Alternatif useState untuk State yang Rumit
Halo, koki React! 👨🍳
Selama ini kita menggunakan useState untuk mengelola state. Tapi bagaimana kalau state kita rumit, misalnya keranjang belanja dengan banyak item, atau form multi-step? useState bisa membuat kode kita berantakan karena banyak fungsi setter dan logika tersebar. Nah, React punya alternatif yang lebih teratur: useReducer!
🧐 Kapan Perlu useReducer?
useReducer cocok untuk situasi:
- State punya banyak sub-nilai atau struktur kompleks (objek dalam objek, array).
- Perubahan state bergantung pada state sebelumnya secara rumit.
- Logika update state tersebar di banyak tempat (banyak event handler).
- Kamu ingin kode lebih mudah diuji dan diprediksi.
Contoh klasik: keranjang belanja (tambah item, hapus item, ubah jumlah, dll).
📜 Konsep useReducer
useReducer menerima dua argumen: reducer function dan initial state. Ia mengembalikan array berisi state saat ini dan fungsi dispatch.
- reducer: fungsi yang menentukan bagaimana state berubah berdasarkan action. Mirip koki yang menerima pesanan dan mengubah bahan.
- initialState: nilai awal state.
- dispatch: fungsi untuk mengirim action ke reducer. Ibaratnya, kamu memanggil pelayan dan berkata "Tambah item ini ke keranjang".
Setiap action biasanya berupa objek dengan properti type (string) dan payload (data tambahan).
🧪 Contoh: Keranjang Belanja dengan useReducer
Mari kita buat keranjang belanja sederhana dengan useReducer.
1. Tentukan Initial State
2. Buat Reducer Function
3. Gunakan useReducer di Komponen
Perhatikan: semua logika perubahan state ada di reducer, komponen hanya mengirim action. Ini membuat kode lebih terstruktur dan mudah dipelihara.
🛒 Simulasi Keranjang
Produk: Buku React (Rp75.000)
Produk: Mainan Robot (Rp120.000)
Keranjang:
Total: Rp270.000
📦 useReducer vs useState
| useState | useReducer |
|---|---|
| Sederhana, cocok untuk state mandiri (angka, string, boolean) | Cocok untuk state kompleks (objek dengan banyak field, array) |
| Logika update tersebar di banyak event handler | Semua logika terpusat di reducer |
| Mudah dipahami untuk pemula | Butuh sedikit pemahaman tambahan, tapi lebih terstruktur |
🧪 Latihan: Todo List dengan useReducer
Buat ulang aplikasi Todo List dari artikel #15 menggunakan useReducer. Fitur:
- Tambah todo
- Tandai selesai (toggle)
- Hapus todo
- Hapus semua yang selesai
Struktur state: array of todos, setiap todo punya id, text, completed.
Petunjuk: buat reducer dengan action types: ADD, TOGGLE, DELETE, CLEAR_COMPLETED.
Date.now() untuk ID. Di reducer, selalu kembalikan state baru (jangan ubah langsung).
⚠️ Hal Penting
- Immutability: Jangan ubah state langsung. Selalu buat salinan baru (spread operator, map, filter).
- Action type biasanya ditulis sebagai konstanta untuk menghindari typo, tapi untuk belajar, string langsung cukup.
- Reducer harus pure function: tidak boleh melakukan side effect (fetch, setTimeout, dll). Side effect dilakukan di komponen (misal useEffect), lalu dispatch action.
🚀 Kesimpulan
- useReducer adalah alternatif useState untuk state yang kompleks atau banyak logika update.
- Pola reducer memisahkan logika bisnis dari komponen, membuat kode lebih terprediksi dan mudah diuji.
- Gunakan
dispatchuntuk mengirim action dengan tipe tertentu. - useReducer sangat berguna untuk state seperti keranjang belanja, form multi-step, atau data dengan banyak interaksi.
Di artikel selanjutnya kita akan belajar tentang Custom Hooks – membuat hook sendiri untuk memakai ulang logika stateful. Sampai jumpa!