ReactJS - Menggunakan useReducer
Hai, para pemrogram yang sedang mencari ilmu! Hari ini, kita akan melangsungkan sebuah perjalanan yang menarik ke dunia hook React, khususnya fokus pada hook useReducer
yang kuat. Jangan khawatir jika Anda baru dalam pemrograman – saya akan mengajarkan Anda secara langkah demi langkah, seperti yang saya lakukan untuk ribuan murid dalam tahunajaran saya. Ayo masuk ke dalamnya!
Apa itu useReducer?
Sebelum kita masuk ke detailnya, mari kita pahami apa itu useReducer
. Bayangkan Anda sedang main permainan video dimana karakter Anda memiliki berbagai keadaan – kesehatan, kekuatan, dan kecepatan. Ketika Anda main, keadaan ini berubah berdasarkan tindakan Anda. useReducer
adalah seperti mesin permainan yang mengelola perubahan keadaan ini berdasarkan aturan khusus.
Dalam istilah React, useReducer
adalah hook yang membantu kita mengelola logika keadaan yang kompleks dalam aplikasi kita. Ini sangat berguna ketika Anda memiliki banyak sub-nilai dalam keadaan Anda, atau ketika keadaan berikutnya tergantung pada yang sebelumnya.
Tanda Tangan hook useReducer
Sekarang, mari kita lihat bagaimana kita benar-benar menggunakan useReducer
dalam kode kita. Ini adalah struktur dasarnya:
const [state, dispatch] = useReducer(reducer, initialState);
mari kita pecah ini:
-
state
: Ini adalah keadaan saat ini kita, seperti kesehatan saat ini karakter kita dalam analogi permainan. -
dispatch
: Ini adalah fungsi yang kita gunakan untuk mengirimkan aksi untuk memperbarui keadaan kita. -
reducer
: Ini adalah fungsi yang menentukan bagaimana keadaan kita harus berubah dalam respons terhadap aksi. -
initialState
: Ini adalah keadaan awal aplikasi kita.
Mungkin terlihat sedikit membingungkan saat ini, tapi jangan khawatir! Kita akan melihat ini dalam aksi dan itu akan membuat sense.
Menggunakan hook reducer
Mari kita buat sebuah aplikasi penghitung sederhana untuk memahami bagaimana useReducer
bekerja. Kita akan mulai dengan pengaturan dasar dan kemudian membangun atasnya.
import React, { useReducer } from 'react';
// Langkah 1: Definisikan keadaan awal
const initialState = { count: 0 };
// Langkah 2: Buat fungsi reducer
function reducer(state, action) {
switch (action.type) {
case 'increment':
return { count: state.count + 1 };
case 'decrement':
return { count: state.count - 1 };
default:
return state;
}
}
// Langkah 3: Buat komponen Counter
function Counter() {
const [state, dispatch] = useReducer(reducer, initialState);
return (
<div>
Count: {state.count}
<button onClick={() => dispatch({ type: 'increment' })}>+</button>
<button onClick={() => dispatch({ type: 'decrement' })}>-</button>
</div>
);
}
export default Counter;
mari kita pecah ini langkah demi langkah:
- Kita import
useReducer
dari React. - Kita tentukan
initialState
dengan hitungan 0. - Kita buat fungsi
reducer
yang mengambil keadaan saat ini danaction
, dan mengembalikan keadaan baru berdasarkan jenis aksi. - Dalam komponen
Counter
, kita gunakanuseReducer
untuk mendapatkan keadaan saat ini dan fungsidispatch
. - Kita render hitungan saat ini dan dua tombol yang mengirimkan aksi 'increment' dan 'decrement' saat ditekan.
Ketika Anda mengklik tombol '+', itu mengirimkan aksi 'increment', yang ditangani oleh reducer kita dengan meningkatkan hitungan. Tombol '-' bekerja sama seperti itu untuk mengurangi.
Menggunakan useReducer
Sekarang, kita telah melihat contoh dasar, mari kita jelajahi sebuah konteks yang lebih kompleks. Bayangkan kita sedang membangun aplikasi manajemen tugas sederhana. Kita akan menggunakan useReducer
untuk mengelola penambahan dan penghapusan tugas.
import React, { useReducer, useState } from 'react';
// Langkah 1: Definisikan keadaan awal
const initialState = { tasks: [] };
// Langkah 2: Buat fungsi reducer
function reducer(state, action) {
switch (action.type) {
case 'ADD_TASK':
return { tasks: [...state.tasks, action.payload] };
case 'REMOVE_TASK':
return { tasks: state.tasks.filter((task, index) => index !== action.payload) };
default:
return state;
}
}
// Langkah 3: Buat komponen TaskManager
function TaskManager() {
const [state, dispatch] = useReducer(reducer, initialState);
const [newTask, setNewTask] = useState('');
const handleAddTask = () => {
if (newTask.trim()) {
dispatch({ type: 'ADD_TASK', payload: newTask });
setNewTask('');
}
};
const handleRemoveTask = (index) => {
dispatch({ type: 'REMOVE_TASK', payload: index });
};
return (
<div>
<input
value={newTask}
onChange={(e) => setNewTask(e.target.value)}
placeholder="Masukkan tugas baru"
/>
<button onClick={handleAddTask}>Tambah Tugas</button>
<ul>
{state.tasks.map((task, index) => (
<li key={index}>
{task}
<button onClick={() => handleRemoveTask(index)}>Hapus</button>
</li>
))}
</ul>
</div>
);
}
export default TaskManager;
Dalam contoh yang lebih kompleks ini:
- Keadaan awal kita sekarang memiliki array tugas.
- Fungsi
reducer
menangani dua jenis aksi: 'ADD_TASK' dan 'REMOVE_TASK'. - Dalam komponen
TaskManager
, kita gunakan baikuseReducer
untuk mengelola tugas danuseState
untuk mengelola field input. - Kita memiliki fungsi untuk menangani penambahan dan penghapusan tugas, yang mengirimkan aksi yang sesuai.
- Kita render field input untuk tugas baru, tombol untuk menambah tugas, dan daftar tugas yang ada dengan tombol hapus.
Contoh ini menunjukkan bagaimana useReducer
dapat membantu mengelola logika keadaan yang lebih kompleks dalam cara yang bersih dan terorganisir.
Tabel Metode
Berikut adalah tabel yang menggabungkan metode dan konsep utama yang kita pelajari:
Metode/Konsep | Deskripsi | Contoh |
---|---|---|
useReducer | Sebuah hook React untuk mengelola logika keadaan yang kompleks | const [state, dispatch] = useReducer(reducer, initialState); |
reducer | Sebuah fungsi yang menentukan bagaimana keadaan harus berubah dalam respons terhadap aksi | function reducer(state, action) { ... } |
dispatch | Sebuah fungsi yang digunakan untuk mengirimkan aksi untuk memperbarui keadaan | dispatch({ type: 'ADD_TASK', payload: newTask }) |
aksi | Sebuah objek yang menjelaskan perubahan yang harus dilakukan pada keadaan | { type: 'INCREMENT' } |
initialState | Keadaan awal aplikasi | const initialState = { count: 0 }; |
Ingat, belajar menggunakan useReducer
secara efektif memerlukan latihan. Jangan frustasi jika itu tidak langsung berjalan – bahkan pengembang berpengalaman kadang-kadang memerlukan waktu untuk memahami konsep baru. Terus coding, terus eksperimen, dan yang paling penting, bersenang-senang! Sebelum Anda sadari, Anda akan mengelola keadaan kompleks seperti seorang pro. Selamat coding!
Credits: Image by storyset