React Router Kullanımı: Frontend Geliştirme İçin Kapsamlı Rehber

Modern web uygulamaları, tek sayfa uygulamaları (SPA) olarak kullanıcı deneyimini üst seviyeye taşıyan bir navigasyon akışına ihtiyaç duyar. Bu bağlamda yönlendirme ve rotalandırma işlemleri sadece URL değişimini yönetmekten çıkıp, uygulamanın ana akışını oluşturan bir mekanizmaya dönüşür. React ekosistemi bu ihtiyaç için güçlü bir çözüme sahiptir: React Router. Bu rehberde, React Router’ın temellerinden başlayarak ileri düzey konulara kadar ayrıntılı bir yol haritası sunulacak; kurulumu, temel kullanım senaryoları, dinamik parametreler, nested routing, korumalı rotalar, lazy loading ve performans odaklı yaklaşımlar adım adım ele alınacaktır. İçerik, uygulamalı örnekler ve pratik ipuçları ile zenginleştirilmiştir.

React Router’a Giriş ve Temel Kavramlar

React Router’a Giriş ve Temel Kavramlar

React Router, URL değişikliklerini yakalayarak bileşen ağacını buna göre güncelleyen bir yönlendirme kütüphanesidir. React ile birlikte SPA mimarisinde sayfa yüklemesi olmadan gezinmeyi mümkün kılar. İlk aşamada temel kavramlar şunlardır: route (rota), link (bağlantı), konum (location) ve bağlantı durumu (history). Temelde her rota, bir URL deseni ile ilişkilendirilmiş bir React bileşenidir ve kullanıcının tarayıcı adres çubuğunda bir değişiklik yapmasıyla eşleşen bileşen render edilir.

Günümüzde yaygın olarak kullanılan sürüm olan React Router v6 ile Routes ve Route bileşenleri üzerinden yapılandırma yapılır. Bu sürüm, daha sade bir API ve yeni yaklaşım olan route objects veya element üzerinden yapılandırma sunar. Ayrıca useNavigate, useParams, useLocation gibi hook’lar ile rotalar arası etkileşim ve konum bilgisine kolay erişim sağlanır.

Kurulum ve İlk Adımlar

Kurulum ve İlk Adımlar

Bir proje üzerinde React Router’ı kullanmaya başlamadan önce bağımlılıkları eklemek gerekir. Aşağıdaki komutlar, Create React App veya benzeri bir proje yapısında çalışır durumda olan bir React uygulamasına uygulanabilir:

npm install react-router-dom@6
# veya
yarn add react-router-dom@6

Sonrasında kök seviyesinde BrowserRouter bileşeni ile uygulama sarmalanır ve Routes ile tanımlanan rotalar kullanıma hazır hale gelir. Basit bir örnek aşağıdaki gibidir:

import React from 'react';
import { BrowserRouter, Routes, Route, Link } from 'react-router-dom';

function Home() {
  return 

Ana Sayfa

; } function About() { return

Hakkında

; } export default function App() { return ( } /> } /> ); }

Bu örnek, temel bir gezinme akışını ve iki basit bileşenin nasıl yönlendirme ile eşleştiğini gösterir. Routes kapsayıcısı, Route öğelerinin hangi URL’lerle eşleşeceğini belirler ve her Route için bir element özelliği ile render edilecek bileşen ifade edilir.

Dinamik Parametreler ve Yol Yapılandırması

Gerçek dünya uygulamalarında kullanıcıya özgü içerikler göstermek için dinamik parametreler kullanılır. Örneğin bir ürün sayfasında ürün kimliği URL içerisinde yer alabilir. Bu durumda rota yapılandırması şu şekilde genişletilir:

import { BrowserRouter, Routes, Route, useParams } from 'react-router-dom';

function Product() {
  const { id } = useParams();
  return 
Ürün Detayları: {id}
; } export default function App() { return ( } /> ); }

useParams(), rota deseninde bulunan parametreleri okumak için kullanılır. Bu sayede kullanıcı bir ürüne ait sayfayı ziyaret ettiğinde, o ürün için ilgili veriyi sunucudan veya önbellekten çekip göstermek mümkün olur. Ayrıca parametreye bağlı render mantığını, bileşenlerin yeniden render edilmesini engelleyecek şekilde optimize etmek performans açısından değerlidir.

Birden çok parametre veya zorunlu/opsiyonel parametreler için esnek bir yapı kurmak önemlidir. Örneğin, ürün sayfası yanında kategori filtreleri için sorgu parametreleri de kullanılarak URL’ler şu şekilde genişletilebilir: /products?category=electronics&page=2. Bu tür durumlarda useLocation() ile arama parametreleri okunabilir ve yakalanabilir.

İç İçe (Nested) Rotlar ve Hiyerarşik Yapı

Bir uygulama genellikle ana bölüm ve alt bölümlerden oluşan bir hiyerarşiye sahiptir. Nested routes, bu yapıyı URL yapısına yansıtmanın etkili bir yoludur. Örneğin, bir kullanıcı profil sayfasında alt sekmeler veya alt sayfalar olabilir. Bu durumda, üst bileşen kendi içindeki Routes içinde alt rotaları tanımlar:

function UserLayout() {
  return (
    

Kullanıcı Paneli

); } function UserProfile() { return
Kullanıcı Profili
; } function UserSettings() { return
Kullanıcı Ayarları
; } export default function App() { return ( }> } /> } /> ); }

Bu yapı, kullanıcı sayfasını bir kapsayıcı (layout) içerisinde toplayır ve içteki alt rotalar, ilgili içerikleri Outlet üzerinden render eder. Outlet, alt rotaların yerleştirileceği alanı temsil eder ve kullanıcı arayüzünde doğal bir akış sağlar. Nested routing, kullanıcı deneyimini zenginleştirir ve URL yapısını temiz tutar.

Ağır Yüklemeli Uygulamalarda Lazy Loading ve Suspense

Günümüz uygulamaları, başlangıç yüklemesini olabildiğince hızlı tutmak için sayfaları ve rota bileşenlerini tembel yükleme (lazy loading) ile yükler. Bu yaklaşım, yalnızca kullanıcı ilgili rotaya gittiğinde o bileşenin yüklenmesini sağlar. React Router ile birlikte React.lazy ve Suspense kullanılarak bu mümkün olur. Aşağıdaki örnek, route tabanlı lazy loading’i gösterir:

import { BrowserRouter, Routes, Route } from 'react-router-dom';
import React, { Suspense, lazy } from 'react';

const Home = lazy(() => import('./pages/Home'));
const About = lazy(() => import('./pages/About'));

export default function App() {
  return (
    
      Yükleniyor...}>
        
          } />
          } />
        
      
    
  );
}

Suspense bileşeni, lazy yüklenen içeriğin hazır olmadığı anlarda gösterilecek geri dönüşü belirler. Bu mekanizma, kullanıcıya kesintisiz bir deneyim sunarken bundle boyutunu da küçültür. Ayrıca, route level code splitting ile her rota için ayrı bundle’lar oluşturulur ve yalnızca gerekli olanlar indirilebilir.

Koruma ve Erişim Kontrolleri: Korunaklı Rotlar

Bir uygulamada kimlik doğrulama gerektiren sayfalara erişimi sınırlamak önemli bir güvenlik ve kullanıcı deneyimi konusudur. React Router ile korumalı rotaları kolayca yapılandırabilirsiniz. Yaygın bir yaklaşım, kullanıcı oturumu mevcutsa belirli rotalara yönlendirmek ve aksi halde giriş sayfasına yönlendirmektir. Basit bir örnek:

import { Navigate, Outlet } from 'react-router-dom';

function PrivateRoute({ isAuthenticated }) {
  return isAuthenticated ?  : ;
}

export default function App({ isAuthenticated }) {
  return (
    
      
        } />
        }>
          } />
          } />
        
      
    
  );
}

Bu yaklaşım, kullanıcı durumunu temel alarak dinamik olarak erişim kontrolü sağlar. Kullanıcı oturum açmadıysa, yetkisiz erişim talepleri otomatik olarak yönlendirilir ve güvenli alanlar korunur. Ayrıca useLocation ve query parametreleri ile kullanıcı hedefe yaklaşırken gezinim akışı üzerinde daha ince kontroller uygulanabilir.

Veri Yükleme ve Yönlendirme: useNavigate ve useLocation

Router kullanımı ile yönlendirmeler sadece linkler üzerinden yapılmaz; programatik yönlendirme de önemli bir rol oynar. useNavigate ile kullanıcı etkileşimleri sonucunda sayfalar arası geçişler tetiklenebilir. Örneğin bir form başarıyla submit olduğunda kullanıcıyı bir son sayfaya yönlendirmek mümkün olur:

import { useNavigate } from 'react-router-dom';

function FormSuccess() {
  const navigate = useNavigate();
  React.useEffect(() => {
    navigate('/dashboard', { replace: true });
  }, [navigate]);
  return null;
}

useLocation ise mevcut konum bilgisine erişim sağlar; sorgu parametreleri, hash fragment ve diğer yol bilgisini okuyabiliriz. Özellikle kullanıcı akışını kaybettikten sonra geri dönüş noktalarını belirlemek için kullanışlıdır. Örneğin, kullanıcı giriş yaptığında önceki hedefi hatırlamak için kullanılır.

Yönlendirme davranışını kullanıcı deneyimini bozmadan yönetebilmek için, tarayıcı geçmişini yönetme stratejileri üzerinde düşünmek gerekir. replace seçeneği ile yönlendirme yapılırken geçmişe bir adım eklenmez ve kullanıcı geri butonuna bastığında önceki sayfaya dönemez; bu, akışın bozulmaması için tercih edilebilen bir yaklaşımdır.

Hata Yakalama ve Yedekleme: Hata Sayfaları ve Rota Tasarımı

Bir rota yapılandırmasında, istenmeyen URL’ler veya hata durumları için kullanıcıya bilgilendirici ve yönlendirme sağlayan hata sayfaları tasarlamak önemlidir. React Router’da, bilinmeyen rotalar için bir catch-all yolunu tanımlamak, kullanıcı deneyimini iyileştirir. Ayrıca bir hata sınırını (error boundary) kullanarak rota içeriklerinde oluşabilecek çökmeleri kontrollü bir şekilde ele almak da mümkündür.

function NotFound() {
  return 

Sayfa bulunamadı

; } export default function App() { return ( } /> } /> } /> ); }

Rota tasarımında, içeriklerin yüklenmesi sırasında oluşabilecek gecikmeleri yönetmek için lifecycle benzeri davranışları düşünmek gerekir. Özellikle data fetching işlemleri, kullanıcıya gereksiz bekleme süresi yaşatmadan, parça parça yüklenebilir hale getirilmelidir. Bu durum, kullanıcının sayfa üzerinde gezinmesini kesintiye uğratmaz ve yüklenme durumlarını net bir şekilde iletir.

Geliştirme ve Test İçin İpuçları

Bir rota mimarisini geliştirirken ve test ederken göz önünde bulundurulması gereken birkaç pratik ipucu vardır. Bunlar, kullanıcı deneyimini bozmadan hataları yakalamaya, performansı optimize etmeye ve kod okunabilirliğini artırmaya yöneliktir.

LSI ve Trend Kelimelerle Doğal İçerik Oluşturma

Güncel içerik oluştururken, kullanıcıların gerçek ihtiyaçlarını hedeflemek önemli. Doğal olarak benimsenmiş LSI (Latent Semantic Indexing) odaklı anahtar kavramlar, içeriğin konusunu genişletir ve arama motorlarında daha iyi bağlam sağlar. Bu kapsamda, meta bilgi olmadan da içerik içinde şu tür kavramlar doğal akışla yer alır:

Bu kavramlar, yazının akışını zenginleştirir ve kullanıcıya değerli teknik bilgiler sağlar. İçerik boyunca, gerçek dünyadan örneklerle bu kavramların nasıl uygulandığını gösteren kod parçaları ve neden-sonuç ilişkileriyle birleştirilir.

Örnek Proje Akışında React Router Kullanımı

Bir örnek projeyi düşünelim: bir e-ticaret yanı sıra bir kullanıcı hesabı bölümü olan bir SaaS paneli. Ana navigasyon ana sayfa, ürünler, kullanıcı hesabı ve destek gibi bölümlerden oluşur. Ürünler sayfasında kategori filtresi ve ürün detay sayfası gerekir. Kullanıcı hesabında Profil, Settings ve Order History gibi alt sayfalar bulunur. Bu durumlar için nested routing, dinamik parametreler ve korumalı rotalar bir araya getirildiğinde, kullanıcı akışı temiz ve ölçeklenebilir bir mimari elde edilir.

Bu akışa uygun olarak, ana bileşenler şu şekilde yapılandırılabilir:

import { BrowserRouter, Routes, Route } from 'react-router-dom';

// Ana sayfa, ürünler ve kullanıcı alanı için ana kapsayıcılar
function HomePage() { /* ... */ }
function ProductsPage() { /* ... */ }
function ProductDetail() { /* ... */ }
function UserPanel() { /* ... */ }
function UserProfile() { /* ... */ }
function UserSettings() { /* ... */ }

export default function App() {
  return (
    
      
        } />
        } />
        } />
        }>
          } />
          } />
        
      
    
  );
}

Bu yapı, ana gezinmeyi net bir şekilde belirler ve her bölüm için gerekli alt rotaları kapsar. Ürün detayı sayfasında, useParams ile ürün kimliği alınır ve bu kimlik üzerinden ilgili veriler API’dan çekilir. Kullanıcı panelinde ise kullanıcı deneyimini kesintiye uğratmamak için korumalı rotalar ve Not Found sayfaları kullanıcının güvenliğini sağlar.

Performans ve Erişilebilirlik Entegrasyonu

React Router’ın kullanımı, yalnızca navigasyonu değil, performans ve erişilebilirliği de doğrudan etkiler. Performans için lazy loading ve Suspense ile bileşenleri ihtiyaç duyulana kadar yüklemek önemli. Erişilebilirlik için, yönlendirme elementlerinde net içerik ve klavye gezinti akışını sağlamak gerekir. İleri düzey uygulamalarda, yönlendirme ile ilgili olaylar için ARIA rol ve açıklamalarını doğru kullanmak, ekran okuyucular için içeriğin net anlaşılmasını sağlar.

Özet olarak, React Router kullanımı sadece navigasyonu yönetmek değildir; aynı zamanda kullanıcı deneyimini iyileştiren, performansı artıran ve erişilebilirliği güçlendiren bir mimari çalışmasıdır. Doğru yapılandırılmış rotalar, dinamik parametreler ve korumalı alanlar ile uygulamanın güvenliğini ve kullanıcı memnuniyetini artırmak mümkündür.

Sıkça Sorulan Sorular (SSS)

React Router nedir?
React Router, tek sayfalı uygulamalarda URL değişikliklerini izleyerek hangi bileşenlerin render edileceğini belirleyen bir yönlendirme kütüphanesidir.
React Router hangi sürümü en çok kullanılıyor?
Güncel projelerde React Router v6 yaygın olarak kullanılır; Routes ve Route bileşenleri ile sade ve güçlü bir API sunar.
Dinamik parametreler nasıl alınır?
useParams hook'u ile rota deseninde tanımlanan parametreler okunabilir. Örneğin /product/:id rotasında id parametresi kullanılır.
Nested Routes nedir ve neden kullanılır?
Nested Routes, hiyerarşik rotalar oluşturarak kapsayıcı bir layout içinde alt rotaları render eder. Bu, sayfa yapısını temiz ve ölçeklenebilir kılar.
Lazy loading nasıl uygulanır?
React.lazy ile bileşenler tembel yüklemeye alınır ve Suspense ile yüklenme sırasında gösterilecek geri dönüş belirlenir; bu, initial yüklemeyi hızlandırır.
Korumalı rotalar nasıl oluşturulur?
Kullanıcı oturum durumu temel alınarak yönlendirme yapılır. Yetkisiz kullanıcılar login sayfasına yönlendirilir; gerekirse Outlet ve Navigate birleşimi kullanılır.
useNavigate ne işe yarar?
useNavigate, programatik olarak sayfalar arası geçiş yapmanızı sağlar. Örneğin bir işlem sonrası otomatik yönlendirme için kullanılır.
Not Found sayfası ne zaman gösterilir?
Tanımlı olmayan URL’ler için wildcard (*) rotası kullanılarak Not Found benzeri bir sayfa render edilir.
Performans açısından nelere dikkat edilmeli?
Kod bölme (code splitting), lazy loading, bundle boyutu optimizasyonu ve gereksiz render’ların önüne geçilmesi performansı doğrudan etkiler.
Erişilebilirlik neden önemli?
Yönlendirme ve içerik, klavye navigasyonu ve ekran okuyucular için anlamlı ve kolay anlaşılır olmalıdır; ARIA ve uygun odak yönetimi bu noktada kritik rol oynar.

Benzer Yazılar