Hook Referansı
Hook Referansı, React uygulamalarında fonksiyonel bileşenler için özel işlevler sağlayan hook’ların kapsamlı bir rehberidir. Hooks, bileşenlerin durum yönetimini, yan etkilerini ve yaşam döngüsü işlevlerini yönetmek için kullanılır ve sınıf tabanlı bileşenlere ihtiyaç duymadan güçlü ve tekrar kullanılabilir yapılar oluşturmayı mümkün kılar. Bu referans, modern web uygulamaları ve tek sayfa uygulamaları (SPA) geliştiren geliştiriciler için kritik öneme sahiptir.
React’in temel kavramları olan bileşenler, veri akışı, durum yönetimi ve yaşam döngüsü, hooks kullanılarak daha basit ve anlaşılır şekilde uygulanabilir. useState, useEffect, useReducer, useMemo, useCallback ve useContext gibi temel hook’lar, uygulama mantığını modüler, test edilebilir ve performans açısından optimize edilmiş şekilde organize etmeye olanak tanır.
Bu rehberde, okuyucular hook’ları etkin kullanmayı, sık karşılaşılan hatalardan kaçınmayı (prop drilling, gereksiz yeniden render’lar, durum mutasyonları), yeniden kullanılabilir bileşenler oluşturmayı ve performans optimizasyon tekniklerini öğreneceklerdir. Ayrıca hook’ların modern React projelerinde nasıl pratik bir şekilde entegre edildiğini ve bileşen mantığını nasıl sadeleştirdiğini kavrayacaklardır.
Temel Örnek
jsximport React, { useState, useEffect } from 'react';
function Sayac() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `Sayac: ${count}`;
console.log('Sayac güncellendi:', count);
}, [count]);
const artir = () => setCount(prev => prev + 1);
const azalt = () => setCount(prev => prev - 1);
return (
<div style={{ textAlign: 'center', padding: '20px' }}> <h2>Sayac Hook ile</h2> <p>Güncel değer: {count}</p> <button onClick={azalt}>-</button> <button onClick={artir}>+</button> </div>
);
}
export default Sayac;
Bu örnekte useState hook’u, bileşenin yerel durumunu tutmak ve güncellemek için kullanılır. setCount fonksiyonu çağrıldığında, bileşen yeniden render edilir ve UI otomatik olarak güncellenir. useEffect, yan etkileri yönetir; burada belge başlığını güncellemek ve console’a bilgi yazdırmak için kullanılmıştır. Dependency array ([count]) sayesinde, effect yalnızca count değiştiğinde çalışır, bu da gereksiz yeniden render’ları engeller.
Kod, React’in iyi uygulamalarını gösterir: durumun immutable yönetimi, mantığın kapsüllenmesi ve okunabilirliği, ayrıca bileşen yaşam döngüsünün etkili yönetimi. Bu sayede hook’ların, sınıf kullanmadan durum ve yan etki yönetimini nasıl kolaylaştırdığı pratik olarak gösterilmektedir.
Pratik Örnek
jsximport React, { useState, useEffect, useMemo } from 'react';
function FiltreliListe({ items }) {
const [arama, setArama] = useState('');
const filtrelenmisItems = useMemo(() => {
return items.filter(item =>
item.toLowerCase().includes(arama.toLowerCase())
);
}, [items, arama]);
useEffect(() => {
console.log('Filtrelenmiş öğe sayısı:', filtrelenmisItems.length);
}, [filtrelenmisItems]);
return ( <div> <h3>Filtreli Liste</h3>
<input
type="text"
placeholder="Ara..."
value={arama}
onChange={e => setArama(e.target.value)}
/> <ul>
{filtrelenmisItems.map((item, index) => ( <li key={index}>{item}</li>
))} </ul> </div>
);
}
export default FiltreliListe;
Advanced React Implementation
jsximport React, { useReducer, useEffect, useCallback } from 'react';
function veriReducer(state, action) {
switch (action.type) {
case 'INIT':
return { ...state, loading: true, error: false };
case 'SUCCESS':
return { ...state, loading: false, data: action.payload };
case 'ERROR':
return { ...state, loading: false, error: true };
default:
return state;
}
}
function useVeriGetir(url) {
const [state, dispatch] = useReducer(veriReducer, {
data: [],
loading: false,
error: false,
});
const getirVeri = useCallback(async () => {
dispatch({ type: 'INIT' });
try {
const response = await fetch(url);
const result = await response.json();
dispatch({ type: 'SUCCESS', payload: result });
} catch {
dispatch({ type: 'ERROR' });
}
}, [url]);
useEffect(() => {
getirVeri();
}, [getirVeri]);
return state;
}
function VeriGoster() {
const { data, loading, error } = useVeriGetir('[https://jsonplaceholder.typicode.com/posts](https://jsonplaceholder.typicode.com/posts)');
if (loading) return <p>Veriler yükleniyor...</p>;
if (error) return <p>Veri yüklenirken hata oluştu.</p>;
return ( <div> <h3>Hook ile Veriler</h3> <ul>
{data.slice(0, 10).map(item => ( <li key={item.id}>{item.title}</li>
))} </ul> </div>
);
}
export default VeriGoster;
Hook kullanımında en iyi uygulamalar arasında özel hook’lar oluşturmak, durumun immutable yönetimi, useMemo ve useCallback ile gereksiz yeniden render’ları engellemek ve Context API ile prop drilling’den kaçınmak yer alır. useReducer, karmaşık durum yönetiminde tercih edilir.
Yaygın hatalar: durumu doğrudan değiştirmek, useEffect bağımlılıklarını yanlış belirlemek ve performans optimizasyonlarını ihmal etmek. Debugging için React DevTools önerilir. Performans optimizasyonu, değer ve fonksiyonların memorizasyonu ile sağlanır. Güvenlik açısından, kullanıcı verileri ve API yanıtları her zaman doğrulanmalı ve side effect’ler temizlenmelidir.
📊 Kapsamlı Referans
React Element/Method | Description | Syntax | Example | Notes |
---|---|---|---|---|
useState | Yerel durum yönetimi | const [state, setState] = useState(initial) | useState(0) | Render tetikler |
useEffect | Yan etkiler | useEffect(fn, deps) | useEffect(()=>{}, [deps]) | Render sonrası çalışır |
useContext | Context erişimi | useContext(Context) | const val = useContext(MyContext) | Prop drilling’i önler |
useReducer | Karmaşık durum | const [state, dispatch] = useReducer(reducer, init) | useReducer(reducerFn,{}) | State machine tarzı |
useMemo | Değer memorizasyonu | useMemo(fn,deps) | useMemo(()=>calc(a,b),[a,b]) | Gereksiz hesaplamayı engeller |
useCallback | Fonksiyon memorizasyonu | useCallback(fn,deps) | useCallback(()=>handle(),[deps]) | Child re-render engeller |
useRef | DOM veya değer referansı | const ref = useRef(initial) | ref.current.focus() | Render tetiklemez |
useLayoutEffect | Paint öncesi effect | useLayoutEffect(fn,deps) | useLayoutEffect(()=>{},[deps]) | DOM ile senkron |
useImperativeHandle | Ref özelleştirme | useImperativeHandle(ref,createHandle) | useImperativeHandle(ref,()=>({...})) | forwardRef ile |
useDebugValue | DevTools gösterimi | useDebugValue(value) | useDebugValue('Aktif') | Sadece DevTools’ta |
📊 Complete React Properties Reference
Property | Values | Default | Description | React Support |
---|---|---|---|---|
StrictMode | boolean | false | Hata uyarıları | 16.8+ |
Suspense | Component | null | Lazy loading | 16.6+ |
lazy | Function | null | Dinamik import | 16.6+ |
memo | Function | null | Component memoization | 16.8+ |
Profiler | Function | null | Performans ölçümü | 16.9+ |
Fragment | JSX grouping | none | Element gruplama | 16.2+ |
forwardRef | Function | null | Ref iletme | 16.3+ |
Children | Utility | null | Children yönetimi | 16.0+ |
cloneElement | Function | null | Element klonlama | 16.0+ |
createContext | Function | null | Context oluşturma | 16.3+ |
createRef | Function | null | Ref oluşturma | 16.3+ |
Hook Referansı, bileşen durum yönetimi, yan etkiler ve yaşam döngüsünü etkili şekilde öğrenmek ve uygulamak için kritik bir kaynaktır. Hooks sayesinde bileşenler daha modüler, test edilebilir ve performans açısından optimize edilmiş olur.
Sonraki adımlar: özel hook’lar geliştirmek, Context API ile global state yönetimi, Profiler ile performans ölçümü, Suspense ve server components ile modern uygulama geliştirmek. Bu bilgiler, uygulamaların ölçeklenebilirliğini artırır, kod tekrarını azaltır ve React projelerinde profesyonel bir yapı sağlar.
🧠 Bilginizi Test Edin
Bilginizi Test Edin
Bu interaktif sınavla kendini test et ve konuyu ne kadar iyi anladığını gör
📝 Talimatlar
- Her soruyu dikkatle okuyun
- Her soru için en iyi cevabı seçin
- Quiz'i istediğiniz kadar tekrar alabilirsiniz
- İlerlemeniz üstte gösterilecek