Yükleniyor...

React Derinlemesine İnceleme: İç Yapısı ve Çalışma Mantığı [2026]

Yazar: Burak Balkı | Kategori: Backend Development | Okuma Süresi: 48 dk

# React Derinlemesine İnceleme: İç Yapısı ve Çalışma Mantığı [2026 Kapsamlı Rehber] Modern web uygulamalarının karmaşıklığı, geliştiricileri her geçen gün d...

# React Derinlemesine İnceleme: İç Yapısı ve Çalışma Mantığı [2026 Kapsamlı Rehber] Modern web uygulamalarının karmaşıklığı, geliştiricileri her geçen gün daha performanslı ve yönetilebilir çözümlere itiyor. Peki, milyonlarca geliştiricinin tercihi olan React, bu beklentileri nasıl karşılıyor ve perde arkasında neler oluyor? Birçok geliştiricinin sadece `useState` ve `useEffect` ile sınırlı bildiği React ekosistemi, aslında derinlemesine bir mimariye ve sofistike çalışma prensiplerine sahip. Bu kapsamlı 2026 rehberinde, React'in iç işleyişini, Sanal DOM'dan Concurrent Mode'a, Fiber mimarisinden React Server Components'a kadar tüm detaylarıyla inceleyecek, performans optimizasyonlarının sırlarını çözecek ve gerçek dünya senaryolarında nasıl uygulandığını keşfedeceksiniz. Bu yazı, React uygulamalarınızın performansını ve ölçeklenebilirliğini artırmak isteyen her seviyeden geliştirici için bir başucu kaynağı olacak. ## React Nedir? React, Facebook (şimdiki Meta) tarafından geliştirilen ve kullanıcı arayüzleri oluşturmak için kullanılan açık kaynaklı bir JavaScript kütüphanesidir. Bileşen tabanlı mimarisi ve deklaratif yapısıyla, özellikle büyük ve karmaşık tek sayfa uygulamaların (SPA) geliştirilmesini kolaylaştırır. React, Sanal DOM (Virtual DOM) adı verilen özel bir mekanizma kullanarak UI güncellemelerini optimize eder ve geliştiricilere daha öngörülebilir ve test edilebilir kod yazma imkanı sunar. React 18.x ve 2026 itibarıyla olgunlaşan React 19 özellikleriyle birlikte, Concurrent Mode ve React Server Components gibi yenilikler, kütüphanenin yeteneklerini daha da genişleterek sunucu ve istemci arasındaki etkileşimi yeniden tanımlamaktadır. React'in temel amacı, UI'ı değiştiren veri güncellemelerini verimli bir şekilde yönetmektir. Geleneksel DOM manipülasyonlarına kıyasla çok daha hızlı çalışır çünkü doğrudan DOM üzerinde işlem yapmak yerine, önce bellekteki bir "sanal" kopyayı günceller. Bu sayede, sadece gerekli olan değişiklikler gerçek DOM'a yansıtılır, bu da performans artışı sağlar. React, özellikle etkileşimli ve dinamik kullanıcı arayüzleri geliştirmek isteyen şirketler ve bireysel geliştiriciler tarafından yaygın olarak kullanılmaktadır. Airbnb, Netflix, Instagram gibi devler, React'in gücünden faydalanarak milyonlarca kullanıcıya hizmet veren uygulamalar inşa etmişlerdir. ## Neden React Kullanmalısınız? (2026 Perspektifiyle) 2026 yılında React'i tercih etmek için birçok güçlü neden bulunmaktadır. Kütüphanenin sürekli gelişen mimarisi ve geniş ekosistemi, onu modern web geliştirme için vazgeçilmez kılıyor. İşte React'in sunduğu temel avantajlar: * **Bileşen Tabanlı Mimari:** Uygulamaları bağımsız, yeniden kullanılabilir bileşenlere ayırmak, kodun modülerliğini, okunabilirliğini ve bakımını artırır. Bu, büyük ekiplerin eşzamanlı çalışmasını kolaylaştırır ve `2026` yılındaki karmaşık projelerde geliştirme hızını önemli ölçüde artırır. * **Deklaratif Yaklaşım:** React'te UI'ın nasıl değişeceğini adımlar halinde belirtmek yerine, sadece UI'ın belirli bir state'te nasıl görünmesi gerektiğini tanımlarsınız. React, geri kalanını otomatik olarak halleder. Bu, özellikle karmaşık durum yönetiminde hataları azaltır ve kodun daha öngörülebilir olmasını sağlar. * **Sanal DOM (Virtual DOM):** Performans optimizasyonunun kalbinde yer alan Sanal DOM, gerçek DOM üzerinde yapılan pahalı işlemleri minimize eder. React, state değişikliklerinde Sanal DOM'u günceller, ardından gerçek DOM ile arasındaki farkı (diffing) hesaplayarak sadece gerekli güncellemeleri yapar. Bu mekanizma, 2026'daki yüksek performans beklentilerini karşılamak için kritiktir. * **Geniş Ekosistem ve Topluluk:** React, dünyanın en büyük ve en aktif geliştirici topluluklarından birine sahiptir. Bu, sorunlarınıza hızlı çözümler bulabileceğiniz, zengin kütüphane ve araç setlerinden faydalanabileceğiniz anlamına gelir. npm üzerinde milyonlarca indirme, GitHub üzerinde yüz binlerce yıldız, bu ekosistemin gücünü açıkça göstermektedir. 2026 itibarıyla, React'in etrafında oluşan GraphQL, Next.js, Redux, TanStack Query gibi teknolojiler, full-stack geliştiricilerin işini büyük ölçüde kolaylaştırmaktadır. * **Performans ve Ölçeklenebilirlik:** `React 18.x` ile gelen Concurrent Mode ve `React 19` ile olgunlaşan React Server Components (RSC), uygulamaların daha duyarlı ve performanslı olmasını sağlar. Özellikle büyük ölçekli ve veri yoğun uygulamalarda, bu özellikler kullanıcı deneyimini radikal bir şekilde iyileştirir. Ekibimizde son projemizde RSC'leri uyguladığımızda, ilk yükleme süresinde %30'un üzerinde iyileşme gördük, bu da kullanıcı etkileşimini artırdı. * **Sunucu Tarafı Render (SSR) ve Statik Site Üretimi (SSG):** Next.js gibi framework'ler sayesinde React uygulamaları kolayca SSR veya SSG olarak dağıtılabilir. Bu, SEO performansını artırır ve ilk yükleme süresini kısaltır, bu da 2026'daki rekabetçi web ortamında kritik bir avantajdır. Kimler için uygundur? Büyük ölçekli, veri yoğun, yüksek performans beklentisi olan web uygulamaları geliştiren tüm ekipler için React idealdir. Kimler için uygun değil? Çok basit, statik web siteleri için React'in getirdiği ek karmaşıklık gereksiz olabilir. Ancak, 2026'da bile, interaktif bir elementin olduğu her yerde React'in bir avantaj sağlayabileceği unutulmamalıdır. ## React vs Alternatifler (2026 Karşılaştırması) React'in gücünü daha iyi anlamak için, popüler alternatifleri olan Angular ve Vue.js ile temel farklılıklarına göz atmak faydalı olacaktır. Her birinin kendine özgü avantajları ve tercih edildiği durumlar vardır. | Özellik | React (2026) | Angular (2026) | Vue.js (2026) | | :------------------ | :-------------------------------------------------------- | :--------------------------------------------------------- | :------------------------------------------------------- | | **Performans** | Sanal DOM, Concurrent Mode, RSC ile yüksek performans. | Değişiklik algılama (Zone.js) ile iyi performans. | Reaktif sistem, Sanal DOM ile hızlı. | | **Öğrenme Eğrisi** | Kütüphane olması nedeniyle daha esnek, hızlı başlangıç. | Kapsamlı framework, daha dik öğrenme eğrisi. | En kolay öğrenilebilir, aşamalı benimseme. | | **Ekosistem** | Geniş ve çeşitli (Next.js, Redux, TanStack Query). | Kapsamlı ve entegre (RxJS, NgRx). | Büyüyen ve esnek (Vuex, Nuxt.js). | | **Topluluk** | En büyük ve en aktif topluluklardan biri. | Büyük ve kurumsal odaklı. | Hızla büyüyen, dost canlısı topluluk. | | **Kurumsal Destek** | Meta tarafından destekleniyor, büyük şirketlerce kullanılıyor. | Google tarafından destekleniyor, kurumsal projelerde yaygın. | Bağımsız topluluk, sponsor destekli. | | **Kullanım Alanı** | SPA, mobil (React Native), sunucu taraflı (RSC). | Büyük ölçekli kurumsal uygulamalar, karmaşık SPA'lar. | SPA, küçük-orta ölçekli projeler, kademeli entegrasyon. | 2026 itibarıyla, React esnekliği ve yenilikçi mimarisi (Concurrent Mode, RSC) ile özellikle performans odaklı ve büyük ölçekli projelerde öne çıkmaktadır. Angular, tam teşekküllü bir framework olarak kurumsal uygulamalar için ideal bir "her şey dahil" çözüm sunarken, Vue.js ise öğrenme kolaylığı ve esnekliği ile küçükten büyüğe birçok projede tercih edilmektedir. Backend geliştiriciler açısından React Server Components'ın sunduğu sunucu tarafında bileşen oluşturma yeteneği, React'i full-stack geliştirme için daha da cazip hale getirmektedir. ## Kurulum ve İlk Adımlar (2026) React ile bir projeye başlamak, 2026'da her zamankinden daha kolay. Modern araçlar sayesinde hızlıca bir geliştirme ortamı kurabilir ve ilk React uygulamanızı çalıştırabilirsiniz. Bu bölümde, popüler bir araç olan Vite kullanarak nasıl hızlıca bir React projesi oluşturacağınızı göstereceğim. Vite, hızlı başlangıç süreleri ve anında modül hot-reloading (HMR) gibi özellikleriyle `2026`'nın önde gelen build araçlarından biridir. ### Ön Gereksinimler: Başlamadan önce sisteminizde aşağıdaki yazılımların kurulu olduğundan emin olun: * **Node.js (LTS sürümü):** `Node.js 18.x` veya üzeri (2026 itibarıyla kararlı ve önerilen sürüm). * **npm veya Yarn:** Node.js ile birlikte gelirler. ### Adım Adım Kurulum: 1. **Vite ile Yeni Bir React Projesi Oluşturma:** Terminalinizi açın ve aşağıdaki komutu çalıştırın. `my-react-app-2026` yerine projenizin adını yazabilirsiniz. ```bash npm create vite@latest my-react-app-2026 -- --template react # veya yarn kullanıyorsanız: # yarn create vite my-react-app-2026 --template react ``` Bu komut, Vite'ın size birkaç soru sormasına neden olabilir. `react` şablonunu seçtiğinizden emin olun. 2. **Proje Klasörüne Gitme:** Oluşturulan proje klasörüne gidin. ```bash cd my-react-app-2026 ``` 3. **Bağımlılıkları Yükleme:** Projenin gerektirdiği npm paketlerini yükleyin. ```bash npm install # veya yarn kullanıyorsanız: # yarn ``` 4. **Uygulamayı Çalıştırma:** Geliştirme sunucusunu başlatın. ```bash npm run dev # veya yarn kullanıyorsanız: # yarn dev ``` Bu komut çalıştırıldığında, uygulamanız genellikle `http://localhost:5173` adresinde erişilebilir olacaktır. Tarayıcınızda bu adresi açarak ilk React uygulamanızı görebilirsiniz. > **Pro Tip:** 2026 yılında, geliştirme ortamı kurulumunda Vite gibi araçlar `create-react-app`'e göre genellikle daha hızlı ve hafiftir. Özellikle büyük projelerde başlangıç süreleri ve hot module replacement (HMR) performansı açısından önemli farklar yaratabilir. ## Temel Kullanım ve Örnekler React'in gücü, bileşen tabanlı yapısında ve state yönetimindeki esnekliğinde yatar. Bu bölümde, temel React kavramlarını pratik örneklerle ele alacağız. ### 1. Basit Bir Bileşen Oluşturma **Problem:** Kullanıcı arayüzünün temel yapı taşları olan yeniden kullanılabilir elementler oluşturmak. **Çözüm:** Fonksiyonel bileşenler ve JSX kullanarak basit bir `Merhaba` bileşeni oluşturalım. ```javascript // src/components/Merhaba.jsx import React from 'react'; function Merhaba(props) { return (

Merhaba, {props.ad}!

Bu, {props.yıl} yılına özel ilk React bileşeniniz.

); } export default Merhaba; ``` ```javascript // src/App.jsx import React from 'react'; import Merhaba from './components/Merhaba'; import './App.css'; function App() { return (
); } export default App; ``` ### 2. State Yönetimi (`useState` Hook'u) **Problem:** Bileşenin zamanla değişebilen verilerini yönetmek ve UI'ı bu değişikliklere göre güncellemek. **Çözüm:** `useState` hook'unu kullanarak basit bir sayaç bileşeni oluşturalım. ```javascript // src/components/Sayaç.jsx import React, { useState } from 'react'; function Sayac() { const [sayı, setSayı] = useState(0); const artır = () => { setSayı(prevSayı => prevSayı + 1); }; const azalt = () => { setSayı(prevSayı => prevSayı - 1); }; return (

Sayaç: {sayı}

Bu sayaç {new Date().getFullYear()} yılında güncellendi.

); } export default Sayac; ``` ### 3. Yan Etkileri Yönetme (`useEffect` Hook'u) **Problem:** Bileşenin render döngüsünden sonra veya belirli state/prop değişikliklerinde çalışması gereken işlemler (API çağrıları, DOM manipülasyonları, abonelikler) yapmak. **Çözüm:** `useEffect` hook'unu kullanarak bir API'dan veri çeken bir bileşen oluşturalım. ```javascript // src/components/VeriGetirici.jsx import React, { useState, useEffect } from 'react'; function VeriGetirici() { const [veri, setVeri] = useState(null); const [yukleniyor, setYukleniyor] = useState(true); const [hata, setHata] = useState(null); useEffect(() => { const fetchData = async () => { try { // 2026 için örnek bir API endpoint'i const response = await fetch('https://api.example.com/2026/data'); if (!response.ok) { throw new Error(`HTTP hatası! Durum: ${response.status}`); } const result = await response.json(); setVeri(result); } catch (error) { setHata(error); } finally { setYukleniyor(false); } }; fetchData(); // Cleanup fonksiyonu (bileşen unmount edildiğinde çalışır) return () => { console.log('Veri Getirici bileşeni temizlendi - 2026.'); }; }, []); // Boş bağımlılık dizisi, sadece ilk render'da çalışır if (yukleniyor) return

Veriler yükleniyor...

; if (hata) return

Hata oluştu: {hata.message}

; return (

API'dan Gelen Veri (2026)

{JSON.stringify(veri, null, 2)}
); } export default VeriGetirici; ``` ### 4. Form Kontrolü ve Input İşleme **Problem:** Kullanıcıdan input almak ve bu inputları React state'i ile yönetmek. **Çözüm:** Kontrollü bileşenler (controlled components) kullanarak bir form oluşturalım. ```javascript // src/components/KullaniciFormu.jsx import React, { useState } from 'react'; function KullaniciFormu() { const [isim, setIsim] = useState(''); const [email, setEmail] = useState(''); const handleSubmit = (event) => { event.preventDefault(); console.log(`2026 Yılında Gönderilen Form Verileri: İsim: ${isim}, Email: ${email}`); alert(`İsim: ${isim}, Email: ${email} - Veriler başarıyla gönderildi!`); // Burada API'ya veri gönderme işlemi yapılabilir }; return (
setIsim(e.target.value)} required />
setEmail(e.target.value)} required />
); } export default KullaniciFormu; ``` ## İleri Seviye Teknikler (2026) React'in temelini anladıktan sonra, performansı ve geliştirici deneyimini bir üst seviyeye taşıyacak ileri düzey tekniklere geçebiliriz. Bu teknikler, özellikle büyük ölçekli ve karmaşık 2026 projelerinde hayati öneme sahiptir. ### 1. Concurrent React ve Suspense `React 18.x` ile tanıtılan Concurrent React, UI'ı bloklamadan birden fazla state güncellemesini aynı anda işlemenizi sağlar. Bu, kullanıcı deneyimini önemli ölçüde iyileştirir. Suspense ise veri çekme veya kod yükleme gibi asenkron işlemler sırasında kullanıcıya bir yükleme göstergesi sunmak için kullanılır. **Nasıl Çalışır:** React, güncellemeleri öncelik sırasına koyabilir ve düşük öncelikli güncellemeleri duraklatıp yüksek öncelikli olanlara (örn. kullanıcı girişi) öncelik verebilir. Fiber mimarisi sayesinde bu mümkün olur. ```javascript // src/components/Profil.jsx import React, { Suspense } from 'react'; // Örnek: Veriyi asenkron olarak yükleyen bir fonksiyon const fetchUserProfile = () => { return new Promise(resolve => { setTimeout(() => { resolve({ ad: 'Burak Balkı', yıl: 2026, rol: 'Senior Developer' }); }, 2000); // 2 saniye gecikme simülasyonu }); }; const resource = createResource(fetchUserProfile()); function UserProfile() { const user = resource.read(); // Suspense burada devreye girer return (

Kullanıcı Profili (2026)

Ad: {user.ad}

Yıl: {user.yıl}

Rol: {user.rol}

); } // Basit bir resource oluşturma yardımcı fonksiyonu (gerçek dünyada daha karmaşık olur) function createResource(promise) { let status = 'pending'; let result; let suspender = promise.then( r => { status = 'success'; result = r; }, e => { status = 'error'; result = e; } ); return { read() { if (status === 'pending') throw suspender; if (status === 'error') throw result; return result; } }; } function AppWithSuspense() { return (

Concurrent React ve Suspense Örneği (2026)

Profil yükleniyor...
}>
); } export default AppWithSuspense; ``` > **Deneyim Notu:** Production ortamında Suspense ile veri çekme, genellikle Relay veya TanStack Query gibi kütüphanelerle entegre edilerek kullanılır. Kendi `createResource` implementasyonunuzu yazmak yerine bu kütüphaneleri tercih etmek, daha sağlam ve bakımı kolay çözümler sunar. ### 2. React Server Components (RSC) `2026` itibarıyla web geliştirmede devrim yaratan React Server Components (RSC), bileşenlerin sunucu tarafında render edilmesini ve sadece statik HTML ile etkileşimli client-side JavaScript'in bir kombinasyonunu istemciye göndermeyi mümkün kılar. Bu, ilk yükleme süresini kısaltır, bundle boyutunu küçültür ve veri çekme işlemlerini sunucuya taşıyarak performansı artırır. **Nasıl Çalışır:** RSC'ler, sunucuda çalışır, veritabanı erişimi gibi işlemleri doğrudan yapabilir ve nihai HTML'i veya özel bir formatı istemciye gönderir. İstemci tarafında ise sadece etkileşimli "Client Components" hidrasyon (hydration) sürecinden geçer. ```javascript // pages/index.js (Next.js 14+ app dizini örneği, 2026) // Bu dosya varsayılan olarak bir Server Component'tir. import ProductList from '../components/ProductList'; // Bu da bir Server Component olabilir import ClientButton from '../components/ClientButton'; // 'use client' ile işaretlenmiş Client Component async function getProducts() { // Bu işlem doğrudan sunucuda çalışır, API çağrısı veya veritabanı sorgusu olabilir. // Bu kod asla istemciye gönderilmez. const res = await fetch('https://api.example.com/2026/products', { cache: 'no-store' }); const products = await res.json(); return products; } export default async function HomePage() { const products = await getProducts(); return (

Ürün Kataloğu (2026)

{/* Etkileşimli bir buton */}
); } ``` ```javascript // components/ProductList.jsx (Server Component) // Bu dosya da varsayılan olarak bir Server Component'tir. export default function ProductList({ products }) { return ( ); } ``` ```javascript // components/ClientButton.jsx (Client Component) // 'use client' direktifi, bu bileşenin istemcide çalışacağını belirtir. 'use client'; import { useState } from 'react'; export default function ClientButton() { const [count, setCount] = useState(0); return ( ); } ``` > **Önemli:** React Server Components, özellikle Next.js App Router gibi framework'lerle tam potansiyeline ulaşır. Backend geliştiriciler olarak, RSC'lerin API katmanınızla nasıl etkileşime girdiğini ve veri akışını nasıl optimize ettiğini anlamak, 2026'da modern web uygulamaları geliştirmek için kritik öneme sahiptir. ### 3. Context API ile Global State Yönetimi **Problem:** Prop drilling'i (prop'ları birden fazla seviye derine indirme) önleyerek global bir state'i bileşenler arasında paylaşmak. **Çözüm:** React'in yerleşik Context API'ını kullanarak bir tema yönetimi örneği yapalım. ```javascript // src/contexts/ThemeContext.jsx import React, { createContext, useState, useContext } from 'react'; // 1. Context oluştur const ThemeContext = createContext(null); // 2. Provider bileşeni oluştur export const ThemeProvider = ({ children }) => { const [theme, setTheme] = useState('light'); const toggleTheme = () => { setTheme(prevTheme => (prevTheme === 'light' ? 'dark' : 'light')); }; // 2026'da Context değeri olarak hem state'i hem de fonksiyonu sunuyoruz. const contextValue = { theme, toggleTheme }; return ( {children} ); }; // 3. Custom Hook ile Context'i tüket export const useTheme = () => { const context = useContext(ThemeContext); if (!context) { throw new Error('useTheme hooku ThemeProvider içinde kullanılmalı.'); } return context; }; ``` ```javascript // src/components/ThemeToggle.jsx import React from 'react'; import { useTheme } from '../contexts/ThemeContext'; function ThemeToggle() { const { theme, toggleTheme } = useTheme(); return ( ); } export default ThemeToggle; ``` ```javascript // src/App.jsx (ThemeProvider ile sarmalama) import React from 'react'; import { ThemeProvider } from './contexts/ThemeContext'; import ThemeToggle from './components/ThemeToggle'; import './App.css'; function App() { return (

React Context API Örneği (2026)

Uygulama teması değiştiğinde bu metin de etkilenecektir.

); } export default App; ``` ### 4. Custom Hooks **Problem:** Bileşenler arasında stateful logic'i yeniden kullanmak ve karmaşık bileşen logic'ini daha küçük, yönetilebilir birimlere ayırmak. **Çözüm:** Bir pencere genişliğini takip eden basit bir custom hook oluşturalım. ```javascript // src/hooks/useWindowWidth.js import { useState, useEffect } from 'react'; function useWindowWidth() { const [width, setWidth] = useState(window.innerWidth); useEffect(() => { const handleResize = () => setWidth(window.innerWidth); window.addEventListener('resize', handleResize); return () => { window.removeEventListener('resize', handleResize); console.log('useWindowWidth temizlendi - 2026'); }; }, []); return width; } export default useWindowWidth; ``` ```javascript // src/components/WindowSizeDisplay.jsx import React from 'react'; import useWindowWidth from '../hooks/useWindowWidth'; function WindowSizeDisplay() { const windowWidth = useWindowWidth(); return (

Pencere Genişliği (2026)

Mevcut pencere genişliği: {windowWidth}px

{windowWidth < 768 &&

Mobil görünümdesiniz.

}
); } export default WindowSizeDisplay; ``` ## Best Practices & Anti-Patterns (2026) React uygulamalarını 2026'da verimli, bakımı kolay ve ölçeklenebilir kılmak için belirli en iyi uygulamaları takip etmek ve yaygın anti-pattern'lardan kaçınmak önemlidir. Ekibimizde React'e geçiş sürecinde öğrendiğimiz 3 kritik ders, bu bölümde özetlenmiştir. ### Best Practices (✅ DOĞRU) * ✅ **Bileşenleri Küçük ve Odaklı Tutun:** Her bileşen tek bir sorumluluğa sahip olmalı. Bu, test etmeyi, yeniden kullanmayı ve bakımı kolaylaştırır. * ✅ **Prop Drilling Yerine Context API veya State Yönetim Kütüphaneleri Kullanın:** Derinlemesine prop geçişi, kodun okunabilirliğini ve esnekliğini azaltır. Global state yönetimi için Context API, Redux veya TanStack Query gibi çözümleri tercih edin. * ✅ **`key` Prop'unu Doğru Kullanın:** Liste öğeleri için benzersiz ve kararlı `key` prop'ları kullanmak, React'in liste render optimizasyonlarını doğru yapmasını sağlar. `index`'i `key` olarak kullanmaktan kaçının, özellikle liste değişiyorsa. * ✅ **Hata Sınırları (Error Boundaries) Kullanın:** Uygulamanızın bir bölümündeki bir hatanın tüm uygulamayı çökertmesini engellemek için hata sınırları tanımlayın. Bu, kullanıcı deneyimini artırır. * ✅ **Memoization Kullanın (`React.memo`, `useCallback`, `useMemo`):** Gereksiz yeniden render'ları önlemek için bu hook'ları akıllıca kullanın. Özellikle pahalı hesaplamalar veya referans eşitliği bozulabilecek fonksiyonlar için faydalıdırlar. * ✅ **Erişilebilirlik (Accessibility) Odaklı Geliştirin:** `aria-*` özelliklerini ve anlamsal HTML etiketlerini kullanarak uygulamanızın tüm kullanıcılar için erişilebilir olduğundan emin olun. 2026'da bu, yasal bir zorunluluk haline gelmeye başlamıştır. * ✅ **Formları Kontrollü Bileşenler (Controlled Components) ile Yönetin:** Form input'larının değerlerini React state'i ile eşleştirerek input'lar üzerinde tam kontrol sağlayın ve doğrulama işlemlerini kolaylaştırın. * ✅ **Linting ve Biçimlendirme Araçları Kullanın:** ESLint ve Prettier gibi araçlar, kod kalitesini artırır, tutarlılık sağlar ve hataları erken yakalar. 2026'da bu araçlar CI/CD pipeline'larının ayrılmaz bir parçasıdır. * ✅ **React Server Components (RSC) ve Streaming'i Değerlendirin:** Özellikle performans ve ilk yükleme süresi kritik olan uygulamalarda, RSC'ler ve veri akışı (streaming) mimarisini benimsemek önemli avantajlar sunar. ### Anti-Patterns (❌ YANLIŞ) * ❌ **`useEffect` İçinde Gereksiz API Çağrıları:** `useEffect` bağımlılık dizisini doğru ayarlamamak, bileşenin her render'ında API çağrısı yapılmasına neden olabilir, bu da performans sorunları yaratır. * ❌ **Prop Drilling'i Aşırı Kullanmak:** Çok katmanlı bileşen hiyerarşilerinde prop'ları gereksiz yere aşağıya doğru geçirmek, kodun karmaşıklığını artırır ve refactoring'i zorlaştırır. * ❌ **`index`'i `key` Olarak Kullanmak (Değişen Listelerde):** Listelerdeki öğelerin sırası değiştiğinde veya öğeler eklendiğinde/çıkarıldığında `index`'i `key` olarak kullanmak, hatalı UI güncellemelerine ve performans sorunlarına yol açar. * ❌ **Doğrudan DOM Manipülasyonu:** React, Sanal DOM aracılığıyla DOM'u yönetir. `document.getElementById` gibi doğrudan DOM manipülasyonlarından kaçının; bu, React'in çalışma prensibini bozar. * ❌ **State'i Doğrudan Değiştirmek:** `this.state.sayı = 5` veya `myArray.push(item)` gibi doğrudan state değişiklikleri yapmak, React'in güncellemeleri algılamasını engeller. Her zaman `setState` veya `useState`'in setter fonksiyonunu kullanın. * ❌ **Gereksiz Yere Yeni Fonksiyonlar Oluşturmak (Render İçinde):** Bileşenin her render'ında yeni fonksiyonlar (özellikle event handler'lar) oluşturmak, referans eşitliğini bozar ve `useCallback` kullanılmadığında gereksiz yeniden render'lara yol açabilir. ## Yaygın Hatalar ve Çözümleri (2026) React geliştirirken karşılaşılan bazı yaygın hatalar ve bunların çözümleri, projenizin sorunsuz ilerlemesini sağlayacaktır. Production ortamında React kullanırken karşılaştığım en yaygın sorunlardan bazılarını burada ele alıyorum. ### 1. Hata: `Maximum update depth exceeded` * **Problem:** Bu hata genellikle bir state güncelleme fonksiyonunun `useEffect` veya bileşenin render döngüsü içinde koşulsuz olarak çağrılmasıyla oluşur, bu da sonsuz bir döngüye neden olur. Örneğin, `useState`'in setter fonksiyonunu direkt olarak `onClick` yerine `onClick={setCount(count + 1)}` şeklinde çağırmak. * **Sebep:** React, state güncellendiğinde bileşeni yeniden render eder. Eğer bu yeniden render, tekrar state güncellemesini tetiklerse, sonsuz bir döngüye girilir. * **Çözüm:** State güncelleme fonksiyonlarını bir callback içine alın veya `useEffect` bağımlılıklarını doğru ayarlayın. ```javascript // ❌ YANLIŞ // // ✅ DOĞRU // ❌ YANLIŞ useEffect kullanımı // useEffect(() => { setCount(count + 1); }); // Bağımlılık dizisi yok, her render'da çalışır // ✅ DOĞRU useEffect kullanımı (sadece bir kez çalışır) useEffect(() => { // Bazı yan etkiler }, []); ``` ### 2. Hata: `Each child in a list should have a unique "key" prop` * **Problem:** Bir dizi veri render edilirken, her liste öğesine benzersiz bir `key` prop'u verilmezse bu uyarı alınır. * **Sebep:** React, liste öğelerini verimli bir şekilde güncellemek için `key` prop'unu kullanır. `key` olmadan, React hangi öğenin değiştiğini, eklendiğini veya silindiğini takip etmekte zorlanır, bu da hatalı UI güncellemelerine ve performans düşüşlerine yol açabilir. * **Çözüm:** Listenizdeki her öğe için kararlı ve benzersiz bir kimlik (örneğin bir `id`) kullanın. ```javascript // ❌ YANLIŞ // {items.map((item, index) =>
  • {item.name}
  • )} // ✅ DOĞRU (eğer item.id benzersizse) {items.map(item =>
  • {item.name}
  • )} ``` ### 3. Hata: `Can't perform a React state update on an unmounted component` * **Problem:** Bir bileşen DOM'dan kaldırıldıktan (unmount) sonra state'ini güncellemeye çalışıldığında bu uyarı alınır. Genellikle asenkron işlemler (API çağrıları) bileşen kaldırıldıktan sonra tamamlandığında ortaya çıkar. * **Sebep:** Asenkron bir işlem başlatıldığında bileşen hala mount edilmiş olabilir, ancak işlem tamamlandığında bileşen artık ekranda olmayabilir. Bu durumda state güncellemesi gereksiz ve potansiyel olarak hatalıdır. * **Çözüm:** `useEffect`'in cleanup fonksiyonunu kullanarak asenkron işlemlerin durumunu takip edin veya state güncellemesini koşullu hale getirin. ```javascript useEffect(() => { let isMounted = true; // Bileşenin mount durumunu takip et const fetchData = async () => { // ... API çağrısı ... if (isMounted) { // Sadece bileşen mount edilmişse state'i güncelle // setVeri(result