React hook'ları, adları use ile başlayan ve bir fonksiyon bileşeninin React özelliklerini kullanmasını sağlayan fonksiyonlardır: bir değeri hatırlamak için useState, render'dan sonra kod çalıştırmak için useEffect, bir DOM düğümünü tutmak için useRef, paylaşılan veriyi okumak için useContext. Onları bileşeninin en üstünde çağırırsın, React de değerlerini render'lar arasında korur.
Burada dört hook birlikte çalışıyor. useState metni saklar, useRef düğmenin ona odaklanabilmesi için input'u gösterir, useMemo filtrelenmiş listeyi sorgu değişene kadar tutar ve useEffect sorgunun değiştiği her render'dan sonra kayıt yazar. an yaz ve Console'u izle: liste güncellendikten sonra her tuş vuruşu için bir satır.
Hook'lar neden var
React 16.8'den önce state ya da yaşam döngüsü kodu gerektiren bir bileşen bir class olmak zorundaydı. Bir özelliğin mantığı componentDidMount, componentDidUpdate ve componentWillUnmount arasında bölünürdü; onu bileşenler arasında paylaşmak ise mixin'ler (class sözdizimiyle hiç çalışmadılar), higher order component'ler ya da render props demekti ve bunların hepsi ağacını ekstra katmanlarla sarardı.
// 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>;
}
}
Hook'larla aynı özellik tek bir yerde yaşar: efekt zamanlayıcıyı başlatır, temizlemesi onu durdurur.
Saati gizle; Console timer stopped yazdırır: React, Clock ekrandan ayrıldığında temizlemeyi çalıştırdı. Yeniden göster, taze bir zamanlayıcı başlar. Class bileşenleri React 19'da hâlâ çalışır, ama yeni kod hook'ları kullanır.
Tüm yerleşik hook'lar
React 19.2 hook'larını bir bileşene ne kazandırdıklarına göre gruplar. İlk iki grubu her gün, geri kalanını ise belirli bir sorun gerektirdiğinde kullanacaksın.
| Hook | Sana ne verir | Sayfa |
|---|---|---|
useState | Render'lardan sağ çıkan bir değer ve yeniden render eden bir setter | useState |
useReducer | Bir reducer fonksiyonu ve dispatch edilen action'larla güncellenen state | useReducer |
useContext | Bir ebeveynin sağladığı bir değer, props aktarmadan | useContext |
useRef | Render'lardan sağ çıkan değiştirilebilir bir kutu, çoğu zaman bir DOM düğümü | useRef |
useImperativeHandle | Bir ebeveynin ref'in aracılığıyla ne göreceğini seçer | forwardRef |
useEffect | Genellikle boyamadan sonra çalışan kod: zamanlayıcılar, abonelikler, veri çekme | useEffect |
useLayoutEffect | DOM güncellendikten sonra ama boyamadan önce çalışan kod | useLayoutEffect |
useInsertionEffect | CSS-in-JS kütüphaneleri için layout efektlerinden önce çalışır | |
useEffectEvent | Bir efektin çağırabileceği, her zaman en son props ve state'i gören bir fonksiyon | useEffect |
useMemo | Hesaplanmış bir değeri render'lar arasında önbelleğe alır | useMemo |
useCallback | Bir fonksiyonu render'lar arasında önbelleğe alır | useCallback |
useTransition | Bir güncellemeyi acil değil olarak işaretler ve beklemedeyken sana söyler | useTransition |
useDeferredValue | Ağır render'lar sırasında geriden gelen bir değer kopyası | useDeferredValue |
useId | Sunucuda ve istemcide eşleşen benzersiz bir id | useId |
useSyncExternalStore | React dışında yaşayan bir store'a abone olur | useSyncExternalStore |
useDebugValue | React DevTools'ta özel bir hook için bir etiket | |
use | Bir promise'i ya da bir context'i okur ve bir koşulun içinde durabilir | use |
useActionState | Bir form action'ının güncellediği, bekleme bayrağı olan state | useActionState |
useOptimistic | Sunucu yanıt vermeden önce beklenen sonucu gösterir | useOptimistic |
useFormStatus | Ebeveyn formun bekleme durumu (react-dom'dan) |
use, useActionState, useOptimistic ve useFormStatus React 19 ile geldi, useEffectEvent ise 19.2'de kararlı hâle geldi. Listedeki diğer tüm hook'lar React 18'de de çalışır.
State render eder, ref'ler etmez
Her hook bir render tetiklemez. useState ve useReducer tetikler: değerlerini değiştir, React bileşeni yeniden çizer. useRef sana current alanını özgürce değiştirebileceğin bir nesne verir ve React bu yüzden asla yeniden render etmez. Bu da onu bir zamanlayıcı id'si, önceki bir değer ya da ekranın göstermediği bir sayı için doğru yer yapar.
useReducer sepeti, useState notu tutar; ikisi de değiştiklerinde bir render'a yol açar ve efekt her render için bir satır yazar. Efekt ayrıca commits.current'ı değiştirir, ama bu değişiklik asla kendi başına bir render'a yol açmaz, bu yüzden kayıt döngüye girmez. Sayı bileşen gövdesinde değil bir efektte güncellenir, çünkü gövde render sırasında hiçbir şeyi değiştirmemelidir.
Hook kuralları
Her hook iki kurala uyar:
- Hook'ları bileşeninin en üst düzeyinde çağır; asla bir koşul, bir döngü ya da iç içe bir fonksiyon içinde değil.
- Hook'ları yalnızca fonksiyon bileşenlerinden ya da kendi özel hook'larından çağır.
React hook'ları adlarıyla tanımaz. Onları çağırdığın sırayla tanır ve bu sıranın her render'da aynı olmasını bekler. Bir if içindeki hook ondan sonraki her hook'u kaydırırdı. Hook kuralları sayfası neyin bozulduğunu ve nasıl düzeltileceğini gösteriyor. use tek istisnadır: bir koşulun içinde çağrılabilir.
İlk özel hook'un
İki bileşenin aynı state'li mantığa ihtiyacı olduğunda onu adı use ile başlayan bir fonksiyona taşı. Bu fonksiyon diğer her hook'u çağırabilir. Onu çağıran her bileşen kendi state'ini alır.
İki sayaç da aynı hook'u çalıştırır, ama birine tıklamak diğerine dokunmaz: özel bir hook state'i değil mantığı paylaşır. useCounter'a bir decrement fonksiyonu ve onu çağıran bir düğme ekle; iki sayaç da onu aynı anda alır. Daha fazla kalıp (useToggle, useDebounce, useLocalStorage) özel hook'lar sayfasında.
Hangi hook'a başvurmalı
- Bir değer değiştiğinde ekranın da değişmesi gerekiyor:
useState, ya da birçok olay aynı state'i güncelliyorsauseReducer. - React dışındaki bir şeyle (bir zamanlayıcı, bir abonelik, bir istek) konuşman gerekiyor:
useEffect. - Bir DOM düğümüne ya da ekranın göstermediği bir değere ihtiyacın var:
useRef. - Ağacın derinlerindeki birçok bileşenin aynı değere ihtiyacı var:
useContext. - Bir render, tek bir hesaplama yüzünden ya da memoize edilmiş bir çocuk yeniden render olduğu için yavaş:
useMemoveuseCallback. React Compiler bu memoization'ı senin için ekleyebilir, ama onu elle yazmak hâlâ çalışır ve hâlâ yaygındır. - Arkasındaki güncelleme ağır olduğu için yazmak takılıyor:
useTransitionya dauseDeferredValue.
Sıkça Sorulan Sorular
React'te hook'lar nedir?
Hook'lar, adları use ile başlayan ve bir fonksiyon bileşeninin React özelliklerini kullanmasını sağlayan fonksiyonlardır: state için useState, yan etkiler için useEffect, context için useContext, render'lardan render'a yol açmadan sağ çıkan değerler için useRef ve daha fazlası.
Hook'lar React'e neden eklendi?
Hook'lardan önce (React 16.8) state ve yaşam döngüsü metotları yalnızca class bileşenlerinde vardı ve state'li mantığı paylaşmak mixin'ler, higher order component'ler ya da render props gerektiriyordu. Hook'lar bu mantığı herhangi bir fonksiyon bileşeninden çağırabileceğin ve özel hook'lar olarak paylaşabileceğin düz fonksiyonlara koyar.
React'te kaç tane hook var?
React 19.2, react paketinde yaklaşık yirmi yerleşik hook ile, artı react-dom içinde useFormStatus ile gelir. Çoğu uygulama günlük olarak bir avuç hook kullanır: useState, useEffect, useRef, useContext, useMemo ve useCallback.
Hook'ları class bileşenlerinde kullanabilir miyim?
Hayır. Hook'lar yalnızca fonksiyon bileşenlerinin ve diğer hook'ların içinde çalışır. Yine de bir class bileşenini fonksiyon bileşenlerinin yanında render edebilirsin ve bir class, hook kullanan bir fonksiyon bileşenini render edebilir.
Özel hook (custom hook) nedir?
Adı use ile başlayan ve başka hook'ları çağıran kendi fonksiyonundur. Birkaç bileşenin aynı state'li mantığı yeniden kullanmasını sağlar; onu çağıran her bileşen yine de kendi ayrı state'ini alır.