{"id":34286,"date":"2025-11-14T08:31:35","date_gmt":"2025-11-14T05:31:35","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/"},"modified":"2025-11-14T08:31:35","modified_gmt":"2025-11-14T05:31:35","slug":"react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/","title":{"rendered":"React Router v6 K\u0131lavuzu: v5&#8217;ten v6&#8217;ya Ge\u00e7i\u015fin Tam Detaylar\u0131"},"content":{"rendered":"<p><body><\/p>\n<p>React uygulamalar\u0131n\u0131zda sayfa ge\u00e7i\u015fleri, dinamik rotalar ve karma\u015f\u0131k y\u00f6nlendirme senaryolar\u0131 sizi zorluyor mu? Tek sayfa uygulamalar\u0131n (SPA) vazge\u00e7ilmezi olan y\u00f6nlendirme s\u00fcre\u00e7lerini modern, temiz ve performansl\u0131 bir \u015fekilde y\u00f6netmek isteyenler i\u00e7in React Router v6, pek \u00e7ok yenilik ve basitle\u015ftirme sunuyor. Bu kapsaml\u0131 rehber, React Router v5&#8217;ten v6&#8217;ya ge\u00e7i\u015fin t\u00fcm \u00f6nemli detaylar\u0131n\u0131, yeni API&#8217;leri ve pratik kod \u00f6rneklerini ad\u0131m ad\u0131m a\u00e7\u0131klayarak uygulaman\u0131z\u0131n y\u00f6nlendirme yap\u0131s\u0131n\u0131 gelece\u011fe ta\u015f\u0131man\u0131z\u0131 sa\u011flayacak.<\/p>\n<p>Modern web uygulamalar\u0131, kullan\u0131c\u0131 deneyimini zenginle\u015ftirmek ve sayfa yenilemeleri olmadan h\u0131zl\u0131 ge\u00e7i\u015fler sa\u011flamak amac\u0131yla tek sayfa uygulama (SPA) mimarisini benimsemektedir. Bu mimaride, farkl\u0131 i\u00e7erikleri veya g\u00f6r\u00fcn\u00fcmleri g\u00f6stermek i\u00e7in taray\u0131c\u0131n\u0131n URL&#8217;sini de\u011fi\u015ftirmek, ancak sunucudan tam bir sayfa y\u00fcklemesi yapmamak esast\u0131r. \u0130\u015fte bu noktada, React Router gibi bir y\u00f6nlendirme k\u00fct\u00fcphanesi devreye girer. React Router, URL&#8217;ye dayal\u0131 olarak React bile\u015fenlerini ko\u015fullu olarak olu\u015fturman\u0131za olanak tan\u0131yarak karma\u015f\u0131k navigasyon yap\u0131lar\u0131n\u0131 basit ve y\u00f6netilebilir hale getirir. Ancak teknolojiler evrildik\u00e7e, eski yakla\u015f\u0131mlar yerini daha verimli ve optimize edilmi\u015f \u00e7\u00f6z\u00fcmlere b\u0131rak\u0131r. React Router da bu de\u011fi\u015fimin bir par\u00e7as\u0131 olarak v5&#8217;ten v6&#8217;ya \u00f6nemli bir revizyon ge\u00e7irdi.<\/p>\n<p>v5 s\u00fcr\u00fcm\u00fc zaten olduk\u00e7a pop\u00fcler ve g\u00fc\u00e7l\u00fc bir ara\u00e7 olmas\u0131na ra\u011fmen, v6 daha az kod yazmay\u0131, daha iyi performans elde etmeyi ve \u00f6zellikle i\u00e7 i\u00e7e y\u00f6nlendirmelerde (nested routing) daha sezgisel bir deneyim sunmay\u0131 hedefliyor. Bu yeni s\u00fcr\u00fcm, geli\u015ftiricilerin kar\u015f\u0131la\u015ft\u0131\u011f\u0131 yayg\u0131n sorunlara modern \u00e7\u00f6z\u00fcmler getirerek hem yeni projeler i\u00e7in m\u00fckemmel bir ba\u015flang\u0131\u00e7 noktas\u0131 oluyor hem de mevcut v5 tabanl\u0131 uygulamalar\u0131 g\u00fcncellemeyi d\u00fc\u015f\u00fcnenlere yol g\u00f6steriyor. \u00d6rne\u011fin, v5&#8217;teki <code>Switch<\/code> bile\u015feninin yerini alan <code>Routes<\/code> bile\u015feni, rotalar\u0131n e\u015fle\u015fme mant\u0131\u011f\u0131n\u0131 k\u00f6kten de\u011fi\u015ftirirken, <code>useHistory<\/code> hook&#8217;u yerine gelen <code>useNavigate<\/code> ise programatik y\u00f6nlendirmeyi daha esnek hale getiriyor. Bu rehber boyunca, v5 ve v6 aras\u0131ndaki temel farkl\u0131l\u0131klar\u0131 ayr\u0131nt\u0131l\u0131 kod \u00f6rnekleriyle inceleyecek, v6&#8217;n\u0131n sundu\u011fu yenilikleri derinlemesine ke\u015ffedecek ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l uygulanabilece\u011fini g\u00f6sterece\u011fiz. Amac\u0131m\u0131z, React Router v6&#8217;ya s\u0131f\u0131rdan ba\u015flayanlar i\u00e7in eksiksiz bir kaynak sunmak ve deneyimli geli\u015ftiricilerin de bilgi birikimlerini g\u00fcncellemelerine yard\u0131mc\u0131 olmakt\u0131r. Hadi gelin, React Router v6&#8217;n\u0131n b\u00fcy\u00fcl\u00fc d\u00fcnyas\u0131na dalal\u0131m ve uygulamalar\u0131m\u0131z\u0131 bir \u00fcst seviyeye ta\u015f\u0131yal\u0131m!<\/p>\n<h2 id=\"react-routera-yeni-baslayanlar-icin-temel-kavramlar-nelerdir\">React Router&#8217;a Yeni Ba\u015flayanlar \u0130\u00e7in Temel Kavramlar Nelerdir?<\/h2>\n<p>React Router v6&#8217;n\u0131n derinliklerine dalmadan \u00f6nce, y\u00f6nlendirme (routing) kavram\u0131n\u0131n temellerini ve React ekosistemindeki yerini anlamak b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Y\u00f6nlendirme, bir web uygulamas\u0131n\u0131n farkl\u0131 URL&#8217;lere veya yollara (paths) g\u00f6re farkl\u0131 i\u00e7erikler veya bile\u015fenler g\u00f6stermesini sa\u011flayan mekanizmad\u0131r. Geleneksel olarak, bir kullan\u0131c\u0131 farkl\u0131 bir sayfaya gitti\u011finde taray\u0131c\u0131, sunucudan tamamen yeni bir HTML sayfas\u0131 isterdi. Ancak SPA&#8217;larda (Single Page Applications), bu durum farkl\u0131d\u0131r. Taray\u0131c\u0131da sadece bir kez HTML sayfas\u0131 y\u00fcklenir ve sonras\u0131nda sayfa i\u00e7i navigasyonlar JavaScript ile y\u00f6netilir, bu da &#8220;client-side routing&#8221; olarak adland\u0131r\u0131l\u0131r.<\/p>\n<p>React Router, bu client-side routing&#8217;i React bile\u015fenleri arac\u0131l\u0131\u011f\u0131yla kolayca ger\u00e7ekle\u015ftirmenizi sa\u011flayan pop\u00fcler bir k\u00fct\u00fcphanedir. Temel olarak, belirli bir URL deseniyle e\u015fle\u015fen bir bile\u015fenin render edilmesini sa\u011flar. React Router&#8217;\u0131n kalbinde yatan birka\u00e7 temel bile\u015fen ve hook bulunmaktad\u0131r:<\/p>\n<ul>\n<li>\n            <strong><code>BrowserRouter<\/code>:<\/strong> Uygulaman\u0131z\u0131n tamam\u0131n\u0131 sarmalayan ana y\u00f6nlendirme bile\u015fenidir. HTML5 History API&#8217;sini kullanarak UI&#8217;n\u0131z\u0131 URL ile senkronize eder. Bu bile\u015fen, uygulaman\u0131zda y\u00f6nlendirmenin ger\u00e7ekle\u015fti\u011fi ba\u011flam\u0131 (context) sa\u011flar. Genellikle <code>App.js<\/code> dosyas\u0131nda, uygulaman\u0131z\u0131n en \u00fcst d\u00fczeyinde yer al\u0131r.\n        <\/li>\n<li>\n            <strong><code>Routes<\/code>:<\/strong> React Router v6&#8217;n\u0131n en \u00f6nemli yeniliklerinden biridir ve v5&#8217;teki <code>Switch<\/code> bile\u015feninin yerini alm\u0131\u015ft\u0131r. <code>Routes<\/code> bile\u015feni, i\u00e7erisindeki <code>Route<\/code> tan\u0131mlamalar\u0131n\u0131 tarar ve URL ile e\u015fle\u015fen ilk <code>Route<\/code>&#8216;u render eder. <code>Switch<\/code>&#8216;e k\u0131yasla daha g\u00fc\u00e7l\u00fc ve sezgisel bir e\u015fle\u015fme algoritmas\u0131 sunar, \u00f6zellikle i\u00e7 i\u00e7e y\u00f6nlendirmelerde kendini g\u00f6sterir.\n        <\/li>\n<li>\n            <strong><code>Route<\/code>:<\/strong> Belirli bir URL yolu ile e\u015fle\u015fti\u011finde hangi bile\u015fenin g\u00f6sterilece\u011fini tan\u0131mlar. <code>path<\/code> prop&#8217;u ile URL deseni, <code>element<\/code> prop&#8217;u ile de render edilecek React bile\u015feni belirtilir.\n        <\/li>\n<li>\n            <strong><code>Link<\/code>:<\/strong> Uygulama i\u00e7i navigasyonu sa\u011flamak i\u00e7in kullan\u0131lan bir bile\u015fendir. Bir HTML <code><a><\/code> etiketi gibi g\u00f6r\u00fcn\u00fcr ancak sayfa yenilemesi yapmadan, yaln\u0131zca taray\u0131c\u0131 ge\u00e7mi\u015fini g\u00fcncelleyerek farkl\u0131 bir rotaya ge\u00e7i\u015fi m\u00fcmk\u00fcn k\u0131lar. <code>to<\/code> prop&#8217;u ile hedeflenen yol belirtilir.\n        <\/li>\n<li>\n            <strong><code>NavLink<\/code>:<\/strong> <code>Link<\/code> bile\u015fenine benzer, ancak ekstra \u00f6zellikler sunar. \u00d6zellikle aktif olan rotay\u0131 belirtmek i\u00e7in otomatik olarak bir <code>active<\/code> CSS s\u0131n\u0131f\u0131 ekleyebilir, bu da navigasyon men\u00fclerinde aktif \u00f6\u011feyi vurgulamak i\u00e7in \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.\n        <\/li>\n<\/ul>\n<p>React Router v6, t\u00fcm bu temel bile\u015fenleri ve yeni nesil hook&#8217;lar\u0131 (\u00f6rne\u011fin <code>useNavigate<\/code>, <code>useParams<\/code>, <code>useLocation<\/code>) bir araya getirerek, karma\u015f\u0131k y\u00f6nlendirme gereksinimlerini bile \u015fa\u015f\u0131rt\u0131c\u0131 derecede basit ve anla\u015f\u0131l\u0131r bir \u015fekilde ele alman\u0131z\u0131 sa\u011flar. \u015eimdi, bu temel yap\u0131 ta\u015flar\u0131n\u0131 zihnimize yerle\u015ftirdikten sonra, v5 ve v6 aras\u0131ndaki d\u00f6n\u00fc\u015f\u00fcm\u00fcn ve yeniliklerin derinliklerine inmeye haz\u0131r\u0131z.<\/p>\n<h2 id=\"react-router-v5-ve-v6-arasindaki-temel-farklar-nelerdir\">React Router v5 ve v6 Aras\u0131ndaki Temel Farklar Nelerdir?<\/h2>\n<p>React Router v6, selefi v5&#8217;e g\u00f6re pek \u00e7ok a\u00e7\u0131dan basitle\u015ftirme ve modernizasyon getirmi\u015ftir. Bu de\u011fi\u015fiklikler, daha temiz kod, daha sezgisel API&#8217;ler ve geli\u015fmi\u015f performans sunmay\u0131 hedefler. V5&#8217;ten v6&#8217;ya ge\u00e7i\u015f yapmay\u0131 d\u00fc\u015f\u00fcnen veya direkt v6 ile ba\u015flayacak geli\u015ftiriciler i\u00e7in bu temel farkl\u0131l\u0131klar\u0131 anlamak kritik \u00f6neme sahiptir.<\/p>\n<h3>1. <code>Switch<\/code> Yerine <code>Routes<\/code> Bile\u015feni<\/h3>\n<p>React Router v5&#8217;te, rotalar\u0131n tan\u0131mlanmas\u0131 ve e\u015fle\u015ftirilmesi i\u00e7in <code><Switch><\/code> bile\u015feni kullan\u0131l\u0131rd\u0131. <code>Switch<\/code>, i\u00e7erisindeki <code><Route><\/code> bile\u015fenlerini ba\u015ftan sona tarar ve URL ile e\u015fle\u015fen <strong>ilk<\/strong> rotay\u0131 render ederdi. Bu, \u00f6zellikle karma\u015f\u0131k rota hiyerar\u015filerinde veya <code>exact<\/code> prop&#8217;unu yanl\u0131\u015f kullan\u0131rken beklenmedik davran\u0131\u015flara yol a\u00e7abilirdi.<br \/>\n        <code><Route exact path=\"\/\" component={HomePage} \/><\/code> \u015feklinde kullan\u0131lan <code>exact<\/code> prop&#8217;u, yolun tam olarak e\u015fle\u015fmesini sa\u011flamak i\u00e7in gerekliydi.<\/p>\n<p>React Router v6&#8217;da ise <code><Switch><\/code> yerine <code><Routes><\/code> bile\u015feni tan\u0131t\u0131ld\u0131. <code>Routes<\/code>, rotalar\u0131n e\u015fle\u015fme algoritmas\u0131n\u0131 k\u00f6kten de\u011fi\u015ftirerek <code>exact<\/code> prop&#8217;una olan ihtiyac\u0131 ortadan kald\u0131rm\u0131\u015ft\u0131r. Art\u0131k <code>Routes<\/code> i\u00e7erisindeki <code>Route<\/code>&#8216;lar, en spesifik olandan en genel olana do\u011fru bir e\u015fle\u015fme arar ve bu do\u011fal olarak en uygun rotay\u0131 se\u00e7er. Ayr\u0131ca, <code>Routes<\/code> i\u00e7inde i\u00e7 i\u00e7e (nested) rotalar\u0131n daha kolay tan\u0131mlanmas\u0131na imkan tan\u0131r. Bu sayede, kodunuz daha okunabilir ve y\u00f6netilebilir hale gelir.<\/p>\n<p><strong>V5 \u00d6rne\u011fi:<\/strong><\/p>\n<pre><code class=\"language-jsx\">\nimport { BrowserRouter as Router, Switch, Route } from 'react-router-dom';\n\nfunction AppV5() {\n  return (\n    <Router>\n      <Switch>\n        <Route exact path=\"\/\" component={HomePage} \/>\n        <Route path=\"\/about\" component={AboutPage} \/>\n        <Route path=\"\/users\/:id\" component={UserPage} \/>\n        <Route component={NotFoundPage} \/>\n      <\/Switch>\n    <\/Router>\n  );\n}\n    <\/pre>\n<p><\/code><\/p>\n<p><strong>V6 \u00d6rne\u011fi:<\/strong><\/p>\n<pre><code class=\"language-jsx\">\nimport { BrowserRouter as Router, Routes, Route } from 'react-router-dom';\n\nfunction AppV6() {\n  return (\n    <Router>\n      <Routes>\n        <Route path=\"\/\" element={<HomePage \/>} \/>\n        <Route path=\"\/about\" element={<AboutPage \/>} \/>\n        <Route path=\"\/users\/:id\" element={<UserPage \/>} \/>\n        <Route path=\"*\" element={<NotFoundPage \/>} \/>\n      <\/Routes>\n    <\/Router>\n  );\n}\n    <\/pre>\n<p><\/code><\/p>\n<aside class=\"box-tip\">Uzman \u0130pucu: V6'da <code>Route<\/code> bile\u015feni art\u0131k <code>component<\/code> veya <code>render<\/code> prop'lar\u0131 yerine do\u011frudan bir JSX elementi kabul eden <code>element<\/code> prop'unu kullan\u0131r. Bu sayede bile\u015fenlerinizi render ederken daha esnek olabilirsiniz.<\/aside>\n<h3>2. <code>useHistory<\/code> Yerine <code>useNavigate<\/code> Hook'u<\/h3>\n<p>V5'te, programatik olarak (bir olay veya durum de\u011fi\u015fikli\u011fine ba\u011fl\u0131 olarak) bir sayfaya y\u00f6nlendirme yapmak i\u00e7in <code>useHistory<\/code> hook'u kullan\u0131l\u0131rd\u0131. Bu hook, ge\u00e7mi\u015f nesnesine eri\u015fim sa\u011flar ve <code>history.push('\/yeni-yol')<\/code> veya <code>history.replace('\/yeni-yol')<\/code> gibi metotlarla y\u00f6nlendirme yap\u0131l\u0131rd\u0131.<\/p>\n<p>React Router v6'da <code>useHistory<\/code> hook'u kald\u0131r\u0131lm\u0131\u015f ve yerine <code>useNavigate<\/code> hook'u gelmi\u015ftir. <code>useNavigate<\/code>, daha basit ve daha g\u00fc\u00e7l\u00fc bir API sunar. Bir fonksiyon d\u00f6nd\u00fcr\u00fcr ve bu fonksiyonu \u00e7a\u011f\u0131rarak y\u00f6nlendirme yapabilirsiniz. Ayr\u0131ca, ge\u00e7mi\u015fte ka\u00e7 ad\u0131m geri gidece\u011finizi belirtmek i\u00e7in say\u0131sal bir de\u011fer de alabilir.<\/p>\n<p><strong>V5 \u00d6rne\u011fi:<\/strong><\/p>\n<pre><code class=\"language-jsx\">\nimport { useHistory } from 'react-router-dom';\n\nfunction LoginPageV5() {\n  const history = useHistory();\n\n  const handleLogin = () => {\n    \/\/ ... Giri\u015f i\u015flemleri ...\n    history.push('\/dashboard');\n  };\n\n  return (\n    <button onClick={handleLogin}>Giri\u015f Yap<\/button>\n  );\n}\n    <\/pre>\n<p><\/code><\/p>\n<p><strong>V6 \u00d6rne\u011fi:<\/strong><\/p>\n<pre><code class=\"language-jsx\">\nimport { useNavigate } from 'react-router-dom';\n\nfunction LoginPageV6() {\n  const navigate = useNavigate();\n\n  const handleLogin = () => {\n    \/\/ ... Giri\u015f i\u015flemleri ...\n    navigate('\/dashboard'); \/\/ Y\u00f6nlendirme\n    \/\/ navigate(-1); \/\/ Bir \u00f6nceki sayfaya d\u00f6n\n  };\n\n  return (\n    <button onClick={handleLogin}>Giri\u015f Yap<\/button>\n  );\n}\n    <\/pre>\n<p><\/code><\/p>\n<h3>3. \u0130\u00e7 \u0130\u00e7e Y\u00f6nlendirmeler (Nested Routes) ve <code>Outlet<\/code><\/h3>\n<p>V5'te i\u00e7 i\u00e7e y\u00f6nlendirmeler, ana rotan\u0131n i\u00e7inde tekrar <code><Route><\/code> tan\u0131mlar\u0131 yaparak y\u00f6netilirdi. Bu durum, \u00f6zellikle karma\u015f\u0131k hiyerar\u015filerde kod tekrar\u0131na ve okunabilirlik sorunlar\u0131na yol a\u00e7abiliyordu. Ayr\u0131ca, alt rotalar\u0131n \u00fcst rotadaki bir bile\u015fenin i\u00e7inde render edilmesi i\u00e7in \u00f6zel prop'lar\u0131n ge\u00e7irilmesi veya render fonksiyonlar\u0131n\u0131n kullan\u0131lmas\u0131 gerekebilirdi.<\/p>\n<p>React Router v6, i\u00e7 i\u00e7e y\u00f6nlendirmeleri \u00e7ok daha zarif bir \u015fekilde ele al\u0131r. \u00dcst <code><Route><\/code>, alt rotalar\u0131 tan\u0131mlayabilir ve bu alt rotalar\u0131n bile\u015fenleri, \u00fcst bile\u015fen i\u00e7inde <code><Outlet \/><\/code> bile\u015feni kullan\u0131larak render edilir. Bu, ortak layout'lar\u0131 ve payla\u015f\u0131lan bile\u015fenleri \u00e7ok daha kolay y\u00f6netmenizi sa\u011flar. Relative paths (g\u00f6receli yollar) kullan\u0131m\u0131 da bu s\u00fcre\u00e7te b\u00fcy\u00fck bir kolayl\u0131k sunar.<\/p>\n<p><strong>V5 \u00d6rne\u011fi (Karma\u015f\u0131k):<\/strong><\/p>\n<pre><code class=\"language-jsx\">\n\/\/ ParentComponent.js\nimport { Switch, Route, useRouteMatch } from 'react-router-dom';\n\nfunction ParentComponent() {\n  let { path, url } = useRouteMatch();\n  return (\n    <div>\n      <h2>Parent Component<\/h2>\n      <Switch>\n        <Route exact path={path}>\n          <h3>Parent Index<\/h3>\n        <\/Route>\n        <Route path={<code>${path}\/child1<\/code>}>\n          <ChildComponent1 \/>\n        <\/Route>\n        <Route path={<code>${path}\/child2<\/code>}>\n          <ChildComponent2 \/>\n        <\/Route>\n      <\/Switch>\n    <\/div>\n  );\n}\n\n\/\/ App.js\n<Route path=\"\/parent\" component={ParentComponent} \/>\n    <\/pre>\n<p><\/code><\/p>\n<p><strong>V6 \u00d6rne\u011fi (Basit ve Temiz):<\/strong><\/p>\n<pre><code class=\"language-jsx\">\nimport { Outlet, Link } from 'react-router-dom';\n\nfunction ParentLayout() {\n  return (\n    <div>\n      <h2>Parent Layout<\/h2>\n      <nav>\n        <Link to=\".\">Parent Index<\/Link> | \u00a0\n        <Link to=\"child1\">Child 1<\/Link> | \u00a0\n        <Link to=\"child2\">Child 2<\/Link>\n      <\/nav>\n      <hr \/>\n      <Outlet \/> {\/* Alt rotalar\u0131n i\u00e7eri\u011fi burada render edilecek *\/}\n    <\/div>\n  );\n}\n\nfunction AppV6() {\n  return (\n    <Router>\n      <Routes>\n        <Route path=\"\/\" element={<HomePage \/>} \/>\n        <Route path=\"\/parent\" element={<ParentLayout \/>}>\n          <Route index element={<ParentIndexPage \/>} \/> {\/* \/parent yolu i\u00e7in *\/}\n          <Route path=\"child1\" element={<ChildComponent1 \/>} \/>\n          <Route path=\"child2\" element={<ChildComponent2 \/>} \/>\n        <\/Route>\n      <\/Routes>\n    <\/Router>\n  );\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu temel farkl\u0131l\u0131klar, React Router v6'n\u0131n daha modern, daha esnek ve daha geli\u015ftirici dostu bir deneyim sunma amac\u0131n\u0131 a\u00e7\u0131k\u00e7a g\u00f6stermektedir. \u00d6zellikle i\u00e7 i\u00e7e y\u00f6nlendirmelerdeki basitle\u015fme, b\u00fcy\u00fck uygulamalar\u0131n y\u00f6netimini \u00f6nemli \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131rmaktad\u0131r.<\/p>\n<h2 id=\"react-router-v6-ile-uygulamalarinizda-yonlendirme-nasil-yapilir-uygulamali-kilavuz\">React Router v6 ile Uygulamalar\u0131n\u0131zda Y\u00f6nlendirme Nas\u0131l Yap\u0131l\u0131r? (Uygulamal\u0131 K\u0131lavuz)<\/h2>\n<p>React Router v6'n\u0131n yeniliklerini teori d\u00fczeyinde inceledikten sonra, \u015fimdi s\u0131ra bunlar\u0131 pratik bir \u015fekilde uygulamaya geldi. Bu b\u00f6l\u00fcmde, ad\u0131m ad\u0131m bir React uygulamas\u0131nda v6 ile y\u00f6nlendirme kurmay\u0131, dinamik rotalar\u0131 y\u00f6netmeyi ve i\u00e7 i\u00e7e y\u00f6nlendirmelerin g\u00fcc\u00fcn\u00fc kullanmay\u0131 \u00f6\u011frenece\u011fiz. Bu k\u0131lavuz, konuya yeni ba\u015flayanlar\u0131n bile kolayca takip edebilece\u011fi \u015fekilde tasarlanm\u0131\u015ft\u0131r.<\/p>\n<h3>1. Kurulum ve \u0130lk Ad\u0131mlar<\/h3>\n<p>React Router v6'y\u0131 projenize eklemek i\u00e7in \u00f6ncelikle <code>react-router-dom<\/code> paketini kurman\u0131z gerekir. A\u015fa\u011f\u0131daki komutu kullanarak projelerinize kurulumu ger\u00e7ekle\u015ftirebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">\nnpm install react-router-dom@6\n# veya\nyarn add react-router-dom@6\n    <\/pre>\n<p><\/code><\/p>\n<p>Kurulum tamamland\u0131ktan sonra, y\u00f6nlendirme i\u015flevselli\u011fini uygulaman\u0131z\u0131n ana bile\u015feninde etkinle\u015ftirmemiz gerekiyor. Genellikle bu, <code>src\/index.js<\/code> veya <code>src\/App.js<\/code> dosyas\u0131nda <code>BrowserRouter<\/code> bile\u015fenini kullanarak yap\u0131l\u0131r.<\/p>\n<pre><code class=\"language-jsx\">\n\/\/ src\/index.js\nimport React from 'react';\nimport ReactDOM from 'react-dom\/client';\nimport { BrowserRouter } from 'react-router-dom';\nimport App from '.\/App';\n\nconst root = ReactDOM.createRoot(document.getElementById('root'));\nroot.render(\n  <React.StrictMode>\n    <BrowserRouter>\n      <App \/>\n    <\/BrowserRouter>\n  <\/React.StrictMode>\n);\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kodda, <code>App<\/code> bile\u015fenimizi <code>BrowserRouter<\/code> ile sard\u0131k. Bu, t\u00fcm alt bile\u015fenlerin React Router'\u0131n \u00f6zelliklerine (<code>Link<\/code>, <code>Routes<\/code>, hook'lar vb.) eri\u015febilmesini sa\u011flar.<\/p>\n<h3>2. Basit Bir Y\u00f6nlendirme Yap\u0131s\u0131 Olu\u015fturma<\/h3>\n<p>\u015eimdi, ana sayfa, hakk\u0131nda ve ileti\u015fim sayfalar\u0131 i\u00e7in basit bir y\u00f6nlendirme yap\u0131s\u0131 olu\u015ftural\u0131m. Bunun i\u00e7in <code>App.js<\/code> dosyam\u0131z\u0131 ve birka\u00e7 temel bile\u015feni kullanaca\u011f\u0131z.<\/p>\n<pre><code class=\"language-jsx\">\n\/\/ src\/components\/HomePage.js\nfunction HomePage() {\n  return <h2>Ana Sayfa \u0130\u00e7eri\u011fi<\/h2>;\n}\nexport default HomePage;\n\n\/\/ src\/components\/AboutPage.js\nfunction AboutPage() {\n  return <h2>Hakk\u0131m\u0131zda Sayfas\u0131 \u0130\u00e7eri\u011fi<\/h2>;\n}\nexport default AboutPage;\n\n\/\/ src\/components\/ContactPage.js\nfunction ContactPage() {\n  return <h2>\u0130leti\u015fim Sayfas\u0131 \u0130\u00e7eri\u011fi<\/h2>;\n}\nexport default ContactPage;\n\n\/\/ src\/App.js\nimport { Routes, Route, Link } from 'react-router-dom';\nimport HomePage from '.\/components\/HomePage';\nimport AboutPage from '.\/components\/AboutPage';\nimport ContactPage from '.\/components\/ContactPage';\n\nfunction App() {\n  return (\n    <div>\n      <nav>\n        <ul>\n          <li>\n            <Link to=\"\/\">Ana Sayfa<\/Link>\n          <\/li>\n          <li>\n            <Link to=\"\/about\">Hakk\u0131m\u0131zda<\/Link>\n          <\/li>\n          <li>\n            <Link to=\"\/contact\">\u0130leti\u015fim<\/Link>\n          <\/li>\n        <\/ul>\n      <\/nav>\n\n      <hr \/>\n\n      <Routes>\n        <Route path=\"\/\" element={<HomePage \/>} \/>\n        <Route path=\"\/about\" element={<AboutPage \/>} \/>\n        <Route path=\"\/contact\" element={<ContactPage \/>} \/>\n      <\/Routes>\n    <\/div>\n  );\n}\n\nexport default App;\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>Link<\/code> bile\u015fenleri navigasyon men\u00fcs\u00fcn\u00fc olu\u015ftururken, <code>Routes<\/code> bile\u015feni i\u00e7erisindeki <code>Route<\/code>'lar URL'ye g\u00f6re do\u011fru bile\u015fenin render edilmesini sa\u011flar. G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, v5'teki <code>exact<\/code> prop'una art\u0131k ihtiyac\u0131m\u0131z yok.<\/p>\n<h3>3. Dinamik Y\u00f6nlendirmeler ve <code>useParams<\/code> Kullan\u0131m\u0131<\/h3>\n<p>\u00c7o\u011fu uygulamada, bir kaynak koleksiyonundaki (\u00f6rne\u011fin kullan\u0131c\u0131lar veya \u00fcr\u00fcnler) belirli bir \u00f6\u011feyi g\u00f6stermek istersiniz. Bu durumlar i\u00e7in dinamik rotalar kullan\u0131r\u0131z. Dinamik rotalar, URL'de de\u011fi\u015fken bir segment (<code>:<\/code> ile belirtilir) i\u00e7erir ve bu de\u011fi\u015fkenin de\u011ferine <code>useParams<\/code> hook'u ile eri\u015febiliriz.<\/p>\n<pre><code class=\"language-jsx\">\n\/\/ src\/components\/UserPage.js\nimport { useParams } from 'react-router-dom';\n\nfunction UserPage() {\n  const { id } = useParams();\n  return (\n    <h2>Kullan\u0131c\u0131 Detaylar\u0131: ID {id}<\/h2>\n  );\n}\nexport default UserPage;\n\n\/\/ src\/App.js (Routes k\u0131sm\u0131na ekleyin)\n\/\/ ...\n        <Route path=\"\/users\/:id\" element={<UserPage \/>} \/>\n\/\/ ...\n\n\/\/ Navigasyon men\u00fcs\u00fcne \u00f6rnek link ekleyin\n\/\/ ...\n          <li>\n            <Link to=\"\/users\/123\">Kullan\u0131c\u0131 123<\/Link>\n          <\/li>\n          <li>\n            <Link to=\"\/users\/456\">Kullan\u0131c\u0131 456<\/Link>\n          <\/li>\n\/\/ ...\n    <\/pre>\n<p><\/code><\/p>\n<p><code>\/users\/123<\/code> gibi bir URL'ye gitti\u011finizde, <code>UserPage<\/code> bile\u015feni render edilecek ve <code>useParams<\/code> hook'u sayesinde <code>id<\/code> de\u011fi\u015fkeninin de\u011feri \"123\" olarak al\u0131nacakt\u0131r.<\/p>\n<h3>4. \u0130\u00e7 \u0130\u00e7e Y\u00f6nlendirmeler (Nested Routes) ve <code>Outlet<\/code><\/h3>\n<p>\u0130\u00e7 i\u00e7e y\u00f6nlendirmeler, belirli bir b\u00f6l\u00fcm\u00fcn alt\u0131ndaki sayfalar\u0131n ortak bir layout'u payla\u015fmas\u0131n\u0131 sa\u011flayan g\u00fc\u00e7l\u00fc bir \u00f6zelliktir. \u00d6rne\u011fin, bir y\u00f6netici paneli genellikle sol men\u00fc ve \u00fcst navigasyon gibi ortak elementlere sahiptir, ancak ana i\u00e7erik alan\u0131 alt rotalara g\u00f6re de\u011fi\u015fir. React Router v6, <code>Outlet<\/code> bile\u015feni ile bu yap\u0131y\u0131 inan\u0131lmaz derecede kolayla\u015ft\u0131r\u0131r.<\/p>\n<pre><code class=\"language-jsx\">\n\/\/ src\/components\/DashboardLayout.js\nimport { Outlet, Link } from 'react-router-dom';\n\nfunction DashboardLayout() {\n  return (\n    <div style={{ display: 'flex' }}>\n      <nav style={{ borderRight: 'solid 1px', padding: '1rem' }}>\n        <Link to=\".\">Dashboard Ana<\/Link><br \/>\n        <Link to=\"profile\">Profil<\/Link><br \/>\n        <Link to=\"settings\">Ayarlar<\/Link>\n      <\/nav>\n      <div style={{ flex: 1, padding: '1rem' }}>\n        <Outlet \/> {\/* Alt rotalar\u0131n i\u00e7eri\u011fi burada render edilecek *\/}\n      <\/div>\n    <\/div>\n  );\n}\nexport default DashboardLayout;\n\n\/\/ src\/components\/DashboardIndex.js\nfunction DashboardIndex() {\n  return <h3>Dashboard Genel Bak\u0131\u015f<\/h3>;\n}\nexport default DashboardIndex;\n\n\/\/ src\/components\/ProfilePage.js\nfunction ProfilePage() {\n  return <h3>Profil Sayfas\u0131<\/h3>;\n}\nexport default ProfilePage;\n\n\/\/ src\/components\/SettingsPage.js\nfunction SettingsPage() {\n  return <h3>Ayarlar Sayfas\u0131<\/h3>;\n}\nexport default SettingsPage;\n\n\/\/ src\/App.js (Routes k\u0131sm\u0131na ekleyin)\n\/\/ ...\n        <Route path=\"\/dashboard\" element={<DashboardLayout \/>}>\n          <Route index element={<DashboardIndex \/>} \/> {\/* \/dashboard yolu i\u00e7in *\/}\n          <Route path=\"profile\" element={<ProfilePage \/>} \/>\n          <Route path=\"settings\" element={<SettingsPage \/>} \/>\n        <\/Route>\n\/\/ ...\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131da, <code>\/dashboard<\/code>, <code>\/dashboard\/profile<\/code> ve <code>\/dashboard\/settings<\/code> yollar\u0131, <code>DashboardLayout<\/code> bile\u015fenini kullan\u0131r ve alt i\u00e7erik <code>Outlet<\/code> i\u00e7inde dinamik olarak g\u00f6sterilir. <code>index<\/code> prop'u, \u00fcst yolun kendisiyle (<code>\/dashboard<\/code>) e\u015fle\u015fti\u011finde render edilecek varsay\u0131lan alt rotay\u0131 belirtir. Ayr\u0131ca, <code>Link to=\".\"<\/code> veya <code>Link to=\"profile\"<\/code> gibi g\u00f6receli yollar kullanarak daha temiz ve yeniden kullan\u0131labilir navigasyonlar olu\u015fturabilirsiniz. Bu, \u00f6zellikle bir bile\u015feni farkl\u0131 yerlerde kulland\u0131\u011f\u0131n\u0131zda rotalar\u0131 manuel olarak g\u00fcncelleme zahmetinden kurtar\u0131r.<\/p>\n<h2 id=\"programatik-yonlendirme-ve-sayfa-bulunamadi-404-yonetimi-nasil-saglanir\">Programatik Y\u00f6nlendirme ve Sayfa Bulunamad\u0131 (404) Y\u00f6netimi Nas\u0131l Sa\u011flan\u0131r?<\/h2>\n<p>Baz\u0131 durumlarda, kullan\u0131c\u0131 etkile\u015fimlerine veya belirli ko\u015fullara ba\u011fl\u0131 olarak programatik olarak y\u00f6nlendirme yapman\u0131z gerekebilir. \u00d6rne\u011fin, bir form g\u00f6nderimi ba\u015far\u0131l\u0131 oldu\u011funda veya bir kullan\u0131c\u0131n\u0131n kimli\u011fi do\u011fruland\u0131\u011f\u0131nda farkl\u0131 bir sayfaya ge\u00e7i\u015f yapmak isteyebilirsiniz. React Router v6, bu t\u00fcr senaryolar i\u00e7in <code>useNavigate<\/code> hook'unu sunar. Ayr\u0131ca, kullan\u0131c\u0131lar\u0131n yanl\u0131\u015f URL'ler girdi\u011finde kar\u015f\u0131la\u015facaklar\u0131 \"Sayfa Bulunamad\u0131\" (404) durumlar\u0131n\u0131 y\u00f6netmek de iyi bir kullan\u0131c\u0131 deneyimi i\u00e7in olduk\u00e7a \u00f6nemlidir.<\/p>\n<h3>1. <code>useNavigate<\/code> Hook'u ile Programatik Y\u00f6nlendirme<\/h3>\n<p><code>useNavigate<\/code>, fonksiyonel bile\u015fenlerde programatik y\u00f6nlendirme yapmak i\u00e7in kullan\u0131lan bir hook'tur. Bu hook, \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda bir y\u00f6nlendirme fonksiyonu d\u00f6nd\u00fcr\u00fcr. Bu fonksiyonu, istedi\u011finiz yolu (path) veya bir ge\u00e7mi\u015f ad\u0131m\u0131 (\u00f6rne\u011fin -1 bir \u00f6nceki sayfaya gitmek i\u00e7in) parametre olarak vererek kullanabilirsiniz.<\/p>\n<pre><code class=\"language-jsx\">\n\/\/ src\/components\/LoginPage.js\nimport { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nfunction LoginPage() {\n  const [username, setUsername] = useState('');\n  const [password, setPassword] = useState('');\n  const navigate = useNavigate();\n\n  const handleSubmit = (e) => {\n    e.preventDefault();\n    \/\/ Ger\u00e7ek bir uygulamada burada kimlik do\u011frulama API \u00e7a\u011fr\u0131s\u0131 olur.\n    if (username === 'admin' && password === '123') {\n      console.log('Giri\u015f ba\u015far\u0131l\u0131!');\n      \/\/ Ba\u015far\u0131l\u0131 giri\u015f sonras\u0131 \/dashboard sayfas\u0131na y\u00f6nlendirme\n      navigate('\/dashboard', { replace: true, state: { fromLogin: true } });\n      \/\/ <code>replace: true<\/code> ge\u00e7mi\u015fteki mevcut girdiyi de\u011fi\u015ftirir, b\u00f6ylece kullan\u0131c\u0131 geri d\u00f6nemez.\n      \/\/ <code>state<\/code> ile y\u00f6nlendirme s\u0131ras\u0131nda ek veri iletebilirsiniz.\n    } else {\n      console.log('Ge\u00e7ersiz kullan\u0131c\u0131 ad\u0131 veya \u015fifre.');\n      alert('Giri\u015f ba\u015far\u0131s\u0131z!');\n    }\n  };\n\n  return (\n    <div>\n      <h2>Giri\u015f Yap<\/h2>\n      <form onSubmit={handleSubmit}>\n        <input\n          type=\"text\"\n          placeholder=\"Kullan\u0131c\u0131 Ad\u0131\"\n          value={username}\n          onChange={(e) => setUsername(e.target.value)}\n        \/><br \/>\n        <input\n          type=\"password\"\n          placeholder=\"\u015eifre\"\n          value={password}\n          onChange={(e) => setPassword(e.target.value)}\n        \/><br \/>\n        <button type=\"submit\">Giri\u015f Yap<\/button>\n      <\/form>\n      <button onClick={() => navigate(-1)}>Geri D\u00f6n<\/button>\n    <\/div>\n  );\n}\nexport default LoginPage;\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, kullan\u0131c\u0131 \"admin\" ve \"123\" ile giri\u015f yapmaya \u00e7al\u0131\u015ft\u0131\u011f\u0131nda <code>\/dashboard<\/code> sayfas\u0131na y\u00f6nlendirilir. <code>replace: true<\/code> se\u00e7ene\u011fi, kullan\u0131c\u0131n\u0131n taray\u0131c\u0131n\u0131n geri d\u00fc\u011fmesine basarak giri\u015f sayfas\u0131na geri d\u00f6nmesini engeller. Bu, \u00f6zellikle hassas i\u015flemler (\u00f6deme, giri\u015f) sonras\u0131 \u00f6nemli bir g\u00fcvenlik ve kullan\u0131c\u0131 deneyimi geli\u015ftirmesidir. Ayr\u0131ca <code>state<\/code> prop'u ile y\u00f6nlendirilen sayfaya ek veri g\u00f6nderebilirsiniz, bu veriye <code>useLocation().state<\/code> ile eri\u015filir.<\/p>\n<h3>2. Sayfa Bulunamad\u0131 (404) Y\u00f6netimi<\/h3>\n<p>Uygulaman\u0131zdaki rotalarla e\u015fle\u015fmeyen bir URL'ye eri\u015fildi\u011finde, kullan\u0131c\u0131ya bir \"Sayfa Bulunamad\u0131\" mesaj\u0131 g\u00f6stermek yayg\u0131n ve iyi bir pratik. React Router v6'da bunu, t\u00fcm tan\u0131mlanm\u0131\u015f rotalar\u0131n sonuna bir wildcard (<code>*<\/code>) yolu ekleyerek kolayca yapabiliriz. <code>*<\/code> yolu, di\u011fer t\u00fcm rotalar\u0131n e\u015fle\u015fmemesi durumunda yakalanacak olan varsay\u0131lan rotay\u0131 temsil eder.<\/p>\n<pre><code class=\"language-jsx\">\n\/\/ src\/components\/NotFoundPage.js\nimport { Link } from 'react-router-dom';\n\nfunction NotFoundPage() {\n  return (\n    <div>\n      <h2>404 - Sayfa Bulunamad\u0131<\/h2>\n      <p>Arad\u0131\u011f\u0131n\u0131z sayfa mevcut de\u011fil.<\/p>\n      <Link to=\"\/\">Ana Sayfaya D\u00f6n<\/Link>\n    <\/div>\n  );\n}\nexport default NotFoundPage;\n\n\/\/ src\/App.js (Routes blo\u011funun en sonuna ekleyin)\n\/\/ ...\n        <Route path=\"*\" element={<NotFoundPage \/>} \/> {\/* T\u00fcm e\u015fle\u015fmeyen yollar i\u00e7in *\/}\n\/\/ ...\n    <\/pre>\n<p><\/code><\/p>\n<p><code>Routes<\/code> bile\u015feni i\u00e7erisindeki <code>Route<\/code>'lar, en spesifik olandan en genel olana do\u011fru e\u015fle\u015fti\u011fi i\u00e7in, <code>path=\"*\"<\/code> olan rota en sona eklenmelidir. Bu sayede, daha spesifik yollar \u00f6nce kontrol edilir ve e\u011fer hi\u00e7biri e\u015fle\u015fmezse, en son <code>NotFoundPage<\/code> devreye girer. Bu yap\u0131, uygulaman\u0131z\u0131n beklenmedik URL giri\u015flerine kar\u015f\u0131 sa\u011flam olmas\u0131n\u0131 sa\u011flar ve kullan\u0131c\u0131lar\u0131n kaybolmas\u0131n\u0131 engeller.<\/p>\n<aside class=\"box-tip\">Uzman \u0130pucu: 404 sayfas\u0131na y\u00f6nlendirme yaparken, sunucu taraf\u0131nda da uygun HTTP durum kodunu (404 Not Found) d\u00f6nd\u00fcrmeyi d\u00fc\u015f\u00fcnmelisiniz. Bu, SEO a\u00e7\u0131s\u0131ndan \u00f6nemlidir ve arama motorlar\u0131n\u0131n sitenizdeki bozuk ba\u011flant\u0131lar\u0131 anlamas\u0131na yard\u0131mc\u0131 olur. Single Page Applications'da bu genellikle sunucu yap\u0131land\u0131rmas\u0131 veya \u00f6zel serverless fonksiyonlar\u0131 ile sa\u011flan\u0131r.<\/aside>\n<h2 id=\"gercek-dunya-senaryolarinda-react-router-v6-kullanimi-bir-e-ticaret-uygulamasi-ornegi\">Ger\u00e7ek D\u00fcnya Senaryolar\u0131nda React Router v6 Kullan\u0131m\u0131: Bir E-Ticaret Uygulamas\u0131 \u00d6rne\u011fi<\/h2>\n<p>Teorik bilgiler ve temel \u00f6rnekler g\u00fczel olsa da, React Router v6'n\u0131n ger\u00e7ek bir uygulamada nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6rmek en iyi \u00f6\u011frenme yollar\u0131ndan biridir. \u015eimdi, bir e-ticaret uygulamas\u0131n\u0131n y\u00f6nlendirme yap\u0131s\u0131n\u0131 React Router v6 ile nas\u0131l kurabilece\u011fimizi g\u00f6steren bir vaka analizine odaklanal\u0131m. Bu \u00f6rnek, dinamik rotalar, i\u00e7 i\u00e7e y\u00f6nlendirmeler, navigasyon men\u00fcs\u00fc ve hatta basit bir kimlik do\u011frulama korumas\u0131 gibi yayg\u0131n gereksinimleri kapsayacakt\u0131r.<\/p>\n<h3>Uygulama Senaryosu: Mini E-Ticaret Platformu<\/h3>\n<p>Hayali e-ticaret uygulamam\u0131z a\u015fa\u011f\u0131daki sayfa yap\u0131s\u0131na sahip olacak:<\/p>\n<ul>\n<li><strong>Ana Sayfa (<code>\/<\/code>):<\/strong> \u00d6ne \u00e7\u0131kan \u00fcr\u00fcnler.<\/li>\n<li><strong>\u00dcr\u00fcn Listesi (<code>\/products<\/code>):<\/strong> T\u00fcm \u00fcr\u00fcnleri listeler.<\/li>\n<li><strong>\u00dcr\u00fcn Detay\u0131 (<code>\/products\/:productId<\/code>):<\/strong> Belirli bir \u00fcr\u00fcn\u00fcn detaylar\u0131n\u0131 g\u00f6sterir.<\/li>\n<li><strong>Sepet (<code>\/cart<\/code>):<\/strong> Kullan\u0131c\u0131n\u0131n sepetindeki \u00fcr\u00fcnler.<\/li>\n<li><strong>Y\u00f6netici Paneli (<code>\/admin<\/code>):<\/strong> Sadece oturum a\u00e7m\u0131\u015f y\u00f6neticilerin eri\u015febilece\u011fi bir alan.<\/li>\n<ul>\n<li><strong>Y\u00f6netici Ana Sayfas\u0131 (<code>\/admin<\/code>):<\/strong> Y\u00f6netici paneline genel bak\u0131\u015f.<\/li>\n<li><strong>\u00dcr\u00fcn Y\u00f6netimi (<code>\/admin\/products<\/code>):<\/strong> \u00dcr\u00fcnleri ekleme, d\u00fczenleme, silme.<\/li>\n<li><strong>Kullan\u0131c\u0131 Y\u00f6netimi (<code>\/admin\/users<\/code>):<\/strong> Kullan\u0131c\u0131lar\u0131 y\u00f6netme.<\/li>\n<\/ul>\n<li><strong>Giri\u015f Sayfas\u0131 (<code>\/login<\/code>):<\/strong> Kullan\u0131c\u0131lar\u0131n giri\u015f yapabilece\u011fi sayfa.<\/li>\n<li><strong>404 Sayfas\u0131 (<code>*<\/code>):<\/strong> Bulunamayan sayfalar i\u00e7in.<\/li>\n<\/ul>\n<h3>Kod Yap\u0131s\u0131 ve Bile\u015fenler<\/h3>\n<pre><code class=\"language-jsx\">\n\/\/ src\/AuthContext.js (Basit bir kimlik do\u011frulama ba\u011flam\u0131)\nimport React, { createContext, useState, useContext } from 'react';\n\nconst AuthContext = createContext(null);\n\nexport function AuthProvider({ children }) {\n  const [user, setUser] = useState(null); \/\/ 'admin' veya null\n\n  const signin = (newUser, callback) => {\n    \/\/ Ger\u00e7ek bir uygulamada burada API \u00e7a\u011fr\u0131s\u0131 ve token saklama olur\n    return new Promise(resolve => {\n      setUser(newUser);\n      resolve();\n      callback && callback();\n    });\n  };\n\n  const signout = (callback) => {\n    return new Promise(resolve => {\n      setUser(null);\n      resolve();\n      callback && callback();\n    });\n  };\n\n  const value = { user, signin, signout };\n  return <AuthContext.Provider value={value}>{children}<\/AuthContext.Provider>;\n}\n\nexport function useAuth() {\n  return useContext(AuthContext);\n}\n\n\/\/ src\/components\/RequireAuth.js (Kimlik do\u011frulama korumas\u0131)\nimport React from 'react';\nimport { useLocation, Navigate } from 'react-router-dom';\nimport { useAuth } from '..\/AuthContext';\n\nfunction RequireAuth({ children }) {\n  let auth = useAuth();\n  let location = useLocation();\n\n  if (!auth.user) {\n    \/\/ Oturum a\u00e7\u0131lmad\u0131ysa, giri\u015f sayfas\u0131na y\u00f6nlendir.\n    \/\/ Ancak, kullan\u0131c\u0131 giri\u015f yapt\u0131ktan sonra buraya geri d\u00f6nebilmesi i\u00e7in\n    \/\/ mevcut konum bilgisini state ile g\u00f6nder.\n    return <Navigate to=\"\/login\" state={{ from: location }} replace \/>;\n  }\n\n  return children;\n}\n\n\/\/ src\/components\/Layout.js (Genel layout bile\u015feni)\nimport { NavLink, Outlet } from 'react-router-dom';\nimport { useAuth } from '..\/AuthContext';\n\nfunction Layout() {\n  const auth = useAuth();\n\n  return (\n    <div>\n      <nav style={{ borderBottom: 'solid 1px', paddingBottom: '1rem' }}>\n        <NavLink to=\"\/\" className={({ isActive }) => isActive ? \"active-link\" : \"\"}>Ana Sayfa<\/NavLink> | \u00a0\n        <NavLink to=\"\/products\" className={({ isActive }) => isActive ? \"active-link\" : \"\"}>\u00dcr\u00fcnler<\/NavLink> | \u00a0\n        <NavLink to=\"\/cart\" className={({ isActive }) => isActive ? \"active-link\" : \"\"}>Sepet<\/NavLink> | \u00a0\n        {auth.user ? (\n          <>\n            <NavLink to=\"\/admin\" className={({ isActive }) => isActive ? \"active-link\" : \"\"}>Y\u00f6netim<\/NavLink> | \u00a0\n            <button onClick={auth.signout}>\u00c7\u0131k\u0131\u015f ({auth.user})<\/button>\n          <\/>\n        ) : (\n          <NavLink to=\"\/login\" className={({ isActive }) => isActive ? \"active-link\" : \"\"}>Giri\u015f Yap<\/NavLink>\n        )}\n      <\/nav>\n      <div style={{ paddingTop: '1rem' }}>\n        <Outlet \/> {\/* Sayfa i\u00e7eri\u011fi burada render edilecek *\/}\n      <\/div>\n    <\/div>\n  );\n}\nexport default Layout;\n\n\/\/ src\/components\/AdminLayout.js (Admin paneli i\u00e7in \u00f6zel layout)\nimport { NavLink, Outlet } from 'react-router-dom';\n\nfunction AdminLayout() {\n  return (\n    <div style={{ display: 'flex', border: '1px solid gray', marginTop: '1rem' }}>\n      <nav style={{ borderRight: 'solid 1px', padding: '1rem', width: '150px' }}>\n        <h4>Admin Men\u00fcs\u00fc<\/h4>\n        <NavLink to=\".\" end className={({ isActive }) => isActive ? \"active-link\" : \"\"}>Dashboard<\/NavLink><br \/>\n        <NavLink to=\"products\" className={({ isActive }) => isActive ? \"active-link\" : \"\"}>\u00dcr\u00fcnler<\/NavLink><br \/>\n        <NavLink to=\"users\" className={({ isActive }) => isActive ? \"active-link\" : \"\"}>Kullan\u0131c\u0131lar<\/NavLink>\n      <\/nav>\n      <div style={{ flex: 1, padding: '1rem' }}>\n        <Outlet \/>\n      <\/div>\n    <\/div>\n  );\n}\nexport default AdminLayout;\n\n\/\/ Basit sayfa bile\u015fenleri (HomePage, ProductsPage, ProductDetailPage, CartPage, AdminDashboard, AdminProducts, AdminUsers, NotFoundPage, LoginPage)\n\/\/ \u0130\u00e7erikleri k\u0131sa tutulmu\u015ftur.\nfunction HomePage() { return <h2>Ana Sayfa - \u00d6ne \u00c7\u0131kan \u00dcr\u00fcnler<\/h2>;}\nfunction ProductsPage() { return <h2>\u00dcr\u00fcn Listesi<\/h2>;}\nfunction ProductDetailPage() {\n  const { productId } = useParams();\n  return <h2>\u00dcr\u00fcn Detay\u0131: ID {productId}<\/h2>;\n}\nfunction CartPage() { return <h2>Al\u0131\u015fveri\u015f Sepeti<\/h2>;}\nfunction AdminDashboard() { return <h3>Y\u00f6netici Paneli - Genel Bak\u0131\u015f<\/h3>;}\nfunction AdminProducts() { return <h3>Y\u00f6netici Paneli - \u00dcr\u00fcn Y\u00f6netimi<\/h3>;}\nfunction AdminUsers() { return <h3>Y\u00f6netici Paneli - Kullan\u0131c\u0131 Y\u00f6netimi<\/h3>;}\nfunction NotFoundPage() { return <h2>404 - Sayfa Bulunamad\u0131<\/h2>;}\n\n\/\/ src\/App.js (Ana uygulama bile\u015feni)\nimport { Routes, Route } from 'react-router-dom';\nimport { AuthProvider } from '.\/AuthContext';\n\/\/ T\u00fcm sayfa ve layout bile\u015fenleri buraya import edilecek\n\nfunction App() {\n  return (\n    <AuthProvider> {\/* Kimlik do\u011frulama ba\u011flam\u0131 sa\u011fl\u0131yoruz *\/}\n      <Routes>\n        <Route path=\"\/\" element={<Layout \/>}> {\/* Ortak layout *\/}\n          <Route index element={<HomePage \/>} \/>\n          <Route path=\"products\" element={<ProductsPage \/>} \/>\n          <Route path=\"products\/:productId\" element={<ProductDetailPage \/>} \/>\n          <Route path=\"cart\" element={<CartPage \/>} \/>\n          <Route path=\"login\" element={<LoginPage \/>} \/>\n\n          <Route\n            path=\"admin\"\n            element={\n              <RequireAuth> {\/* Y\u00f6netici paneline eri\u015fim i\u00e7in kimlik do\u011frulamas\u0131 *\/}\n                <AdminLayout \/>\n              <\/RequireAuth>\n            }\n          >\n            <Route index element={<AdminDashboard \/>} \/>\n            <Route path=\"products\" element={<AdminProducts \/>} \/>\n            <Route path=\"users\" element={<AdminUsers \/>} \/>\n          <\/Route>\n\n          <Route path=\"*\" element={<NotFoundPage \/>} \/> {\/* E\u015fle\u015fmeyen t\u00fcm yollar *\/}\n        <\/Route>\n      <\/Routes>\n    <\/AuthProvider>\n  );\n}\n\nexport default App;\n\n\/\/ Stil i\u00e7in (\u00d6rn: src\/index.css veya App.css)\n\/*\n.active-link {\n  font-weight: bold;\n  color: blue;\n}\n*\/\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>Layout<\/code> bile\u015feni t\u00fcm genel uygulama navigasyonunu ve i\u00e7eri\u011fi sarmalar. \u0130\u00e7indeki <code>Outlet<\/code>, ana rota i\u00e7eri\u011fini render eder. Y\u00f6netici paneli i\u00e7in, <code>AdminLayout<\/code> ad\u0131nda ayr\u0131 bir i\u00e7 i\u00e7e layout kulland\u0131k ve bu b\u00f6l\u00fcm\u00fc <code>RequireAuth<\/code> bile\u015feni ile koruduk. <code>RequireAuth<\/code>, kullan\u0131c\u0131n\u0131n oturum a\u00e7\u0131p a\u00e7mad\u0131\u011f\u0131n\u0131 kontrol eder ve e\u011fer a\u00e7mad\u0131ysa onu giri\u015f sayfas\u0131na y\u00f6nlendirir. Giri\u015f sayfas\u0131nda, ba\u015far\u0131l\u0131 bir kimlik do\u011frulamas\u0131ndan sonra kullan\u0131c\u0131, <code>state<\/code> ile iletilen orijinal hedefine geri y\u00f6nlendirilir. <code>NavLink<\/code> kullan\u0131m\u0131, aktif olan ba\u011flant\u0131y\u0131 vurgulayarak kullan\u0131c\u0131ya g\u00f6rsel geri bildirim sa\u011flar.<\/p>\n<p>Bu vaka analizi, React Router v6'n\u0131n esnekli\u011fini ve g\u00fc\u00e7l\u00fc yap\u0131s\u0131n\u0131 ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l kullanabilece\u011finizi g\u00f6steriyor. \u0130\u00e7 i\u00e7e y\u00f6nlendirmeler, dinamik parametreler ve programatik y\u00f6nlendirme gibi \u00f6zellikler sayesinde, b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalar\u0131 bile temiz ve y\u00f6netilebilir bir \u015fekilde in\u015fa edebilirsiniz.<\/p>\n<h3 id=\"react-router-v6-ile-performansi-ve-gelistirici-deneyimini-nasil-artirirsiniz-ipuclari-ve-puf-noktalari\">React Router v6 ile Performans\u0131 ve Geli\u015ftirici Deneyimini Nas\u0131l Art\u0131r\u0131rs\u0131n\u0131z? (\u0130pu\u00e7lar\u0131 ve P\u00fcf Noktalar\u0131)<\/h3>\n<p>React Router v6, zaten performans odakl\u0131 bir yap\u0131ya sahip olsa da, uygulaman\u0131z\u0131n h\u0131z\u0131n\u0131 ve geli\u015ftirici deneyimini daha da optimize etmek i\u00e7in uygulayabilece\u011finiz baz\u0131 ileri d\u00fczey teknikler ve en iyi pratikler bulunmaktad\u0131r.<\/p>\n<h4>1. Code Splitting (Kod B\u00f6l\u00fcmleme) ve Lazy Loading<\/h4>\n<p>Tek sayfa uygulamalar b\u00fcy\u00fcd\u00fck\u00e7e, t\u00fcm uygulaman\u0131n JavaScript bundle boyutu da artar, bu da ilk y\u00fckleme s\u00fcresini uzatabilir. Code Splitting (kod b\u00f6l\u00fcmleme), uygulaman\u0131z\u0131n kodunu daha k\u00fc\u00e7\u00fck par\u00e7alara b\u00f6lerek yaln\u0131zca o an ihtiya\u00e7 duyulan kodun y\u00fcklenmesini sa\u011flar. React Router ile bu, her bir rota i\u00e7in ayr\u0131 bir JavaScript par\u00e7as\u0131 y\u00fckleyerek kolayca yap\u0131labilir.<\/p>\n<p>React'\u0131n <code>React.lazy()<\/code> ve <code><Suspense><\/code> bile\u015fenleri, bu i\u015flemi basitle\u015ftirir:<\/p>\n<pre><code class=\"language-jsx\">\nimport React, { lazy, Suspense } from 'react';\nimport { Routes, Route } from 'react-router-dom';\n\nconst HomePage = lazy(() => import('.\/components\/HomePage'));\nconst AboutPage = lazy(() => import('.\/components\/AboutPage'));\nconst ProductDetailPage = lazy(() => import('.\/components\/ProductDetailPage'));\nconst AdminLayout = lazy(() => import('.\/components\/AdminLayout')); \/\/ Layoutlar bile olabilir\n\nfunction AppWithLazyLoading() {\n  return (\n    <Suspense fallback={<div>Y\u00fckleniyor...<\/div>}>\n      <Routes>\n        <Route path=\"\/\" element={<HomePage \/>} \/>\n        <Route path=\"\/about\" element={<AboutPage \/>} \/>\n        <Route path=\"\/products\/:productId\" element={<ProductDetailPage \/>} \/>\n        <Route path=\"\/admin\/*\" element={<AdminLayout \/>} \/>\n        {\/* Di\u011fer rotalar *\/}\n      <\/Routes>\n    <\/Suspense>\n  );\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu yakla\u015f\u0131m, kullan\u0131c\u0131 sadece ilgili rotaya gitti\u011finde o rotan\u0131n bile\u015fen kodunun y\u00fcklenmesini sa\u011flar. Bu, \u00f6zellikle b\u00fcy\u00fck uygulamalarda ilk y\u00fckleme s\u00fcresini \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r ve dolay\u0131s\u0131yla kullan\u0131c\u0131 deneyimini iyile\u015ftirir.<\/p>\n<h4>2. Route Guards (Y\u00f6nlendirme Korumalar\u0131) i\u00e7in En \u0130yi Pratikler<\/h4>\n<p>Daha \u00f6nceki \u00f6rnekte <code>RequireAuth<\/code> bile\u015fenini g\u00f6rd\u00fck. Bu t\u00fcr bile\u015fenler, belirli rotalara eri\u015fimi kontrol etmek i\u00e7in \u00e7ok g\u00fc\u00e7l\u00fcd\u00fcr. Ancak karma\u015f\u0131k mant\u0131klarda (\u00f6rne\u011fin, birden fazla rol kontrol\u00fc, belirli bir aboneli\u011fin olup olmad\u0131\u011f\u0131) bu koruma bile\u015fenlerini daha soyut hale getirebilirsiniz. Bir koruma bile\u015feni, React Router'\u0131n <code>Outlet<\/code> mekanizmas\u0131n\u0131 ve <code>Navigate<\/code> bile\u015fenini kullanarak \u00e7ocuk rotalar\u0131n\u0131 ko\u015fullu olarak render edebilir.<\/p>\n<pre><code class=\"language-jsx\">\n\/\/ \u00d6rnek: Role dayal\u0131 eri\u015fim kontrol\u00fc\nfunction RequireAdmin({ children }) {\n  const auth = useAuth();\n  if (!auth.user || auth.user.role !== 'admin') {\n    return <Navigate to=\"\/unauthorized\" replace \/>;\n  }\n  return children;\n}\n\n\/\/ Routes i\u00e7inde kullan\u0131m\u0131:\n<Route\n  path=\"\/admin\"\n  element={<RequireAdmin><AdminLayout \/><\/RequireAdmin>}\n>\n  {\/* Admin alt rotalar\u0131 *\/}\n<\/Route>\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131, koruma mant\u0131\u011f\u0131n\u0131 rotalardan ay\u0131rarak kodunuzu daha mod\u00fcler hale getirir.<\/p>\n<h4>3. Hata Yakalama (Error Boundary)<\/h4>\n<p>React Router rotalar\u0131 i\u00e7indeki bile\u015fenlerde meydana gelen render hatalar\u0131 uygulaman\u0131z\u0131n \u00e7\u00f6kmesine neden olabilir. Bu t\u00fcr hatalar\u0131 yakalamak ve kullan\u0131c\u0131ya dost\u00e7a bir mesaj g\u00f6stermek i\u00e7in <code>ErrorBoundary<\/code> bile\u015fenleri kullanmak iyi bir uygulamad\u0131r. React Router v6, do\u011frudan bir <code>ErrorBoundary<\/code> bile\u015feni sa\u011flamaz ancak React'\u0131n kendi <code>ErrorBoundary<\/code> \u00f6zelli\u011fini rotalar\u0131n\u0131z\u0131n etraf\u0131na sararak kullanabilirsiniz.<\/p>\n<pre><code class=\"language-jsx\">\n\/\/ src\/components\/ErrorBoundary.js (\u00d6rnek ErrorBoundary bile\u015feni)\nimport React from 'react';\n\nclass ErrorBoundary extends React.Component {\n  constructor(props) {\n    super(props);\n    this.state = { hasError: false };\n  }\n\n  static getDerivedStateFromError(error) {\n    return { hasError: true };\n  }\n\n  componentDidCatch(error, errorInfo) {\n    console.error(\"ErrorBoundary yakalanan hata:\", error, errorInfo);\n  }\n\n  render() {\n    if (this.state.hasError) {\n      return <h1>Bir \u015feyler ters gitti.<\/h1>;\n    }\n    return this.props.children;\n  }\n}\nexport default ErrorBoundary;\n\n\/\/ App.js i\u00e7inde kullan\u0131m\u0131:\n<Routes>\n  <Route\n    path=\"\/faulty-component\"\n    element={\n      <ErrorBoundary>\n        <FaultyComponent \/> {\/* Hata verebilecek bir bile\u015fen *\/}\n      <\/ErrorBoundary>\n    }\n  \/>\n  {\/* Di\u011fer rotalar *\/}\n<\/Routes>\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu sayede, uygulaman\u0131z\u0131n tamam\u0131n\u0131n \u00e7\u00f6kmesi yerine, sadece hatal\u0131 b\u00f6l\u00fcm i\u00e7in bir geri d\u00f6n\u00fc\u015f aray\u00fcz\u00fc g\u00f6sterebilirsiniz.<\/p>\n<h2 id=\"sonuc-react-router-v6-ile-gelecege-yonelik-yonlendirme\">Sonu\u00e7: React Router v6 ile Gelece\u011fe Y\u00f6nelik Y\u00f6nlendirme<\/h2>\n<p>React Router v6, tek sayfa uygulamalar i\u00e7in y\u00f6nlendirme konusunda React ekosistemindeki en g\u00fc\u00e7l\u00fc ve esnek \u00e7\u00f6z\u00fcmlerden biri olmaya devam ediyor. V5'ten miras ald\u0131\u011f\u0131 sa\u011flam temeller \u00fczerine in\u015fa edilen bu yeni s\u00fcr\u00fcm, \u00f6zellikle <code>Routes<\/code>, <code>useNavigate<\/code> ve <code>Outlet<\/code> gibi yenilik\u00e7i API'lerle geli\u015ftiricilere daha sade, daha verimli ve daha sezgisel bir deneyim sunmaktad\u0131r. <code>exact<\/code> prop'unun kald\u0131r\u0131lmas\u0131 ve i\u00e7 i\u00e7e y\u00f6nlendirmelerin basitle\u015ftirilmesi, karma\u015f\u0131k uygulama mimarilerini y\u00f6netmeyi \u00f6nemli \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131rm\u0131\u015ft\u0131r. G\u00f6receli yollar\u0131n ve programatik y\u00f6nlendirme i\u00e7in <code>useNavigate<\/code>'in sa\u011flad\u0131\u011f\u0131 esneklik, geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131rken kod kalitesini de art\u0131rmaktad\u0131r.<\/p>\n<p>Bu rehberde, React Router v6'n\u0131n temel kavramlar\u0131ndan ba\u015flayarak, v5 ile aras\u0131ndaki kritik farklar\u0131, ad\u0131m ad\u0131m kurulum ve kullan\u0131m \u00f6rneklerini, dinamik rota y\u00f6netimini ve i\u00e7 i\u00e7e y\u00f6nlendirmelerin g\u00fcc\u00fcn\u00fc ele ald\u0131k. Ayr\u0131ca, bir e-ticaret uygulamas\u0131 \u00fczerinden ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l kullan\u0131labilece\u011fini g\u00f6steren bir vaka analizi sunduk. Son olarak, kod b\u00f6l\u00fcmleme, rota korumalar\u0131 ve hata yakalama gibi ileri d\u00fczey tekniklerle performans ve geli\u015ftirici deneyimini nas\u0131l iyile\u015ftirebilece\u011finize dair ipu\u00e7lar\u0131 payla\u015ft\u0131k.<\/p>\n<p>React Router v6'ya ge\u00e7i\u015f yapmak veya yeni projelerinizi v6 ile ba\u015flatmak, uygulaman\u0131z\u0131n y\u00f6nlendirme yap\u0131s\u0131n\u0131 modern standartlara uygun hale getirmekle kalmayacak, ayn\u0131 zamanda geli\u015ftirici \u00fcretkenli\u011finizi de art\u0131racakt\u0131r. Daha az kod, daha net API'ler ve g\u00fc\u00e7l\u00fc i\u00e7 i\u00e7e y\u00f6nlendirme yetenekleri sayesinde, kullan\u0131c\u0131lar\u0131n\u0131za kesintisiz ve ak\u0131c\u0131 bir navigasyon deneyimi sunarken, kendi kod taban\u0131n\u0131z\u0131 daha kolay y\u00f6netebileceksiniz. React ekosistemi s\u00fcrekli evrilirken, React Router v6 bu evrimin en ba\u015far\u0131l\u0131 \u00f6rneklerinden birini temsil etmektedir. Uygulamalar\u0131n\u0131z\u0131n gelece\u011fe haz\u0131r olmas\u0131 i\u00e7in bu g\u00fc\u00e7l\u00fc arac\u0131 benimsemekten \u00e7ekinmeyin!<\/p>\n<h3 id=\"sikca-sorulan-sorular-sss\">S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<dl>\n<dt><strong>1. React Router v5'ten v6'ya ge\u00e7i\u015f zor mu?<\/strong><\/dt>\n<dd>Hay\u0131r, genel olarak ge\u00e7i\u015f olduk\u00e7a kolayd\u0131r, \u00f6zellikle uygulaman\u0131z b\u00fcy\u00fck ve karma\u015f\u0131k de\u011filse. Temel de\u011fi\u015fiklikler <code>Switch<\/code> yerine <code>Routes<\/code>, <code>useHistory<\/code> yerine <code>useNavigate<\/code> ve <code>Route<\/code> prop'lar\u0131ndaki (<code>component<\/code>\/<code>render<\/code> yerine <code>element<\/code>) farkl\u0131l\u0131klard\u0131r. React Router, ge\u00e7i\u015f s\u00fcrecini kolayla\u015ft\u0131rmak i\u00e7in iyi belgelendirilmi\u015f bir ge\u00e7i\u015f k\u0131lavuzu sunmaktad\u0131r.<\/dd>\n<dt><strong>2. <code>useParams<\/code> hook'u nas\u0131l kullan\u0131l\u0131r?<\/strong><\/dt>\n<dd><code>useParams<\/code> hook'u, dinamik bir rotada (\u00f6rne\u011fin <code>\/products\/:id<\/code>) URL'den parametreleri almak i\u00e7in kullan\u0131l\u0131r. Bile\u015feninizin i\u00e7inde \u00e7a\u011f\u0131rarak parametreleri bir nesne olarak d\u00f6nd\u00fcr\u00fcr:<\/p>\n<pre><code class=\"language-jsx\">\nimport { useParams } from 'react-router-dom';\nfunction ProductDetail() {\n  const { id } = useParams();\n  return <div>\u00dcr\u00fcn ID: {id}<\/div>;\n{\n            <\/pre>\n<p><\/code>\n        <\/dd>\n<dt><strong>3. \u0130\u00e7 i\u00e7e (nested) routing i\u00e7in en iyi pratik nedir?<\/strong><\/dt>\n<dd>React Router v6'da i\u00e7 i\u00e7e routing i\u00e7in en iyi pratik, \u00fcst <code><Route><\/code> i\u00e7inde alt <code><Route><\/code>'lar\u0131 tan\u0131mlamak ve \u00fcst bile\u015fende alt rotalar\u0131n i\u00e7eri\u011fini render etmek i\u00e7in <code><Outlet \/><\/code> bile\u015fenini kullanmakt\u0131r. Bu, ortak layout'lar\u0131 daha temiz ve mod\u00fcler bir \u015fekilde y\u00f6netmenizi sa\u011flar. Ayr\u0131ca, alt rotalar i\u00e7in g\u00f6receli yollar (<code>to=\"child-path\"<\/code>) kullanmak kod tekrar\u0131n\u0131 azalt\u0131r.<\/dd>\n<dt><strong>4. Uygulamamda 404 Sayfa Bulunamad\u0131 hatalar\u0131n\u0131 nas\u0131l y\u00f6netirim?<\/strong><\/dt>\n<dd>T\u00fcm tan\u0131ml\u0131 rotalar\u0131n sonuna bir wildcard (<code>*<\/code>) yolu i\u00e7eren bir <code><Route><\/code> ekleyerek 404 hatalar\u0131n\u0131 y\u00f6netebilirsiniz. Bu rota, di\u011fer t\u00fcm rotalar\u0131n e\u015fle\u015fmemesi durumunda devreye girer:<\/p>\n<pre><code class=\"language-jsx\">\n<Routes>\n  {\/* Di\u011fer rotalar *\/}\n  <Route path=\"*\" element={<NotFoundPage \/>} \/>\n<\/Routes>\n            <\/pre>\n<p><\/code>\n        <\/dd>\n<dt><strong>5. v6'da redirect i\u015flemi nas\u0131l yap\u0131l\u0131r?<\/strong><\/dt>\n<dd>React Router v6'da redirect (y\u00f6nlendirme) i\u015flemleri i\u00e7in <code><Navigate><\/code> bile\u015fenini veya <code>useNavigate<\/code> hook'unu kullan\u0131rs\u0131n\u0131z. \u00d6rne\u011fin, bir rotadan ba\u015fka bir rotaya an\u0131nda y\u00f6nlendirmek i\u00e7in <code><Navigate to=\"\/hedef-yol\" replace \/><\/code> kullanabilir veya bir fonksiyonda programatik olarak y\u00f6nlendirme yapmak i\u00e7in <code>const navigate = useNavigate(); navigate('\/hedef-yol');<\/code> kullanabilirsiniz. <code>replace<\/code> prop'u, ge\u00e7mi\u015f kayd\u0131n\u0131n \u00fczerine yazarak geri d\u00f6nmeyi engeller.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"React uygulamalar\u0131n\u0131zda sayfa ge\u00e7i\u015fleri, dinamik rotalar ve karma\u015f\u0131k y\u00f6nlendirme senaryolar\u0131 sizi zorluyor mu? Tek sayfa uygulamalar\u0131n (SPA) vazge\u00e7ilmezi&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[128],"tags":[],"class_list":{"0":"post-34286","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-react","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>React Router v6 K\u0131lavuzu: v5&#039;ten v6&#039;ya Ge\u00e7i\u015fin Tam Detaylar\u0131<\/title>\n<meta name=\"description\" content=\"React uygulamalar\u0131n\u0131zda sayfa ge\u00e7i\u015fleri, dinamik rotalar ve karma\u015f\u0131k y\u00f6nlendirme senaryolar\u0131 sizi zorluyor mu? Tek sayfa uygulamalar\u0131n (SPA) vazge\u00e7ilmezi olan y\u00f6nlendirme s\u00fcre\u00e7lerini modern, temiz ve performansl\u0131 bir \u015fekilde y\u00f6netmek isteyenler i\u00e7in React Router v6, pek \u00e7ok yenilik ve basitle\u015ftirme sunuyor. Bu kapsaml\u0131 rehber, React Router v5&#039;ten v6&#039;ya ge\u00e7i\u015fin t\u00fcm \u00f6nemli detaylar\u0131n\u0131, yeni API&#039;leri ve pratik kod \u00f6rneklerini ad\u0131m ad\u0131m a\u00e7\u0131klayarak uygulaman\u0131z\u0131n y\u00f6nlendirme yap\u0131s\u0131n\u0131 gelece\u011fe ta\u015f\u0131man\u0131z\u0131 sa\u011flayacak.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"React Router v6 K\u0131lavuzu: v5&#039;ten v6&#039;ya Ge\u00e7i\u015fin Tam Detaylar\u0131\" \/>\n<meta property=\"og:description\" content=\"React uygulamalar\u0131n\u0131zda sayfa ge\u00e7i\u015fleri, dinamik rotalar ve karma\u015f\u0131k y\u00f6nlendirme senaryolar\u0131 sizi zorluyor mu? Tek sayfa uygulamalar\u0131n (SPA) vazge\u00e7ilmezi olan y\u00f6nlendirme s\u00fcre\u00e7lerini modern, temiz ve performansl\u0131 bir \u015fekilde y\u00f6netmek isteyenler i\u00e7in React Router v6, pek \u00e7ok yenilik ve basitle\u015ftirme sunuyor. Bu kapsaml\u0131 rehber, React Router v5&#039;ten v6&#039;ya ge\u00e7i\u015fin t\u00fcm \u00f6nemli detaylar\u0131n\u0131, yeni API&#039;leri ve pratik kod \u00f6rneklerini ad\u0131m ad\u0131m a\u00e7\u0131klayarak uygulaman\u0131z\u0131n y\u00f6nlendirme yap\u0131s\u0131n\u0131 gelece\u011fe ta\u015f\u0131man\u0131z\u0131 sa\u011flayacak.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-14T05:31:35+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"25 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"React Router v6 K\u0131lavuzu: v5&#8217;ten v6&#8217;ya Ge\u00e7i\u015fin Tam Detaylar\u0131\",\"datePublished\":\"2025-11-14T05:31:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/\"},\"wordCount\":3804,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"React\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/\",\"name\":\"React Router v6 K\u0131lavuzu: v5'ten v6'ya Ge\u00e7i\u015fin Tam Detaylar\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-14T05:31:35+00:00\",\"description\":\"React uygulamalar\u0131n\u0131zda sayfa ge\u00e7i\u015fleri, dinamik rotalar ve karma\u015f\u0131k y\u00f6nlendirme senaryolar\u0131 sizi zorluyor mu? Tek sayfa uygulamalar\u0131n (SPA) vazge\u00e7ilmezi olan y\u00f6nlendirme s\u00fcre\u00e7lerini modern, temiz ve performansl\u0131 bir \u015fekilde y\u00f6netmek isteyenler i\u00e7in React Router v6, pek \u00e7ok yenilik ve basitle\u015ftirme sunuyor. Bu kapsaml\u0131 rehber, React Router v5'ten v6'ya ge\u00e7i\u015fin t\u00fcm \u00f6nemli detaylar\u0131n\u0131, yeni API'leri ve pratik kod \u00f6rneklerini ad\u0131m ad\u0131m a\u00e7\u0131klayarak uygulaman\u0131z\u0131n y\u00f6nlendirme yap\u0131s\u0131n\u0131 gelece\u011fe ta\u015f\u0131man\u0131z\u0131 sa\u011flayacak.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"React Router v6 K\u0131lavuzu: v5&#8217;ten v6&#8217;ya Ge\u00e7i\u015fin Tam Detaylar\u0131\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"React Router v6 K\u0131lavuzu: v5'ten v6'ya Ge\u00e7i\u015fin Tam Detaylar\u0131","description":"React uygulamalar\u0131n\u0131zda sayfa ge\u00e7i\u015fleri, dinamik rotalar ve karma\u015f\u0131k y\u00f6nlendirme senaryolar\u0131 sizi zorluyor mu? Tek sayfa uygulamalar\u0131n (SPA) vazge\u00e7ilmezi olan y\u00f6nlendirme s\u00fcre\u00e7lerini modern, temiz ve performansl\u0131 bir \u015fekilde y\u00f6netmek isteyenler i\u00e7in React Router v6, pek \u00e7ok yenilik ve basitle\u015ftirme sunuyor. Bu kapsaml\u0131 rehber, React Router v5'ten v6'ya ge\u00e7i\u015fin t\u00fcm \u00f6nemli detaylar\u0131n\u0131, yeni API'leri ve pratik kod \u00f6rneklerini ad\u0131m ad\u0131m a\u00e7\u0131klayarak uygulaman\u0131z\u0131n y\u00f6nlendirme yap\u0131s\u0131n\u0131 gelece\u011fe ta\u015f\u0131man\u0131z\u0131 sa\u011flayacak.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/","og_locale":"tr_TR","og_type":"article","og_title":"React Router v6 K\u0131lavuzu: v5'ten v6'ya Ge\u00e7i\u015fin Tam Detaylar\u0131","og_description":"React uygulamalar\u0131n\u0131zda sayfa ge\u00e7i\u015fleri, dinamik rotalar ve karma\u015f\u0131k y\u00f6nlendirme senaryolar\u0131 sizi zorluyor mu? Tek sayfa uygulamalar\u0131n (SPA) vazge\u00e7ilmezi olan y\u00f6nlendirme s\u00fcre\u00e7lerini modern, temiz ve performansl\u0131 bir \u015fekilde y\u00f6netmek isteyenler i\u00e7in React Router v6, pek \u00e7ok yenilik ve basitle\u015ftirme sunuyor. Bu kapsaml\u0131 rehber, React Router v5'ten v6'ya ge\u00e7i\u015fin t\u00fcm \u00f6nemli detaylar\u0131n\u0131, yeni API'leri ve pratik kod \u00f6rneklerini ad\u0131m ad\u0131m a\u00e7\u0131klayarak uygulaman\u0131z\u0131n y\u00f6nlendirme yap\u0131s\u0131n\u0131 gelece\u011fe ta\u015f\u0131man\u0131z\u0131 sa\u011flayacak.","og_url":"https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-14T05:31:35+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"25 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"React Router v6 K\u0131lavuzu: v5&#8217;ten v6&#8217;ya Ge\u00e7i\u015fin Tam Detaylar\u0131","datePublished":"2025-11-14T05:31:35+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/"},"wordCount":3804,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["React"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/","url":"https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/","name":"React Router v6 K\u0131lavuzu: v5'ten v6'ya Ge\u00e7i\u015fin Tam Detaylar\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-14T05:31:35+00:00","description":"React uygulamalar\u0131n\u0131zda sayfa ge\u00e7i\u015fleri, dinamik rotalar ve karma\u015f\u0131k y\u00f6nlendirme senaryolar\u0131 sizi zorluyor mu? Tek sayfa uygulamalar\u0131n (SPA) vazge\u00e7ilmezi olan y\u00f6nlendirme s\u00fcre\u00e7lerini modern, temiz ve performansl\u0131 bir \u015fekilde y\u00f6netmek isteyenler i\u00e7in React Router v6, pek \u00e7ok yenilik ve basitle\u015ftirme sunuyor. Bu kapsaml\u0131 rehber, React Router v5'ten v6'ya ge\u00e7i\u015fin t\u00fcm \u00f6nemli detaylar\u0131n\u0131, yeni API'leri ve pratik kod \u00f6rneklerini ad\u0131m ad\u0131m a\u00e7\u0131klayarak uygulaman\u0131z\u0131n y\u00f6nlendirme yap\u0131s\u0131n\u0131 gelece\u011fe ta\u015f\u0131man\u0131z\u0131 sa\u011flayacak.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/react-router-v6-kilavuzu-v5ten-v6ya-gecisin-tam-detaylari\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"React Router v6 K\u0131lavuzu: v5&#8217;ten v6&#8217;ya Ge\u00e7i\u015fin Tam Detaylar\u0131"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34286","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=34286"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34286\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34286"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34286"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34286"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}