Takip et

React Router v6 Kılavuzu: v5’ten v6’ya Geçişin Tam Detayları

React uygulamalarınızda sayfa geçişleri, dinamik rotalar ve karmaşık yönlendirme senaryoları sizi zorluyor mu? Tek sayfa uygulamaların (SPA) vazgeçilmezi olan yönlendirme süreçlerini modern, temiz ve performanslı bir şekilde yönetmek isteyenler için React Router v6, pek çok yenilik ve basitleştirme sunuyor. Bu kapsamlı rehber, React Router v5’ten v6’ya geçişin tüm önemli detaylarını, yeni API’leri ve pratik kod örneklerini adım adım açıklayarak uygulamanızın yönlendirme yapısını geleceğe taşımanızı sağlayacak.

Modern web uygulamaları, kullanıcı deneyimini zenginleştirmek ve sayfa yenilemeleri olmadan hızlı geçişler sağlamak amacıyla tek sayfa uygulama (SPA) mimarisini benimsemektedir. Bu mimaride, farklı içerikleri veya görünümleri göstermek için tarayıcının URL’sini değiştirmek, ancak sunucudan tam bir sayfa yüklemesi yapmamak esastır. İşte bu noktada, React Router gibi bir yönlendirme kütüphanesi devreye girer. React Router, URL’ye dayalı olarak React bileşenlerini koşullu olarak oluşturmanıza olanak tanıyarak karmaşık navigasyon yapılarını basit ve yönetilebilir hale getirir. Ancak teknolojiler evrildikçe, eski yaklaşımlar yerini daha verimli ve optimize edilmiş çözümlere bırakır. React Router da bu değişimin bir parçası olarak v5’ten v6’ya önemli bir revizyon geçirdi.

v5 sürümü zaten oldukça popüler ve güçlü bir araç olmasına rağmen, v6 daha az kod yazmayı, daha iyi performans elde etmeyi ve özellikle iç içe yönlendirmelerde (nested routing) daha sezgisel bir deneyim sunmayı hedefliyor. Bu yeni sürüm, geliştiricilerin karşılaştığı yaygın sorunlara modern çözümler getirerek hem yeni projeler için mükemmel bir başlangıç noktası oluyor hem de mevcut v5 tabanlı uygulamaları güncellemeyi düşünenlere yol gösteriyor. Örneğin, v5’teki Switch bileşeninin yerini alan Routes bileşeni, rotaların eşleşme mantığını kökten değiştirirken, useHistory hook’u yerine gelen useNavigate ise programatik yönlendirmeyi daha esnek hale getiriyor. Bu rehber boyunca, v5 ve v6 arasındaki temel farklılıkları ayrıntılı kod örnekleriyle inceleyecek, v6’nın sunduğu yenilikleri derinlemesine keşfedecek ve gerçek dünya senaryolarında nasıl uygulanabileceğini göstereceğiz. Amacımız, React Router v6’ya sıfırdan başlayanlar için eksiksiz bir kaynak sunmak ve deneyimli geliştiricilerin de bilgi birikimlerini güncellemelerine yardımcı olmaktır. Hadi gelin, React Router v6’nın büyülü dünyasına dalalım ve uygulamalarımızı bir üst seviyeye taşıyalım!

React Router’a Yeni Başlayanlar İçin Temel Kavramlar Nelerdir?

React Router v6’nın derinliklerine dalmadan önce, yönlendirme (routing) kavramının temellerini ve React ekosistemindeki yerini anlamak büyük önem taşır. Yönlendirme, bir web uygulamasının farklı URL’lere veya yollara (paths) göre farklı içerikler veya bileşenler göstermesini sağlayan mekanizmadır. Geleneksel olarak, bir kullanıcı farklı bir sayfaya gittiğinde tarayıcı, sunucudan tamamen yeni bir HTML sayfası isterdi. Ancak SPA’larda (Single Page Applications), bu durum farklıdır. Tarayıcıda sadece bir kez HTML sayfası yüklenir ve sonrasında sayfa içi navigasyonlar JavaScript ile yönetilir, bu da “client-side routing” olarak adlandırılır.

React Router, bu client-side routing’i React bileşenleri aracılığıyla kolayca gerçekleştirmenizi sağlayan popüler bir kütüphanedir. Temel olarak, belirli bir URL deseniyle eşleşen bir bileşenin render edilmesini sağlar. React Router’ın kalbinde yatan birkaç temel bileşen ve hook bulunmaktadır:

React Router v6, tüm bu temel bileşenleri ve yeni nesil hook’ları (örneğin useNavigate, useParams, useLocation) bir araya getirerek, karmaşık yönlendirme gereksinimlerini bile şaşırtıcı derecede basit ve anlaşılır bir şekilde ele almanızı sağlar. Şimdi, bu temel yapı taşlarını zihnimize yerleştirdikten sonra, v5 ve v6 arasındaki dönüşümün ve yeniliklerin derinliklerine inmeye hazırız.

React Router v5 ve v6 Arasındaki Temel Farklar Nelerdir?

React Router v6, selefi v5’e göre pek çok açıdan basitleştirme ve modernizasyon getirmiştir. Bu değişiklikler, daha temiz kod, daha sezgisel API’ler ve gelişmiş performans sunmayı hedefler. V5’ten v6’ya geçiş yapmayı düşünen veya direkt v6 ile başlayacak geliştiriciler için bu temel farklılıkları anlamak kritik öneme sahiptir.

1. Switch Yerine Routes Bileşeni

React Router v5’te, rotaların tanımlanması ve eşleştirilmesi için bileşeni kullanılırdı. Switch, içerisindeki bileşenlerini baştan sona tarar ve URL ile eşleşen ilk rotayı render ederdi. Bu, özellikle karmaşık rota hiyerarşilerinde veya exact prop’unu yanlış kullanırken beklenmedik davranışlara yol açabilirdi.
şeklinde kullanılan exact prop’u, yolun tam olarak eşleşmesini sağlamak için gerekliydi.

React Router v6’da ise yerine bileşeni tanıtıldı. Routes, rotaların eşleşme algoritmasını kökten değiştirerek exact prop’una olan ihtiyacı ortadan kaldırmıştır. Artık Routes içerisindeki Route‘lar, en spesifik olandan en genel olana doğru bir eşleşme arar ve bu doğal olarak en uygun rotayı seçer. Ayrıca, Routes içinde iç içe (nested) rotaların daha kolay tanımlanmasına imkan tanır. Bu sayede, kodunuz daha okunabilir ve yönetilebilir hale gelir.

V5 Örneği:


import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';

function AppV5() {
  return (
    
      
        
        
        
        
      
    
  );
}
    

V6 Örneği:


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

function AppV6() {
  return (
    
      
        } />
        } />
        } />
        } />
      
    
  );
}
    

2. useHistory Yerine useNavigate Hook'u

V5'te, programatik olarak (bir olay veya durum değişikliğine bağlı olarak) bir sayfaya yönlendirme yapmak için useHistory hook'u kullanılırdı. Bu hook, geçmiş nesnesine erişim sağlar ve history.push('/yeni-yol') veya history.replace('/yeni-yol') gibi metotlarla yönlendirme yapılırdı.

React Router v6'da useHistory hook'u kaldırılmış ve yerine useNavigate hook'u gelmiştir. useNavigate, daha basit ve daha güçlü bir API sunar. Bir fonksiyon döndürür ve bu fonksiyonu çağırarak yönlendirme yapabilirsiniz. Ayrıca, geçmişte kaç adım geri gideceğinizi belirtmek için sayısal bir değer de alabilir.

V5 Örneği:


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

function LoginPageV5() {
  const history = useHistory();

  const handleLogin = () => {
    // ... Giriş işlemleri ...
    history.push('/dashboard');
  };

  return (
    
  );
}
    

V6 Örneği:


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

function LoginPageV6() {
  const navigate = useNavigate();

  const handleLogin = () => {
    // ... Giriş işlemleri ...
    navigate('/dashboard'); // Yönlendirme
    // navigate(-1); // Bir önceki sayfaya dön
  };

  return (
    
  );
}
    

3. İç İçe Yönlendirmeler (Nested Routes) ve Outlet

V5'te iç içe yönlendirmeler, ana rotanın içinde tekrar tanımları yaparak yönetilirdi. Bu durum, özellikle karmaşık hiyerarşilerde kod tekrarına ve okunabilirlik sorunlarına yol açabiliyordu. Ayrıca, alt rotaların üst rotadaki bir bileşenin içinde render edilmesi için özel prop'ların geçirilmesi veya render fonksiyonlarının kullanılması gerekebilirdi.

React Router v6, iç içe yönlendirmeleri çok daha zarif bir şekilde ele alır. Üst , alt rotaları tanımlayabilir ve bu alt rotaların bileşenleri, üst bileşen içinde bileşeni kullanılarak render edilir. Bu, ortak layout'ları ve paylaşılan bileşenleri çok daha kolay yönetmenizi sağlar. Relative paths (göreceli yollar) kullanımı da bu süreçte büyük bir kolaylık sunar.

V5 Örneği (Karmaşık):


// ParentComponent.js
import { Switch, Route, useRouteMatch } from 'react-router-dom';

function ParentComponent() {
  let { path, url } = useRouteMatch();
  return (
    

Parent Component

Parent Index

${path}/child1
}> ${path}/child2}>
); } // App.js

V6 Örneği (Basit ve Temiz):


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

function ParentLayout() {
  return (
    

Parent Layout


{/* Alt rotaların içeriği burada render edilecek */}
); } function AppV6() { return ( } /> }> } /> {/* /parent yolu için */} } /> } /> ); }

Bu temel farklılıklar, React Router v6'nın daha modern, daha esnek ve daha geliştirici dostu bir deneyim sunma amacını açıkça göstermektedir. Özellikle iç içe yönlendirmelerdeki basitleşme, büyük uygulamaların yönetimini önemli ölçüde kolaylaştırmaktadır.

React Router v6 ile Uygulamalarınızda Yönlendirme Nasıl Yapılır? (Uygulamalı Kılavuz)

React Router v6'nın yeniliklerini teori düzeyinde inceledikten sonra, şimdi sıra bunları pratik bir şekilde uygulamaya geldi. Bu bölümde, adım adım bir React uygulamasında v6 ile yönlendirme kurmayı, dinamik rotaları yönetmeyi ve iç içe yönlendirmelerin gücünü kullanmayı öğreneceğiz. Bu kılavuz, konuya yeni başlayanların bile kolayca takip edebileceği şekilde tasarlanmıştır.

1. Kurulum ve İlk Adımlar

React Router v6'yı projenize eklemek için öncelikle react-router-dom paketini kurmanız gerekir. Aşağıdaki komutu kullanarak projelerinize kurulumu gerçekleştirebilirsiniz:


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

Kurulum tamamlandıktan sonra, yönlendirme işlevselliğini uygulamanızın ana bileşeninde etkinleştirmemiz gerekiyor. Genellikle bu, src/index.js veya src/App.js dosyasında BrowserRouter bileşenini kullanarak yapılır.


// src/index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import { BrowserRouter } from 'react-router-dom';
import App from './App';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  
    
      
    
  
);
    

Yukarıdaki kodda, App bileşenimizi BrowserRouter ile sardık. Bu, tüm alt bileşenlerin React Router'ın özelliklerine (Link, Routes, hook'lar vb.) erişebilmesini sağlar.

2. Basit Bir Yönlendirme Yapısı Oluşturma

Şimdi, ana sayfa, hakkında ve iletişim sayfaları için basit bir yönlendirme yapısı oluşturalım. Bunun için App.js dosyamızı ve birkaç temel bileşeni kullanacağız.


// src/components/HomePage.js
function HomePage() {
  return 

Ana Sayfa İçeriği

; } export default HomePage; // src/components/AboutPage.js function AboutPage() { return

Hakkımızda Sayfası İçeriği

; } export default AboutPage; // src/components/ContactPage.js function ContactPage() { return

İletişim Sayfası İçeriği

; } export default ContactPage; // src/App.js import { Routes, Route, Link } from 'react-router-dom'; import HomePage from './components/HomePage'; import AboutPage from './components/AboutPage'; import ContactPage from './components/ContactPage'; function App() { return (

} /> } /> } />
); } export default App;

Bu örnekte, Link bileşenleri navigasyon menüsünü oluştururken, Routes bileşeni içerisindeki Route'lar URL'ye göre doğru bileşenin render edilmesini sağlar. Gördüğünüz gibi, v5'teki exact prop'una artık ihtiyacımız yok.

3. Dinamik Yönlendirmeler ve useParams Kullanımı

Çoğu uygulamada, bir kaynak koleksiyonundaki (örneğin kullanıcılar veya ürünler) belirli bir öğeyi göstermek istersiniz. Bu durumlar için dinamik rotalar kullanırız. Dinamik rotalar, URL'de değişken bir segment (: ile belirtilir) içerir ve bu değişkenin değerine useParams hook'u ile erişebiliriz.


// src/components/UserPage.js
import { useParams } from 'react-router-dom';

function UserPage() {
  const { id } = useParams();
  return (
    

Kullanıcı Detayları: ID {id}

); } export default UserPage; // src/App.js (Routes kısmına ekleyin) // ... } /> // ... // Navigasyon menüsüne örnek link ekleyin // ...
  • Kullanıcı 123
  • Kullanıcı 456
  • // ...

    /users/123 gibi bir URL'ye gittiğinizde, UserPage bileşeni render edilecek ve useParams hook'u sayesinde id değişkeninin değeri "123" olarak alınacaktır.

    4. İç İçe Yönlendirmeler (Nested Routes) ve Outlet

    İç içe yönlendirmeler, belirli bir bölümün altındaki sayfaların ortak bir layout'u paylaşmasını sağlayan güçlü bir özelliktir. Örneğin, bir yönetici paneli genellikle sol menü ve üst navigasyon gibi ortak elementlere sahiptir, ancak ana içerik alanı alt rotalara göre değişir. React Router v6, Outlet bileşeni ile bu yapıyı inanılmaz derecede kolaylaştırır.

    
    // src/components/DashboardLayout.js
    import { Outlet, Link } from 'react-router-dom';
    
    function DashboardLayout() {
      return (
        
    {/* Alt rotaların içeriği burada render edilecek */}
    ); } export default DashboardLayout; // src/components/DashboardIndex.js function DashboardIndex() { return

    Dashboard Genel Bakış

    ; } export default DashboardIndex; // src/components/ProfilePage.js function ProfilePage() { return

    Profil Sayfası

    ; } export default ProfilePage; // src/components/SettingsPage.js function SettingsPage() { return

    Ayarlar Sayfası

    ; } export default SettingsPage; // src/App.js (Routes kısmına ekleyin) // ... }> } /> {/* /dashboard yolu için */} } /> } /> // ...

    Bu yapıda, /dashboard, /dashboard/profile ve /dashboard/settings yolları, DashboardLayout bileşenini kullanır ve alt içerik Outlet içinde dinamik olarak gösterilir. index prop'u, üst yolun kendisiyle (/dashboard) eşleştiğinde render edilecek varsayılan alt rotayı belirtir. Ayrıca, Link to="." veya Link to="profile" gibi göreceli yollar kullanarak daha temiz ve yeniden kullanılabilir navigasyonlar oluşturabilirsiniz. Bu, özellikle bir bileşeni farklı yerlerde kullandığınızda rotaları manuel olarak güncelleme zahmetinden kurtarır.

    Programatik Yönlendirme ve Sayfa Bulunamadı (404) Yönetimi Nasıl Sağlanır?

    Bazı durumlarda, kullanıcı etkileşimlerine veya belirli koşullara bağlı olarak programatik olarak yönlendirme yapmanız gerekebilir. Örneğin, bir form gönderimi başarılı olduğunda veya bir kullanıcının kimliği doğrulandığında farklı bir sayfaya geçiş yapmak isteyebilirsiniz. React Router v6, bu tür senaryolar için useNavigate hook'unu sunar. Ayrıca, kullanıcıların yanlış URL'ler girdiğinde karşılaşacakları "Sayfa Bulunamadı" (404) durumlarını yönetmek de iyi bir kullanıcı deneyimi için oldukça önemlidir.

    1. useNavigate Hook'u ile Programatik Yönlendirme

    useNavigate, fonksiyonel bileşenlerde programatik yönlendirme yapmak için kullanılan bir hook'tur. Bu hook, çağrıldığında bir yönlendirme fonksiyonu döndürür. Bu fonksiyonu, istediğiniz yolu (path) veya bir geçmiş adımı (örneğin -1 bir önceki sayfaya gitmek için) parametre olarak vererek kullanabilirsiniz.

    
    // src/components/LoginPage.js
    import { useState } from 'react';
    import { useNavigate } from 'react-router-dom';
    
    function LoginPage() {
      const [username, setUsername] = useState('');
      const [password, setPassword] = useState('');
      const navigate = useNavigate();
    
      const handleSubmit = (e) => {
        e.preventDefault();
        // Gerçek bir uygulamada burada kimlik doğrulama API çağrısı olur.
        if (username === 'admin' && password === '123') {
          console.log('Giriş başarılı!');
          // Başarılı giriş sonrası /dashboard sayfasına yönlendirme
          navigate('/dashboard', { replace: true, state: { fromLogin: true } });
          // replace: true geçmişteki mevcut girdiyi değiştirir, böylece kullanıcı geri dönemez.
          // state ile yönlendirme sırasında ek veri iletebilirsiniz.
        } else {
          console.log('Geçersiz kullanıcı adı veya şifre.');
          alert('Giriş başarısız!');
        }
      };
    
      return (
        

    Giriş Yap

    setUsername(e.target.value)} />
    setPassword(e.target.value)} />
    ); } export default LoginPage;

    Yukarıdaki örnekte, kullanıcı "admin" ve "123" ile giriş yapmaya çalıştığında /dashboard sayfasına yönlendirilir. replace: true seçeneği, kullanıcının tarayıcının geri düğmesine basarak giriş sayfasına geri dönmesini engeller. Bu, özellikle hassas işlemler (ödeme, giriş) sonrası önemli bir güvenlik ve kullanıcı deneyimi geliştirmesidir. Ayrıca state prop'u ile yönlendirilen sayfaya ek veri gönderebilirsiniz, bu veriye useLocation().state ile erişilir.

    2. Sayfa Bulunamadı (404) Yönetimi

    Uygulamanızdaki rotalarla eşleşmeyen bir URL'ye erişildiğinde, kullanıcıya bir "Sayfa Bulunamadı" mesajı göstermek yaygın ve iyi bir pratik. React Router v6'da bunu, tüm tanımlanmış rotaların sonuna bir wildcard (*) yolu ekleyerek kolayca yapabiliriz. * yolu, diğer tüm rotaların eşleşmemesi durumunda yakalanacak olan varsayılan rotayı temsil eder.

    
    // src/components/NotFoundPage.js
    import { Link } from 'react-router-dom';
    
    function NotFoundPage() {
      return (
        

    404 - Sayfa Bulunamadı

    Aradığınız sayfa mevcut değil.

    Ana Sayfaya Dön
    ); } export default NotFoundPage; // src/App.js (Routes bloğunun en sonuna ekleyin) // ... } /> {/* Tüm eşleşmeyen yollar için */} // ...

    Routes bileşeni içerisindeki Route'lar, en spesifik olandan en genel olana doğru eşleştiği için, path="*" olan rota en sona eklenmelidir. Bu sayede, daha spesifik yollar önce kontrol edilir ve eğer hiçbiri eşleşmezse, en son NotFoundPage devreye girer. Bu yapı, uygulamanızın beklenmedik URL girişlerine karşı sağlam olmasını sağlar ve kullanıcıların kaybolmasını engeller.

    Gerçek Dünya Senaryolarında React Router v6 Kullanımı: Bir E-Ticaret Uygulaması Örneği

    Teorik bilgiler ve temel örnekler güzel olsa da, React Router v6'nın gerçek bir uygulamada nasıl kullanıldığını görmek en iyi öğrenme yollarından biridir. Şimdi, bir e-ticaret uygulamasının yönlendirme yapısını React Router v6 ile nasıl kurabileceğimizi gösteren bir vaka analizine odaklanalım. Bu örnek, dinamik rotalar, iç içe yönlendirmeler, navigasyon menüsü ve hatta basit bir kimlik doğrulama koruması gibi yaygın gereksinimleri kapsayacaktır.

    Uygulama Senaryosu: Mini E-Ticaret Platformu

    Hayali e-ticaret uygulamamız aşağıdaki sayfa yapısına sahip olacak:

    • Ana Sayfa (/): Öne çıkan ürünler.
    • Ürün Listesi (/products): Tüm ürünleri listeler.
    • Ürün Detayı (/products/:productId): Belirli bir ürünün detaylarını gösterir.
    • Sepet (/cart): Kullanıcının sepetindeki ürünler.
    • Yönetici Paneli (/admin): Sadece oturum açmış yöneticilerin erişebileceği bir alan.
      • Yönetici Ana Sayfası (/admin): Yönetici paneline genel bakış.
      • Ürün Yönetimi (/admin/products): Ürünleri ekleme, düzenleme, silme.
      • Kullanıcı Yönetimi (/admin/users): Kullanıcıları yönetme.
    • Giriş Sayfası (/login): Kullanıcıların giriş yapabileceği sayfa.
    • 404 Sayfası (*): Bulunamayan sayfalar için.

    Kod Yapısı ve Bileşenler

    
    // src/AuthContext.js (Basit bir kimlik doğrulama bağlamı)
    import React, { createContext, useState, useContext } from 'react';
    
    const AuthContext = createContext(null);
    
    export function AuthProvider({ children }) {
      const [user, setUser] = useState(null); // 'admin' veya null
    
      const signin = (newUser, callback) => {
        // Gerçek bir uygulamada burada API çağrısı ve token saklama olur
        return new Promise(resolve => {
          setUser(newUser);
          resolve();
          callback && callback();
        });
      };
    
      const signout = (callback) => {
        return new Promise(resolve => {
          setUser(null);
          resolve();
          callback && callback();
        });
      };
    
      const value = { user, signin, signout };
      return {children};
    }
    
    export function useAuth() {
      return useContext(AuthContext);
    }
    
    // src/components/RequireAuth.js (Kimlik doğrulama koruması)
    import React from 'react';
    import { useLocation, Navigate } from 'react-router-dom';
    import { useAuth } from '../AuthContext';
    
    function RequireAuth({ children }) {
      let auth = useAuth();
      let location = useLocation();
    
      if (!auth.user) {
        // Oturum açılmadıysa, giriş sayfasına yönlendir.
        // Ancak, kullanıcı giriş yaptıktan sonra buraya geri dönebilmesi için
        // mevcut konum bilgisini state ile gönder.
        return ;
      }
    
      return children;
    }
    
    // src/components/Layout.js (Genel layout bileşeni)
    import { NavLink, Outlet } from 'react-router-dom';
    import { useAuth } from '../AuthContext';
    
    function Layout() {
      const auth = useAuth();
    
      return (
        
    {/* Sayfa içeriği burada render edilecek */}
    ); } export default Layout; // src/components/AdminLayout.js (Admin paneli için özel layout) import { NavLink, Outlet } from 'react-router-dom'; function AdminLayout() { return (
    ); } export default AdminLayout; // Basit sayfa bileşenleri (HomePage, ProductsPage, ProductDetailPage, CartPage, AdminDashboard, AdminProducts, AdminUsers, NotFoundPage, LoginPage) // İçerikleri kısa tutulmuştur. function HomePage() { return

    Ana Sayfa - Öne Çıkan Ürünler

    ;} function ProductsPage() { return

    Ürün Listesi

    ;} function ProductDetailPage() { const { productId } = useParams(); return

    Ürün Detayı: ID {productId}

    ; } function CartPage() { return

    Alışveriş Sepeti

    ;} function AdminDashboard() { return

    Yönetici Paneli - Genel Bakış

    ;} function AdminProducts() { return

    Yönetici Paneli - Ürün Yönetimi

    ;} function AdminUsers() { return

    Yönetici Paneli - Kullanıcı Yönetimi

    ;} function NotFoundPage() { return

    404 - Sayfa Bulunamadı

    ;} // src/App.js (Ana uygulama bileşeni) import { Routes, Route } from 'react-router-dom'; import { AuthProvider } from './AuthContext'; // Tüm sayfa ve layout bileşenleri buraya import edilecek function App() { return ( {/* Kimlik doğrulama bağlamı sağlıyoruz */} }> {/* Ortak layout */} } /> } /> } /> } /> } /> {/* Yönetici paneline erişim için kimlik doğrulaması */} } > } /> } /> } /> } /> {/* Eşleşmeyen tüm yollar */} ); } export default App; // Stil için (Örn: src/index.css veya App.css) /* .active-link { font-weight: bold; color: blue; } */

    Bu örnekte, Layout bileşeni tüm genel uygulama navigasyonunu ve içeriği sarmalar. İçindeki Outlet, ana rota içeriğini render eder. Yönetici paneli için, AdminLayout adında ayrı bir iç içe layout kullandık ve bu bölümü RequireAuth bileşeni ile koruduk. RequireAuth, kullanıcının oturum açıp açmadığını kontrol eder ve eğer açmadıysa onu giriş sayfasına yönlendirir. Giriş sayfasında, başarılı bir kimlik doğrulamasından sonra kullanıcı, state ile iletilen orijinal hedefine geri yönlendirilir. NavLink kullanımı, aktif olan bağlantıyı vurgulayarak kullanıcıya görsel geri bildirim sağlar.

    Bu vaka analizi, React Router v6'nın esnekliğini ve güçlü yapısını gerçek dünya senaryolarında nasıl kullanabileceğinizi gösteriyor. İç içe yönlendirmeler, dinamik parametreler ve programatik yönlendirme gibi özellikler sayesinde, büyük ve karmaşık uygulamaları bile temiz ve yönetilebilir bir şekilde inşa edebilirsiniz.

    React Router v6 ile Performansı ve Geliştirici Deneyimini Nasıl Artırırsınız? (İpuçları ve Püf Noktaları)

    React Router v6, zaten performans odaklı bir yapıya sahip olsa da, uygulamanızın hızını ve geliştirici deneyimini daha da optimize etmek için uygulayabileceğiniz bazı ileri düzey teknikler ve en iyi pratikler bulunmaktadır.

    1. Code Splitting (Kod Bölümleme) ve Lazy Loading

    Tek sayfa uygulamalar büyüdükçe, tüm uygulamanın JavaScript bundle boyutu da artar, bu da ilk yükleme süresini uzatabilir. Code Splitting (kod bölümleme), uygulamanızın kodunu daha küçük parçalara bölerek yalnızca o an ihtiyaç duyulan kodun yüklenmesini sağlar. React Router ile bu, her bir rota için ayrı bir JavaScript parçası yükleyerek kolayca yapılabilir.

    React'ın React.lazy() ve bileşenleri, bu işlemi basitleştirir:

    
    import React, { lazy, Suspense } from 'react';
    import { Routes, Route } from 'react-router-dom';
    
    const HomePage = lazy(() => import('./components/HomePage'));
    const AboutPage = lazy(() => import('./components/AboutPage'));
    const ProductDetailPage = lazy(() => import('./components/ProductDetailPage'));
    const AdminLayout = lazy(() => import('./components/AdminLayout')); // Layoutlar bile olabilir
    
    function AppWithLazyLoading() {
      return (
        Yükleniyor...
    }> } /> } /> } /> } /> {/* Diğer rotalar */} ); }

    Bu yaklaşım, kullanıcı sadece ilgili rotaya gittiğinde o rotanın bileşen kodunun yüklenmesini sağlar. Bu, özellikle büyük uygulamalarda ilk yükleme süresini önemli ölçüde azaltır ve dolayısıyla kullanıcı deneyimini iyileştirir.

    2. Route Guards (Yönlendirme Korumaları) için En İyi Pratikler

    Daha önceki örnekte RequireAuth bileşenini gördük. Bu tür bileşenler, belirli rotalara erişimi kontrol etmek için çok güçlüdür. Ancak karmaşık mantıklarda (örneğin, birden fazla rol kontrolü, belirli bir aboneliğin olup olmadığı) bu koruma bileşenlerini daha soyut hale getirebilirsiniz. Bir koruma bileşeni, React Router'ın Outlet mekanizmasını ve Navigate bileşenini kullanarak çocuk rotalarını koşullu olarak render edebilir.

    
    // Örnek: Role dayalı erişim kontrolü
    function RequireAdmin({ children }) {
      const auth = useAuth();
      if (!auth.user || auth.user.role !== 'admin') {
        return ;
      }
      return children;
    }
    
    // Routes içinde kullanımı:
    }
    >
      {/* Admin alt rotaları */}
    
        

    Bu yapı, koruma mantığını rotalardan ayırarak kodunuzu daha modüler hale getirir.

    3. Hata Yakalama (Error Boundary)

    React Router rotaları içindeki bileşenlerde meydana gelen render hataları uygulamanızın çökmesine neden olabilir. Bu tür hataları yakalamak ve kullanıcıya dostça bir mesaj göstermek için ErrorBoundary bileşenleri kullanmak iyi bir uygulamadır. React Router v6, doğrudan bir ErrorBoundary bileşeni sağlamaz ancak React'ın kendi ErrorBoundary özelliğini rotalarınızın etrafına sararak kullanabilirsiniz.

    
    // src/components/ErrorBoundary.js (Örnek ErrorBoundary bileşeni)
    import React from 'react';
    
    class ErrorBoundary extends React.Component {
      constructor(props) {
        super(props);
        this.state = { hasError: false };
      }
    
      static getDerivedStateFromError(error) {
        return { hasError: true };
      }
    
      componentDidCatch(error, errorInfo) {
        console.error("ErrorBoundary yakalanan hata:", error, errorInfo);
      }
    
      render() {
        if (this.state.hasError) {
          return 

    Bir şeyler ters gitti.

    ; } return this.props.children; } } export default ErrorBoundary; // App.js içinde kullanımı: {/* Hata verebilecek bir bileşen */} } /> {/* Diğer rotalar */}

    Bu sayede, uygulamanızın tamamının çökmesi yerine, sadece hatalı bölüm için bir geri dönüş arayüzü gösterebilirsiniz.

    Sonuç: React Router v6 ile Geleceğe Yönelik Yönlendirme

    React Router v6, tek sayfa uygulamalar için yönlendirme konusunda React ekosistemindeki en güçlü ve esnek çözümlerden biri olmaya devam ediyor. V5'ten miras aldığı sağlam temeller üzerine inşa edilen bu yeni sürüm, özellikle Routes, useNavigate ve Outlet gibi yenilikçi API'lerle geliştiricilere daha sade, daha verimli ve daha sezgisel bir deneyim sunmaktadır. exact prop'unun kaldırılması ve iç içe yönlendirmelerin basitleştirilmesi, karmaşık uygulama mimarilerini yönetmeyi önemli ölçüde kolaylaştırmıştır. Göreceli yolların ve programatik yönlendirme için useNavigate'in sağladığı esneklik, geliştirme sürecini hızlandırırken kod kalitesini de artırmaktadır.

    Bu rehberde, React Router v6'nın temel kavramlarından başlayarak, v5 ile arasındaki kritik farkları, adım adım kurulum ve kullanım örneklerini, dinamik rota yönetimini ve iç içe yönlendirmelerin gücünü ele aldık. Ayrıca, bir e-ticaret uygulaması üzerinden gerçek dünya senaryolarında nasıl kullanılabileceğini gösteren bir vaka analizi sunduk. Son olarak, kod bölümleme, rota korumaları ve hata yakalama gibi ileri düzey tekniklerle performans ve geliştirici deneyimini nasıl iyileştirebileceğinize dair ipuçları paylaştık.

    React Router v6'ya geçiş yapmak veya yeni projelerinizi v6 ile başlatmak, uygulamanızın yönlendirme yapısını modern standartlara uygun hale getirmekle kalmayacak, aynı zamanda geliştirici üretkenliğinizi de artıracaktır. Daha az kod, daha net API'ler ve güçlü iç içe yönlendirme yetenekleri sayesinde, kullanıcılarınıza kesintisiz ve akıcı bir navigasyon deneyimi sunarken, kendi kod tabanınızı daha kolay yönetebileceksiniz. React ekosistemi sürekli evrilirken, React Router v6 bu evrimin en başarılı örneklerinden birini temsil etmektedir. Uygulamalarınızın geleceğe hazır olması için bu güçlü aracı benimsemekten çekinmeyin!

    Sıkça Sorulan Sorular (SSS)

    1. React Router v5'ten v6'ya geçiş zor mu?
    Hayır, genel olarak geçiş oldukça kolaydır, özellikle uygulamanız büyük ve karmaşık değilse. Temel değişiklikler Switch yerine Routes, useHistory yerine useNavigate ve Route prop'larındaki (component/render yerine element) farklılıklardır. React Router, geçiş sürecini kolaylaştırmak için iyi belgelendirilmiş bir geçiş kılavuzu sunmaktadır.
    2. useParams hook'u nasıl kullanılır?
    useParams hook'u, dinamik bir rotada (örneğin /products/:id) URL'den parametreleri almak için kullanılır. Bileşeninizin içinde çağırarak parametreleri bir nesne olarak döndürür:

    
    import { useParams } from 'react-router-dom';
    function ProductDetail() {
      const { id } = useParams();
      return 
    Ürün ID: {id}
    ; {

    3. İç içe (nested) routing için en iyi pratik nedir?
    React Router v6'da iç içe routing için en iyi pratik, üst içinde alt 'ları tanımlamak ve üst bileşende alt rotaların içeriğini render etmek için bileşenini kullanmaktır. Bu, ortak layout'ları daha temiz ve modüler bir şekilde yönetmenizi sağlar. Ayrıca, alt rotalar için göreceli yollar (to="child-path") kullanmak kod tekrarını azaltır.
    4. Uygulamamda 404 Sayfa Bulunamadı hatalarını nasıl yönetirim?
    Tüm tanımlı rotaların sonuna bir wildcard (*) yolu içeren bir ekleyerek 404 hatalarını yönetebilirsiniz. Bu rota, diğer tüm rotaların eşleşmemesi durumunda devreye girer:

    
    
      {/* Diğer rotalar */}
      } />
    
                

    5. v6'da redirect işlemi nasıl yapılır?
    React Router v6'da redirect (yönlendirme) işlemleri için bileşenini veya useNavigate hook'unu kullanırsınız. Örneğin, bir rotadan başka bir rotaya anında yönlendirmek için kullanabilir veya bir fonksiyonda programatik olarak yönlendirme yapmak için const navigate = useNavigate(); navigate('/hedef-yol'); kullanabilirsiniz. replace prop'u, geçmiş kaydının üzerine yazarak geri dönmeyi engeller.

    Yorumlar
    İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
    Yorum Yaz

    Bir yanıt yazın

    E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

    E-posta Bülteni
    Yazılım Topluluğuna Katılın
    En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.