React hooks adalah fungsi yang namanya diawali use, yang memungkinkan function component memakai fitur React: useState untuk mengingat sebuah nilai, useEffect untuk menjalankan kode setelah render, useRef untuk memegang node DOM, useContext untuk membaca data bersama. Kamu memanggilnya di bagian atas komponen, dan React menyimpan nilainya di antara render.
Empat hook bekerja sama di sini. useState menyimpan teksnya, useRef menunjuk ke input agar tombol bisa memberinya fokus, useMemo menyimpan list hasil filter sampai query berubah, dan useEffect mencatat log setelah setiap render yang mengubah query. Ketik an dan perhatikan Konsol: satu baris per ketukan tombol, setelah list diperbarui.
Kenapa hook ada
Sebelum React 16.8, komponen yang butuh state atau kode lifecycle harus berupa class. Logika untuk satu fitur terpecah di componentDidMount, componentDidUpdate, dan componentWillUnmount, dan berbagi logika itu antarkomponen berarti memakai mixin (yang tidak pernah berjalan dengan sintaks class), higher order component, atau render prop, yang semuanya membungkus tree-mu dengan lapisan tambahan.
// The class way: one feature, three methods
class Clock extends React.Component {
state = { now: new Date() };
componentDidMount() {
this.id = setInterval(() => this.setState({ now: new Date() }), 1000);
}
componentWillUnmount() {
clearInterval(this.id);
}
render() {
return <p>{this.state.now.toLocaleTimeString()}</p>;
}
}
Dengan hook, fitur yang sama berada di satu tempat: effect memulai timer dan cleanup-nya menghentikannya.
Sembunyikan jam itu, dan Konsol mencetak timer stopped: React menjalankan cleanup saat Clock meninggalkan layar. Tampilkan lagi, dan timer baru dimulai. Class component masih berjalan di React 19, tetapi kode baru memakai hook.
Semua hook bawaan
React 19.2 mengelompokkan hook-nya berdasarkan apa yang diberikannya kepada komponen. Kamu akan memakai dua kelompok pertama setiap hari, dan sisanya saat ada masalah tertentu yang membutuhkannya.
| Hook | Apa yang diberikannya | Halaman |
|---|---|---|
useState | Nilai yang bertahan di antara render dan setter yang memicu render lagi | useState |
useReducer | State yang diperbarui oleh fungsi reducer dan action yang dikirim lewat dispatch | useReducer |
useContext | Nilai yang disediakan induk, tanpa mengirim props | useContext |
useRef | Kotak yang bisa diubah dan bertahan di antara render, sering berisi node DOM | useRef |
useImperativeHandle | Menentukan apa yang dilihat induk lewat ref-mu | forwardRef |
useEffect | Kode yang biasanya berjalan setelah browser menggambar: timer, subscription, fetch | useEffect |
useLayoutEffect | Kode yang berjalan setelah DOM diperbarui tetapi sebelum browser menggambar | useLayoutEffect |
useInsertionEffect | Berjalan sebelum layout effect, untuk library CSS-in-JS | |
useEffectEvent | Fungsi yang bisa dipanggil effect dan selalu melihat props serta state terbaru | useEffect |
useMemo | Menyimpan nilai hasil perhitungan di antara render | useMemo |
useCallback | Menyimpan fungsi di antara render | useCallback |
useTransition | Menandai update sebagai tidak mendesak dan memberi tahu selama masih pending | useTransition |
useDeferredValue | Salinan sebuah nilai yang tertinggal selama render berat | useDeferredValue |
useId | Id unik yang sama di server dan di client | useId |
useSyncExternalStore | Subscribe ke store yang berada di luar React | useSyncExternalStore |
useDebugValue | Label untuk custom hook di React DevTools | |
use | Membaca promise atau context, dan boleh berada di dalam kondisi | use |
useActionState | State yang diperbarui oleh form action, dengan flag pending | useActionState |
useOptimistic | Menampilkan hasil yang diharapkan sebelum server menjawab | useOptimistic |
useFormStatus | Keadaan pending dari form induk (dari react-dom) |
use, useActionState, useOptimistic, dan useFormStatus hadir bersama React 19, dan useEffectEvent menjadi stabil di 19.2. Semua hook lain di daftar ini juga berjalan di React 18.
State memicu render, ref tidak
Tidak setiap hook memicu render. useState dan useReducer memicunya: ubah nilainya, dan React menggambar komponen itu lagi. useRef memberimu objek yang field current-nya bisa kamu ubah dengan bebas, dan React tidak pernah merender ulang karenanya. Karena itu, ref adalah tempat yang tepat untuk id timer, nilai sebelumnya, atau hitungan yang tidak ditampilkan di layar.
useReducer menyimpan keranjang dan useState menyimpan catatan; keduanya memicu render saat berubah, dan effect mencatat satu baris per render. Effect juga mengubah commits.current, tetapi perubahan itu tidak pernah memicu render sendiri, jadi log-nya tidak berputar tanpa henti. Hitungannya diperbarui di effect, bukan di isi komponen, karena isi komponen tidak boleh mengubah apa pun selama merender.
Aturan hook
Setiap hook mengikuti dua aturan:
- Panggil hook di level teratas komponenmu, jangan pernah di dalam kondisi, loop, atau fungsi bersarang.
- Panggil hook hanya dari function component atau dari custom hook buatanmu sendiri.
React tidak mengenali hook berdasarkan namanya. React mengenalinya berdasarkan urutan pemanggilannya, dan mengharapkan urutan itu sama di setiap render. Hook di dalam if akan menggeser setiap hook setelahnya. Halaman aturan hook menunjukkan apa yang rusak dan cara memperbaikinya. use adalah satu-satunya pengecualian: ia boleh dipanggil di dalam kondisi.
Custom hook pertamamu
Saat dua komponen butuh logika yang sama yang punya state, pindahkan logika itu ke fungsi yang namanya diawali use. Fungsi itu boleh memanggil hook lain mana pun. Setiap komponen yang memanggilnya mendapat state sendiri.
Kedua counter menjalankan hook yang sama, tetapi mengklik yang satu tidak memengaruhi yang lain: custom hook berbagi logika, bukan state. Tambahkan fungsi decrement ke useCounter dan tombol yang memanggilnya, dan kedua counter langsung mendapatkannya. Pola lainnya (useToggle, useDebounce, useLocalStorage) ada di halaman custom hook.
Hook mana yang dipakai
- Layar harus berubah saat sebuah nilai berubah:
useState, atauuseReducersaat banyak event memperbarui state yang sama. - Kamu perlu berinteraksi dengan sesuatu di luar React (timer, subscription, request):
useEffect. - Kamu butuh node DOM atau nilai yang tidak ditampilkan di layar:
useRef. - Banyak komponen jauh di dalam tree butuh nilai yang sama:
useContext. - Render terasa lambat karena satu perhitungan atau karena child yang memakai memo ikut dirender ulang:
useMemodanuseCallback. React Compiler bisa menambahkan memoization ini untukmu, tetapi menulisnya secara manual tetap berjalan dan masih umum. - Mengetik terasa lambat karena update di baliknya berat:
useTransitionatauuseDeferredValue.
Pertanyaan yang sering diajukan
Apa itu hook di React?
Hook adalah fungsi yang namanya diawali use, yang memungkinkan function component memakai fitur React: useState untuk state, useEffect untuk side effect, useContext untuk context, useRef untuk nilai yang bertahan di antara render tanpa memicu render, dan lainnya.
Kenapa hook ditambahkan ke React?
Sebelum ada hook (React 16.8), state dan lifecycle method hanya ada di class component, dan berbagi logika yang punya state butuh mixin, higher order component, atau render prop. Hook menaruh logika itu di fungsi biasa yang bisa kamu panggil dari function component mana pun dan dibagikan sebagai custom hook.
Ada berapa hook di React?
React 19.2 menyediakan sekitar dua puluh hook bawaan di package react, ditambah useFormStatus di react-dom. Sebagian besar aplikasi memakai segelintir di antaranya setiap hari: useState, useEffect, useRef, useContext, useMemo, dan useCallback.
Bisakah saya memakai hook di class component?
Tidak. Hook hanya berjalan di dalam function component dan hook lain. Kamu tetap bisa merender class component di samping function component, dan sebuah class bisa merender function component yang memakai hook.
Apa itu custom hook?
Custom hook adalah fungsimu sendiri yang namanya diawali use dan memanggil hook lain. Custom hook memungkinkan beberapa komponen memakai ulang logika yang sama yang punya state, sementara setiap komponen yang memanggilnya tetap mendapat state terpisah.