Menu

Custom Hook React: Cara Membuat Sendiri, dengan Contoh

Custom hook adalah fungsi yang namanya diawali use dan memanggil hook lain, sehingga beberapa komponen bisa memakai ulang logika yang sama yang punya state. Buat useToggle, useLocalStorage, useDebounce, dan useWindowWidth, lalu pelajari kenapa setiap pemanggilan mendapat state sendiri.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Custom hook adalah fungsi yang namanya diawali use dan memanggil hook lain. Kamu menulisnya saat dua komponen butuh logika yang sama yang punya state: pindahkan pemanggilan useState dan useEffect ke dalam fungsi itu, kembalikan apa yang dibutuhkan komponen, lalu panggil dari setiap komponen.

Kedua spoiler memanggil useToggle, dan membuka yang satu tidak membuka yang lain. Setiap pemanggilan menjalankan useState miliknya sendiri, jadi setiap komponen mendapat nilainya sendiri. Custom hook berbagi logika, bukan state.

Aturan untuk menulisnya

  • Namanya diawali use dan huruf kapital: useToggle, useOnlineStatus. Aturan lint untuk hook memakai awalan ini untuk menemukan pemanggilan hook dan memeriksanya.
  • Ia memanggil setidaknya satu hook. Helper yang tidak memanggil hook apa pun adalah fungsi biasa; beri nama formatDate, bukan useFormatDate, agar bisa dipanggil di mana saja, termasuk di dalam kondisi.
  • Ia mengikuti aturan hook: panggil hook di level teratasnya, dan panggil custom hook itu hanya dari komponen atau custom hook lain.
  • Ia mengembalikan apa pun yang berguna. Array ([on, toggle]) praktis saat pemanggil ingin mengganti nama nilainya; objek ({ data, loading, error }) lebih mudah dibaca untuk tiga nilai atau lebih.

useLocalStorage: state yang bertahan setelah reload

useState melupakan semuanya saat halaman dimuat ulang. Hook ini membaca nilai awal dari localStorage dan menulis setiap perubahan kembali ke sana.

Pratinjau berjalan di frame sandbox tempat browser memblokir localStorage, jadi di sini kamu akan melihat peringatan di Konsol dan hook-nya kembali memakai state biasa. Di halaman normal, namanya tetap ada setelah reload. try/catch itu bukan hanya untuk pratinjau ini: mode private browsing, cookie yang diblokir, dan kuota yang penuh juga membuat storage melempar error di aplikasi sungguhan. Mengirim fungsi ke useState berarti storage hanya dibaca sekali, di render pertama.

useDebounce: tunggu sampai pengguna berhenti mengetik

Kotak pencarian sebaiknya tidak mengirim request di setiap ketukan tombol. useDebounce mengembalikan salinan sebuah nilai yang baru diperbarui setelah nilai itu berhenti berubah selama jeda tertentu.

Ketik sebuah kata dengan cepat: Typed mengikuti setiap tombol, Debounced menyusul setengah detik setelah kamu berhenti, dan Konsol mencatat satu pencarian. Setiap ketukan tombol mengubah value, jadi React menjalankan cleanup (clearTimeout) sebelum memulai timer baru. Ganti 500 menjadi 0, dan setiap ketukan tombol mencatat pencariannya sendiri.

useWindowWidth: subscribe dengan cleanup

Hook yang mendengarkan browser harus menghapus listener-nya saat komponen hilang, atau setiap mount akan meninggalkan satu listener.

Ubah ukuran jendela browser, dan angkanya ikut berubah. Klik tombolnya, dan Konsol menunjukkan listener sedang dihapus. Hapus return dari effect, lalu lakukan mount dan unmount beberapa kali: kamu mendapat baris added setiap kali tanpa removed, jadi listener lama menumpuk. Untuk nilai dari browser seperti ini, useSyncExternalStore adalah hook yang dibuat React khusus untuk tugas itu, dan cocok dipanggil di dalam custom hook.

Logika dibagi, state tidak

Dua komponen yang memanggil hook yang sama mendapat dua salinan terpisah dari semua isinya. Ini mengejutkan orang yang mengira hook bekerja seperti variabel global.

Klik salah satu tombol, dan hanya counter itu yang bergerak. Jika keduanya harus menampilkan angka yang sama, pindahkan state ke App dan kirim ke bawah, atau taruh di context. Custom hook bisa membungkus state bersama itu agar praktis (useCart() yang membaca CartContext), tetapi kemampuan berbaginya berasal dari context, bukan dari hook.

Kapan menulis custom hook

Ekstrak sebuah hook saat kelompok pemanggilan hook yang sama muncul di dua komponen, atau saat logika effect di satu komponen cukup panjang sehingga sebuah nama akan menjelaskannya lebih baik (useOnlineStatus() lebih mudah dibaca daripada dua puluh baris listener). Jangan membungkus satu pemanggilan useState dengan hook hanya untuk mengganti namanya, dan jangan menulis hook yang hanya memanggil useEffect untuk mengatur state dari props; hitung nilai itu saat render saja.

Pertanyaan yang sering diajukan

Apa itu custom hook di React?

Custom hook adalah fungsi JavaScript yang namanya diawali use dan memanggil satu atau lebih hook lain. Fungsi ini mengemas logika yang punya state (state, effect, ref) sehingga komponen mana pun bisa memakainya ulang dengan memanggil fungsi tersebut.

Apakah custom hook berbagi state antarkomponen?

Tidak. Setiap pemanggilan custom hook menjalankan pemanggilan useState dan useEffect miliknya sendiri, jadi setiap komponen mendapat state yang terpisah. Untuk berbagi nilai yang sama antarkomponen, angkat state-nya ke atas, atau taruh di context atau store eksternal.

Kenapa nama custom hook harus diawali use?

Nama itu memberi tahu aturan lint React dan developer lain bahwa fungsi tersebut memanggil hook, sehingga aturan hook berlaku untuknya: panggil di level teratas, jangan pernah di dalam kondisi atau loop. Tanpa awalan itu, linter tidak bisa memeriksa pemanggilan di dalamnya.

Bisakah custom hook mengembalikan JSX?

Bisa mengembalikan apa saja, tetapi jika mengembalikan JSX, biasanya lebih baik ditulis sebagai komponen. Custom hook umumnya mengembalikan nilai dan fungsi, sebagai array ([value, toggle]) atau objek ({ data, error, loading }).

Bisakah saya memanggil custom hook di dalam useEffect atau event handler?

Tidak. Custom hook tetaplah hook, jadi ia mengikuti aturan hook: panggil di level teratas komponen atau custom hook lain.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai