{"id":31698,"date":"2025-10-13T00:40:54","date_gmt":"2025-10-12T21:40:54","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31698"},"modified":"2025-10-13T00:40:54","modified_gmt":"2025-10-12T21:40:54","slug":"vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme\/","title":{"rendered":"Vue.js&#8217;te Y\u00f6nlendirmeye Giri\u015f: Vue Router ile Uygulama Geli\u015ftirme"},"content":{"rendered":"<p><body><\/p>\n<h2>Vue.js&#8217;te Y\u00f6nlendirmeye Giri\u015f: Vue Router ile Uygulama Geli\u015ftirme<\/h2>\n<p>Vue.js, modern ve interaktif kullan\u0131c\u0131 aray\u00fczleri geli\u015ftirmek i\u00e7in pop\u00fcler bir JavaScript \u00e7er\u00e7evesidir. Tek Sayfal\u0131 Uygulamalar (Single Page Applications &#8211; SPA) \u00e7a\u011f\u0131nda, kullan\u0131c\u0131lar\u0131n farkl\u0131 g\u00f6r\u00fcn\u00fcmler aras\u0131nda sorunsuz bir \u015fekilde gezinmesini sa\u011flamak, herhangi bir web uygulamas\u0131n\u0131n temel bir gereksinimidir. \u0130\u015fte bu noktada y\u00f6nlendirme (routing) devreye girer. Y\u00f6nlendirme, uygulaman\u0131n URL&#8217;sine g\u00f6re farkl\u0131 bile\u015fenleri veya g\u00f6r\u00fcn\u00fcmleri g\u00f6r\u00fcnt\u00fclemesini sa\u011flayan mekanizmad\u0131r. Vue.js ekosisteminde bu g\u00f6revi \u00fcstlenen resmi k\u00fct\u00fcphane ise Vue Router&#8217;d\u0131r. Bu makalede, Vue Router&#8217;\u0131n temellerini, kurulumunu, temel ve geli\u015fmi\u015f kullan\u0131m senaryolar\u0131n\u0131 detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h3>Giri\u015f<\/h3>\n<p>Tek Sayfal\u0131 Uygulamalar (SPA&#8217;lar), geleneksel \u00e7ok sayfal\u0131 uygulamalar\u0131n aksine, t\u00fcm uygulaman\u0131n tek bir HTML sayfas\u0131nda y\u00fcklendi\u011fi ve i\u00e7eriklerin dinamik olarak JavaScript ile de\u011fi\u015ftirildi\u011fi modern web geli\u015ftirme paradigmas\u0131n\u0131n \u00f6nemli bir par\u00e7as\u0131d\u0131r. Bu yakla\u015f\u0131m, sayfa yenilemeleri olmadan h\u0131zl\u0131 ve ak\u0131c\u0131 bir kullan\u0131c\u0131 deneyimi sunar. Ancak SPA&#8217;larda, taray\u0131c\u0131n\u0131n adres \u00e7ubu\u011fundaki URL&#8217;nin uygulaman\u0131n mevcut durumunu yans\u0131tmas\u0131 ve kullan\u0131c\u0131lar\u0131n belirli bir g\u00f6r\u00fcn\u00fcme do\u011frudan eri\u015febilmesi veya taray\u0131c\u0131 ge\u00e7mi\u015fini kullanarak geri\/ileri gidebilmesi i\u00e7in bir y\u00f6nlendirme mekanizmas\u0131na ihtiya\u00e7 duyulur. Vue Router, Vue.js ile geli\u015ftirilen SPA&#8217;lar i\u00e7in bu ihtiyac\u0131 kar\u015f\u0131layan g\u00fc\u00e7l\u00fc ve esnek bir \u00e7\u00f6z\u00fcmd\u00fcr. Kullan\u0131c\u0131 dostu API&#8217;si ve Vue&#8217;nun reaktif do\u011fas\u0131yla m\u00fckemmel entegrasyonu sayesinde, karma\u015f\u0131k y\u00f6nlendirme senaryolar\u0131n\u0131 bile basit ve anla\u015f\u0131l\u0131r bir \u015fekilde y\u00f6netmeyi m\u00fcmk\u00fcn k\u0131lar.<\/p>\n<h3>Vue Router Nedir?<\/h3>\n<p>Vue Router, Vue.js uygulamalar\u0131 i\u00e7in resmi y\u00f6nlendirme k\u00fct\u00fcphanesidir. Uygulaman\u0131z\u0131n farkl\u0131 URL yollar\u0131na (paths) g\u00f6re hangi Vue bile\u015fenlerinin g\u00f6sterilece\u011fini belirlemenizi sa\u011flar. Bu, kullan\u0131c\u0131lar\u0131n bir web sitesinde gezinirken farkl\u0131 sayfalar (asl\u0131nda farkl\u0131 bile\u015fen g\u00f6r\u00fcn\u00fcmleri) aras\u0131nda ge\u00e7i\u015f yapmas\u0131na olanak tan\u0131r. Vue Router, client-side routing prensibiyle \u00e7al\u0131\u015f\u0131r; yani y\u00f6nlendirme i\u015flemleri sunucu taraf\u0131nda de\u011fil, taray\u0131c\u0131da JavaScript arac\u0131l\u0131\u011f\u0131yla ger\u00e7ekle\u015fir. Bu, her rota de\u011fi\u015fti\u011finde sunucuya tam bir sayfa iste\u011fi g\u00f6ndermek yerine, sadece gerekli bile\u015fenlerin dinamik olarak y\u00fcklenip de\u011fi\u015ftirilmesi anlam\u0131na gelir, bu da daha h\u0131zl\u0131 ve daha ak\u0131c\u0131 bir kullan\u0131c\u0131 deneyimi sa\u011flar.<\/p>\n<h4>Client-Side Routing ve Server-Side Routing Kar\u015f\u0131la\u015ft\u0131rmas\u0131<\/h4>\n<p>*   <strong>Server-Side Routing:<\/strong> Geleneksel web uygulamalar\u0131nda, her URL iste\u011fi sunucuya g\u00f6nderilir ve sunucu, istenen kayna\u011f\u0131 (genellikle tam bir HTML sayfas\u0131) geri d\u00f6nd\u00fcr\u00fcr. Bu, her navigasyonda sayfan\u0131n tamamen yeniden y\u00fcklenmesine neden olur.<br \/>\n*   <strong>Client-Side Routing:<\/strong> SPA&#8217;larda, ba\u015flang\u0131\u00e7ta t\u00fcm uygulaman\u0131n HTML, CSS ve JavaScript kaynaklar\u0131 y\u00fcklenir. Sonraki navigasyonlar i\u00e7in sunucuya tam sayfa iste\u011fi yap\u0131lmaz. Bunun yerine, JavaScript taray\u0131c\u0131n\u0131n URL&#8217;sini de\u011fi\u015ftirir (genellikle History API veya hash modu kullanarak) ve URL&#8217;ye kar\u015f\u0131l\u0131k gelen bile\u015feni dinamik olarak DOM&#8217;a enjekte eder. Vue Router da bu prensiple \u00e7al\u0131\u015f\u0131r.<\/p>\n<h4>Vue Router&#8217;\u0131n Temel \u00d6zellikleri<\/h4>\n<p>Vue Router, y\u00f6nlendirme ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131lamak i\u00e7in bir dizi g\u00fc\u00e7l\u00fc \u00f6zellik sunar:<br \/>\n*   <strong>\u0130\u00e7 \u0130\u00e7e Rotalar (Nested Routes):<\/strong> Bir ana bile\u015fenin i\u00e7inde alt rotalar tan\u0131mlayarak daha karma\u015f\u0131k UI yap\u0131lar\u0131 olu\u015fturma.<br \/>\n*   <strong>Dinamik Rotalar (Dynamic Route Matching):<\/strong> URL&#8217;deki de\u011fi\u015fken par\u00e7alar\u0131 (\u00f6rne\u011fin <code>\/users\/:id<\/code>) yakalayarak ayn\u0131 bile\u015feni farkl\u0131 verilerle kullanma.<br \/>\n*   <strong>Programatik Navigasyon:<\/strong> Kullan\u0131c\u0131 etkile\u015fimlerine veya uygulama mant\u0131\u011f\u0131na g\u00f6re JavaScript kodu arac\u0131l\u0131\u011f\u0131yla y\u00f6nlendirme yapma.<br \/>\n*   <strong>Y\u00f6nlendirme Korumalar\u0131 (Navigation Guards):<\/strong> Bir rotaya eri\u015fmeden \u00f6nce veya rotadan ayr\u0131l\u0131rken belirli ko\u015fullar\u0131 kontrol etme (\u00f6rne\u011fin kimlik do\u011frulama).<br \/>\n*   <strong>\u0130simlendirilmi\u015f Rotalar (Named Routes):<\/strong> Rotalara isim vererek, URL yollar\u0131 de\u011fi\u015fse bile navigasyonu kolayla\u015ft\u0131rma.<br \/>\n*   <strong>\u0130simlendirilmi\u015f G\u00f6r\u00fcn\u00fcmler (Named Views):<\/strong> Ayn\u0131 anda birden fazla <code>router-view<\/code> \u00f6rne\u011fini kullanarak karma\u015f\u0131k layout&#8217;lar olu\u015fturma.<br \/>\n*   <strong>Y\u00f6nlendirme Ge\u00e7i\u015fleri (Route Transitions):<\/strong> Rota de\u011fi\u015fikliklerinde animasyonlar ekleme.<br \/>\n*   <strong>Tembel Y\u00fckleme (Lazy Loading):<\/strong> Rota bile\u015fenlerini yaln\u0131zca ihtiya\u00e7 duyuldu\u011funda y\u00fckleyerek uygulaman\u0131n ba\u015flang\u0131\u00e7 performans\u0131n\u0131 iyile\u015ftirme.<\/p>\n<h3>Kurulum ve Temel Kullan\u0131m<\/h3>\n<p>Vue Router&#8217;\u0131 bir Vue.js projesine entegre etmek olduk\u00e7a basittir. \u00d6ncelikle bir Vue projesi olu\u015fturman\u0131z gerekir. Bunu Vue CLI veya Vite gibi ara\u00e7larla yapabilirsiniz.<\/p>\n<h4>Proje Olu\u015fturma (Vite ile \u00d6rnek)<\/h4>\n<pre><code class=\"language-bash\">npm create vue@latest\n<h2>Proje ad\u0131n\u0131 girin, Vue Router'\u0131 eklemek isteyip istemedi\u011finizi sorunca 'Yes' se\u00e7in.<\/h2>\ncd my-vue-app\nnpm install\nnpm run dev<\/code><\/pre>\n<p>E\u011fer Vue Router&#8217;\u0131 proje olu\u015fturma s\u0131ras\u0131nda eklemediyseniz veya mevcut bir projeye eklemek istiyorsan\u0131z:<\/p>\n<h4>Vue Router&#8217;\u0131 Y\u00fckleme<\/h4>\n<pre><code class=\"language-bash\">npm install vue-router@4 # Vue 3 i\u00e7in\n<h2>veya<\/h2>\nyarn add vue-router@4<\/code><\/pre>\n<h4>Router \u00d6rne\u011fi Olu\u015fturma<\/h4>\n<p>Vue Router&#8217;\u0131 kullanmaya ba\u015flamak i\u00e7in bir router \u00f6rne\u011fi olu\u015fturman\u0131z gerekir. Bu genellikle <code>src\/router\/index.js<\/code> gibi ayr\u0131 bir dosyada yap\u0131l\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/router\/index.js\nimport { createRouter, createWebHistory } from 'vue-router';\nimport HomeView from '..\/views\/HomeView.vue';\nimport AboutView from '..\/views\/AboutView.vue';\n\nconst routes = [\n  {\n    path: '\/',\n    name: 'home',\n    component: HomeView\n  },\n  {\n    path: '\/about',\n    name: 'about',\n    component: AboutView\n  }\n];\n\nconst router = createRouter({\n  history: createWebHistory(import.meta.env.BASE_URL),\n  routes\n});\n\nexport default router;<\/code><\/pre>\n<p>Burada <code>createRouter<\/code> fonksiyonu ile bir router \u00f6rne\u011fi olu\u015fturulur. <code>history<\/code> \u00f6zelli\u011fi, y\u00f6nlendirme modunu belirler. <code>createWebHistory<\/code> HTML5 History API&#8217;sini kullanarak temiz URL&#8217;ler (\u00f6rne\u011fin <code>\/users\/1<\/code>) sa\u011flar. <code>createWebHashHistory<\/code> ise hash tabanl\u0131 URL&#8217;ler (\u00f6rne\u011fin <code>\/#\/users\/1<\/code>) kullan\u0131r, bu da daha eski taray\u0131c\u0131larla uyumluluk i\u00e7in veya sunucu yap\u0131land\u0131rmas\u0131 gerektirmeyen durumlar i\u00e7in faydal\u0131d\u0131r. <code>routes<\/code> dizisi ise uygulaman\u0131zdaki t\u00fcm rota tan\u0131mlar\u0131n\u0131 i\u00e7erir. Her rota objesi <code>path<\/code>, <code>name<\/code> ve <code>component<\/code> gibi \u00f6zelliklere sahiptir.<\/p>\n<h4>Uygulamay\u0131 Router ile Ba\u011flama<\/h4>\n<p>Olu\u015fturdu\u011funuz router \u00f6rne\u011fini Vue uygulaman\u0131zla ba\u011flaman\u0131z gerekir. Bu genellikle <code>src\/main.js<\/code> dosyas\u0131nda yap\u0131l\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/main.js\nimport { createApp } from 'vue';\nimport App from '.\/App.vue';\nimport router from '.\/router'; \/\/ Olu\u015fturdu\u011fumuz router'\u0131 import ediyoruz\n\nconst app = createApp(App);\n\napp.use(router); \/\/ Vue uygulamas\u0131n\u0131 router ile kullanacak \u015fekilde yap\u0131land\u0131r\u0131yoruz\n\napp.mount('#app');<\/code><\/pre>\n<p><code>app.use(router)<\/code> \u00e7a\u011fr\u0131s\u0131, router \u00f6rne\u011fini Vue uygulaman\u0131za enjekte eder ve t\u00fcm bile\u015fenlerde <code>this.$router<\/code> ve <code>this.$route<\/code> (Composition API&#8217;da <code>useRouter<\/code> ve <code>useRoute<\/code>) gibi \u00f6zelliklere eri\u015fim sa\u011flar.<\/p>\n<h4><code>router-link<\/code> ve <code>router-view<\/code> Bile\u015fenleri<\/h4>\n<p>Vue Router, y\u00f6nlendirme i\u00e7in iki global bile\u015fen sa\u011flar:<br \/>\n*   <strong><code><router-link><\/code>:<\/strong> Bu bile\u015fen, HTML&#8217;deki <code><a><\/code> etiketi gibi \u00e7al\u0131\u015f\u0131r ancak Vue Router taraf\u0131ndan y\u00f6netilen y\u00f6nlendirme i\u015flemleri i\u00e7in kullan\u0131l\u0131r. T\u0131kland\u0131\u011f\u0131nda sayfa yenilemesi olmadan rotay\u0131 de\u011fi\u015ftirir.<br \/>\n*   <strong><code><router-view><\/code>:<\/strong> Bu bile\u015fen, mevcut rotayla e\u015fle\u015fen bile\u015fenin g\u00f6r\u00fcnt\u00fclenece\u011fi yer tutucudur. Router, e\u015fle\u015fen bile\u015feni bu etiketin i\u00e7ine dinamik olarak render eder.<\/p>\n<pre><code class=\"language-html\"><!-- src\/App.vue -->\n<template>\n  <nav>\n    <router-link to=\"\/\">Anasayfa<\/router-link> |\n    <router-link to=\"\/about\">Hakk\u0131nda<\/router-link>\n  <\/nav>\n  <router-view \/>\n<\/template><\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte, <code><router-link><\/code> etiketleri kullan\u0131c\u0131lar\u0131n &#8220;Anasayfa&#8221; ve &#8220;Hakk\u0131nda&#8221; rotalar\u0131 aras\u0131nda gezinmesini sa\u011flar. <code><router-view><\/code> ise, <code>\/<\/code> yolu e\u015fle\u015fti\u011finde <code>HomeView<\/code> bile\u015fenini, <code>\/about<\/code> yolu e\u015fle\u015fti\u011finde ise <code>AboutView<\/code> bile\u015fenini g\u00f6sterecektir.<\/p>\n<h3>Rota Tan\u0131mlar\u0131 ve Bile\u015fenler<\/h3>\n<p>Rota tan\u0131mlar\u0131, uygulaman\u0131z\u0131n hangi URL&#8217;ye hangi bile\u015feni e\u015fleyece\u011fini belirleyen temel yap\u0131 ta\u015flar\u0131d\u0131r.<\/p>\n<h4>Temel Rota Yap\u0131s\u0131<\/h4>\n<p>Her rota tan\u0131m\u0131 bir JavaScript objesidir ve genellikle \u015fu \u00f6zellikleri i\u00e7erir:<br \/>\n*   <code>path<\/code>: URL yolu (\u00f6rne\u011fin <code>\/<\/code>, <code>\/about<\/code>, <code>\/users<\/code>).<br \/>\n*   <code>component<\/code>: Bu yolla e\u015fle\u015fti\u011finde g\u00f6r\u00fcnt\u00fclenecek Vue bile\u015feni.<br \/>\n*   <code>name<\/code>: Rotaya verilen benzersiz bir isim (programatik navigasyon ve isimlendirilmi\u015f rotalar i\u00e7in kullan\u0131\u015fl\u0131d\u0131r).<br \/>\n*   <code>redirect<\/code>: Bir rotadan ba\u015fka bir rotaya y\u00f6nlendirme.<br \/>\n*   <code>children<\/code>: \u0130\u00e7 i\u00e7e rotalar\u0131 tan\u0131mlamak i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <code>meta<\/code>: Rotaya \u00f6zel key-value \u00e7iftleri eklemek i\u00e7in kullan\u0131l\u0131r (\u00f6rne\u011fin kimlik do\u011frulama gereksinimi).<\/p>\n<pre><code class=\"language-javascript\">const routes = [\n  { path: '\/', component: HomeView, name: 'home' },\n  { path: '\/about', component: AboutView, name: 'about' },\n  { path: '\/contact', component: () => import('..\/views\/ContactView.vue'), name: 'contact' } \/\/ Lazy loading \u00f6rne\u011fi\n];<\/code><\/pre>\n<h4>Bile\u015fenlerin Olu\u015fturulmas\u0131<\/h4>\n<p>Yukar\u0131daki rota tan\u0131mlar\u0131nda kullan\u0131lan <code>HomeView<\/code>, <code>AboutView<\/code> ve <code>ContactView<\/code> gibi bile\u015fenler, genellikle <code>src\/views<\/code> klas\u00f6r\u00fcnde yer al\u0131r ve standart Vue bile\u015fenleridir.<\/p>\n<pre><code class=\"language-vue\"><!-- src\/views\/HomeView.vue -->\n<template>\n  <div class=\"home\">\n    \n    <p>Uygulamam\u0131za ho\u015f geldiniz!<\/p>\n  <\/div>\n<\/template>\n\n<script setup>\n\/\/ Bile\u015fen mant\u0131\u011f\u0131\n<\/script><\/code><\/pre>\n<h4><code>router-link<\/code> ile Navigasyon<\/h4>\n<p><code>router-link<\/code> bile\u015feni, <code>to<\/code> prop&#8217;u arac\u0131l\u0131\u011f\u0131yla hedef rotay\u0131 belirtir. <code>to<\/code> prop&#8217;u bir string veya bir obje olabilir.<\/p>\n<pre><code class=\"language-html\"><router-link to=\"\/about\">Hakk\u0131nda<\/router-link>\n<!-- \u0130simlendirilmi\u015f rota ile navigasyon -->\n<router-link :to=\"{ name: 'contact' }\">\u0130leti\u015fim<\/router-link>\n<!-- Parametreler ve query string ile navigasyon -->\n<router-link :to=\"{ name: 'user', params: { id: 123 }, query: { lang: 'en' } }\">Kullan\u0131c\u0131 123<\/router-link><\/code><\/pre>\n<p><code>router-link<\/code> otomatik olarak aktif olan rotaya <code>router-link-active<\/code> ve <code>router-link-exact-active<\/code> s\u0131n\u0131flar\u0131n\u0131 ekler, b\u00f6ylece navigasyon men\u00fclerinizde aktif \u00f6\u011feyi stilize edebilirsiniz.<\/p>\n<h4><code>router-view<\/code> ile \u0130\u00e7erik G\u00f6sterimi<\/h4>\n<p><code>router-view<\/code> bile\u015feni, Vue Router&#8217;\u0131n rotalarla e\u015fle\u015fen bile\u015fenleri render etti\u011fi yerdir. Uygulaman\u0131zda yaln\u0131zca bir ana <code>router-view<\/code> olabilece\u011fi gibi, i\u00e7 i\u00e7e rotalar i\u00e7in birden fazla <code>router-view<\/code> de bulunabilir.<\/p>\n<pre><code class=\"language-html\"><template>\n  <div>\n    <Header \/>\n    <main>\n      <router-view \/> <!-- Ana i\u00e7erik burada g\u00f6r\u00fcnt\u00fclenecek -->\n    <\/main>\n    <Footer \/>\n  <\/div>\n<\/template><\/code><\/pre>\n<h3>Dinamik Rotalar (Dynamic Routes)<\/h3>\n<p>\u00c7o\u011fu uygulamada, belirli bir kimli\u011fe veya parametreye g\u00f6re de\u011fi\u015fen URL&#8217;lere ihtiya\u00e7 duyulur. \u00d6rne\u011fin, bir kullan\u0131c\u0131 profil sayfas\u0131 <code>\/users\/1<\/code>, <code>\/users\/2<\/code> gibi URL&#8217;lere sahip olabilir. Vue Router, dinamik rota segmentlerini destekler.<\/p>\n<h4>URL Parametreleri<\/h4>\n<p>Rota tan\u0131m\u0131nda iki nokta \u00fcst \u00fcste (<code>:<\/code>) ile ba\u015flayan bir segment, dinamik bir parametre olarak kabul edilir.<\/p>\n<pre><code class=\"language-javascript\">const routes = [\n  \/\/ ... di\u011fer rotalar\n  {\n    path: '\/users\/:id',\n    name: 'user',\n    component: () => import('..\/views\/UserDetail.vue')\n  }\n];<\/code><\/pre>\n<p>Bu rota tan\u0131m\u0131, <code>\/users\/123<\/code> veya <code>\/users\/abc<\/code> gibi URL&#8217;lerle e\u015fle\u015fir. <code>:id<\/code> k\u0131sm\u0131, rotan\u0131n dinamik parametresidir.<\/p>\n<h4>Parametrelere Eri\u015fim<\/h4>\n<p>Bile\u015fen i\u00e7inde, mevcut rotan\u0131n parametrelerine <code>useRoute()<\/code> Composition API fonksiyonu veya <code>this.$route.params<\/code> (Options API) arac\u0131l\u0131\u011f\u0131yla eri\u015febilirsiniz.<\/p>\n<pre><code class=\"language-vue\"><!-- src\/views\/UserDetail.vue -->\n<template>\n  <div>\n    \n    <p>Kullan\u0131c\u0131 ID: {{ userId }}<\/p>\n  <\/div>\n<\/template>\n\n<script setup>\nimport { useRoute } from 'vue-router';\nimport { ref, watch } from 'vue';\n\nconst route = useRoute();\nconst userId = ref(route.params.id);\n\n\/\/ Parametre de\u011fi\u015fikliklerini izleme (ayn\u0131 bile\u015fen i\u00e7inde farkl\u0131 ID'lerle gezinirken)\nwatch(() => route.params.id, (newId) => {\n  userId.value = newId;\n  \/\/ Yeni ID'ye g\u00f6re veri \u00e7ekme vb. i\u015flemleri burada yapabilirsiniz.\n});\n<\/script><\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte, <code>userId<\/code> reaktif bir referans olarak tan\u0131mlan\u0131r ve <code>route.params.id<\/code> de\u011ferini al\u0131r. Ayr\u0131ca, kullan\u0131c\u0131 <code>\/users\/1<\/code>&#8216;den <code>\/users\/2<\/code>&#8216;ye ayn\u0131 <code>UserDetail<\/code> bile\u015feni i\u00e7indeyken ge\u00e7ti\u011finde <code>watch<\/code> kullanarak <code>userId<\/code>&#8216;nin g\u00fcncellenmesini sa\u011fl\u0131yoruz.<\/p>\n<h4>Props ile Parametreleri Bile\u015fene Ge\u00e7irme<\/h4>\n<p>Parametreleri do\u011frudan bile\u015fenin prop&#8217;lar\u0131 olarak ge\u00e7irmek, bile\u015fenlerin daha temiz ve yeniden kullan\u0131labilir olmas\u0131n\u0131 sa\u011flar.<br \/>\nRota tan\u0131m\u0131nda <code>props: true<\/code> ayarlayarak t\u00fcm rota parametrelerini bile\u015fene prop olarak ge\u00e7irebilirsiniz:<\/p>\n<pre><code class=\"language-javascript\">const routes = [\n  {\n    path: '\/users\/:id',\n    name: 'user',\n    component: () => import('..\/views\/UserDetail.vue'),\n    props: true \/\/ :id parametresini UserDetail bile\u015fenine prop olarak ge\u00e7irecek\n  }\n];<\/code><\/pre>\n<p>Ard\u0131ndan, <code>UserDetail.vue<\/code> bile\u015feninizde <code>id<\/code> prop&#8217;unu tan\u0131mlayabilirsiniz:<\/p>\n<pre><code class=\"language-vue\"><!-- src\/views\/UserDetail.vue -->\n<template>\n  <div>\n    \n    <p>Kullan\u0131c\u0131 ID: {{ id }}<\/p>\n  <\/div>\n<\/template>\n\n<script setup>\nimport { defineProps } from 'vue';\n\nconst props = defineProps({\n  id: {\n    type: String, \/\/ veya Number\n    required: true\n  }\n});\n<\/script><\/code><\/pre>\n<p>Bu yakla\u015f\u0131m, bile\u015fenin <code>useRoute()<\/code> ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 ortadan kald\u0131r\u0131r ve onu daha test edilebilir hale getirir.<\/p>\n<h3>\u0130\u00e7 \u0130\u00e7e Rotalar (Nested Routes)<\/h3>\n<p>Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda, kullan\u0131c\u0131 aray\u00fczleri genellikle hiyerar\u015fik bir yap\u0131ya sahiptir. \u00d6rne\u011fin, bir kullan\u0131c\u0131 profil sayfas\u0131nda &#8220;Profil&#8221;, &#8220;G\u00f6nderiler&#8221; ve &#8220;Ayarlar&#8221; gibi alt sekmeler olabilir. Vue Router, bu t\u00fcr senaryolar i\u00e7in i\u00e7 i\u00e7e rotalar\u0131 destekler.<\/p>\n<h4><code>children<\/code> \u00d6zelli\u011fi<\/h4>\n<p>\u0130\u00e7 i\u00e7e rotalar, bir rota tan\u0131m\u0131n\u0131n <code>children<\/code> \u00f6zelli\u011fini kullanarak tan\u0131mlan\u0131r.<\/p>\n<pre><code class=\"language-javascript\">const routes = [\n  {\n    path: '\/users\/:id',\n    component: () => import('..\/views\/UserLayout.vue'), \/\/ Ana bile\u015fen\n    children: [\n      {\n        path: '', \/\/ Varsay\u0131lan alt rota (\u00f6rne\u011fin \/users\/1)\n        name: 'user-profile',\n        component: () => import('..\/views\/UserProfile.vue')\n      },\n      {\n        path: 'posts', \/\/ \/users\/1\/posts\n        name: 'user-posts',\n        component: () => import('..\/views\/UserPosts.vue')\n      },\n      {\n        path: 'settings', \/\/ \/users\/1\/settings\n        name: 'user-settings',\n        component: () => import('..\/views\/UserSettings.vue')\n      }\n    ]\n  }\n];<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>\/users\/:id<\/code> yolu <code>UserLayout.vue<\/code> bile\u015fenini y\u00fckler. <code>UserLayout.vue<\/code> i\u00e7inde, alt rotalar i\u00e7in bir <code><router-view><\/code> daha bulunmal\u0131d\u0131r.<\/p>\n<h4>Ana Bile\u015fenin \u0130\u00e7inde \u0130kinci Bir <code>router-view<\/code><\/h4>\n<p><code>UserLayout.vue<\/code> bile\u015feni, ana <code><router-view><\/code> taraf\u0131ndan y\u00fcklendi\u011finde, kendi i\u00e7inde bir <code><router-view><\/code> daha bar\u0131nd\u0131rarak alt rotalar\u0131n i\u00e7eri\u011fini g\u00f6sterecektir.<\/p>\n<pre><code class=\"language-vue\"><!-- src\/views\/UserLayout.vue -->\n<template>\n  <div class=\"user-layout\">\n    <h2>Kullan\u0131c\u0131: {{ $route.params.id }}<\/h2>\n    <nav>\n      <router-link :to=\"{ name: 'user-profile', params: { id: $route.params.id } }\">Profil<\/router-link> |\n      <router-link :to=\"{ name: 'user-posts', params: { id: $route.params.id } }\">G\u00f6nderiler<\/router-link> |\n      <router-link :to=\"{ name: 'user-settings', params: { id: $route.params.id } }\">Ayarlar<\/router-link>\n    <\/nav>\n    <div class=\"user-content\">\n      <router-view \/> <!-- Alt rotan\u0131n i\u00e7eri\u011fi burada g\u00f6r\u00fcnt\u00fclenecek -->\n    <\/div>\n  <\/div>\n<\/template>\n\n<script setup>\n\/\/ Bile\u015fen mant\u0131\u011f\u0131\n<\/script><\/code><\/pre>\n<p>Bu yap\u0131, karma\u015f\u0131k kullan\u0131c\u0131 aray\u00fczlerini daha mod\u00fcler ve y\u00f6netilebilir hale getirir.<\/p>\n<h3>Programatik Navigasyon<\/h3>\n<p>Bazen, bir kullan\u0131c\u0131 bir butona t\u0131klad\u0131\u011f\u0131nda, bir form g\u00f6nderildi\u011finde veya bir API \u00e7a\u011fr\u0131s\u0131 tamamland\u0131\u011f\u0131nda oldu\u011fu gibi, programatik olarak bir rotaya gitmeniz gerekebilir. Vue Router, bu t\u00fcr durumlar i\u00e7in \u00e7e\u015fitli y\u00f6ntemler sunar.<\/p>\n<h4><code>router.push()<\/code>, <code>router.replace()<\/code>, <code>router.go()<\/code>, <code>router.back()<\/code><\/h4>\n<p>*   <strong><code>router.push(location)<\/code>:<\/strong> Yeni bir giri\u015fi taray\u0131c\u0131 ge\u00e7mi\u015fine ekleyerek belirtilen <code>location<\/code>&#8216;a gider. <code>router-link<\/code>&#8216;e t\u0131klamakla ayn\u0131d\u0131r.<br \/>\n*   <strong><code>router.replace(location)<\/code>:<\/strong> Mevcut giri\u015fi taray\u0131c\u0131 ge\u00e7mi\u015finde <code>location<\/code> ile de\u011fi\u015ftirir, yani geri d\u00fc\u011fmesiyle \u00f6nceki sayfaya d\u00f6nemezsiniz.<br \/>\n*   <strong><code>router.go(n)<\/code>:<\/strong> Taray\u0131c\u0131 ge\u00e7mi\u015finde <code>n<\/code> ad\u0131m ileri veya geri gider. Pozitif bir say\u0131 ileri, negatif bir say\u0131 geri gider.<br \/>\n*   <strong><code>router.back()<\/code>:<\/strong> <code>router.go(-1)<\/code> ile ayn\u0131d\u0131r, bir ad\u0131m geri gider.<\/p>\n<p>Bu y\u00f6ntemlere Composition API&#8217;da <code>useRouter()<\/code> hook&#8217;u arac\u0131l\u0131\u011f\u0131yla eri\u015filirken, Options API&#8217;da <code>this.$router<\/code> arac\u0131l\u0131\u011f\u0131yla eri\u015filir.<\/p>\n<pre><code class=\"language-vue\"><template>\n  <button @click=\"goToHome\">Anasayfaya Git<\/button>\n  <button @click=\"goToUser(123)\">Kullan\u0131c\u0131 123'e Git<\/button>\n  <button @click=\"goBack\">Geri Git<\/button>\n<\/template>\n\n<script setup>\nimport { useRouter } from 'vue-router';\n\nconst router = useRouter();\n\nconst goToHome = () => {\n  router.push('\/');\n};\n\nconst goToUser = (id) => {\n  router.push({ name: 'user', params: { id: id } });\n};\n\nconst goBack = () => {\n  router.back();\n};\n<\/script><\/code><\/pre>\n<h4>\u0130simlendirilmi\u015f Rotalarla Navigasyon<\/h4>\n<p>Programatik navigasyon yaparken, rota yollar\u0131 yerine rota isimlerini kullanmak daha g\u00fcvenli ve esnektir. Yol de\u011fi\u015fse bile kodunuzu g\u00fcncellemeniz gerekmez.<\/p>\n<pre><code class=\"language-javascript\">router.push({ name: 'user', params: { id: 123 } });<\/code><\/pre>\n<h4>Query Parametreleri ve Hash ile Navigasyon<\/h4>\n<p><code>router.push<\/code> ve <code>router.replace<\/code> y\u00f6ntemleri, <code>query<\/code> ve <code>hash<\/code> \u00f6zelliklerini de destekler.<\/p>\n<pre><code class=\"language-javascript\">\/\/ Query parametreleri ile: \/search?q=vue&page=2\nrouter.push({ path: '\/search', query: { q: 'vue', page: 2 } });\n\n\/\/ Hash ile: \/about#section-2\nrouter.push({ path: '\/about', hash: '#section-2' });<\/code><\/pre>\n<p>Bu parametrelere bile\u015fen i\u00e7inde <code>useRoute().query<\/code> ve <code>useRoute().hash<\/code> ile eri\u015febilirsiniz.<\/p>\n<h3>Y\u00f6nlendirme Korumalar\u0131 (Navigation Guards)<\/h3>\n<p>Y\u00f6nlendirme korumalar\u0131, bir navigasyonun tamamlanmas\u0131n\u0131 engelleyebilir veya y\u00f6nlendirme s\u0131ras\u0131nda ek eylemler ger\u00e7ekle\u015ftirebilir. Genellikle kimlik do\u011frulama, yetkilendirme, veri \u00e7ekme veya bir rotadan ayr\u0131lmadan \u00f6nce kullan\u0131c\u0131dan onay alma gibi senaryolarda kullan\u0131l\u0131rlar.<\/p>\n<p>Vue Router&#8217;da \u00fc\u00e7 t\u00fcr y\u00f6nlendirme korumas\u0131 bulunur:<\/p>\n<h4>Global Guards<\/h4>\n<p>*   <strong><code>router.beforeEach(to, from, next)<\/code>:<\/strong> Her navigasyondan \u00f6nce \u00e7a\u011fr\u0131l\u0131r. <code>to<\/code> ve <code>from<\/code> rota objeleri, <code>next<\/code> ise navigasyonu kontrol etmek i\u00e7in kullan\u0131lan bir fonksiyondur.<br \/>\n*   <strong><code>router.afterEach(to, from)<\/code>:<\/strong> Her navigasyondan sonra \u00e7a\u011fr\u0131l\u0131r. Bu korumalar <code>next<\/code> fonksiyonunu almaz ve navigasyonu etkileyemezler, genellikle analitik izleme veya sayfa ba\u015fl\u0131\u011f\u0131 g\u00fcncelleme gibi yan etkiler i\u00e7in kullan\u0131l\u0131rlar.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/router\/index.js\nrouter.beforeEach((to, from, next) => {\n  const isAuthenticated = \/<em> Kullan\u0131c\u0131n\u0131n oturum a\u00e7\u0131p a\u00e7mad\u0131\u011f\u0131n\u0131 kontrol et <\/em>\/ true; \/\/ \u00d6rnek\n\n  if (to.meta.requiresAuth && !isAuthenticated) {\n    \/\/ Kimlik do\u011frulama gerektiren bir rotaya eri\u015fmeye \u00e7al\u0131\u015f\u0131yor ve oturum a\u00e7mam\u0131\u015f\n    next('\/login'); \/\/ Giri\u015f sayfas\u0131na y\u00f6nlendir\n  } else {\n    next(); \/\/ Navigasyona devam et\n  }\n});<\/code><\/pre>\n<h4>Per-Route Guards (Rota Ba\u015f\u0131na Korumalar)<\/h4>\n<p>Rota tan\u0131m\u0131n\u0131n i\u00e7inde <code>beforeEnter<\/code> \u00f6zelli\u011fi kullan\u0131larak belirli bir rotaya \u00f6zg\u00fc korumalar tan\u0131mlanabilir.<\/p>\n<pre><code class=\"language-javascript\">const routes = [\n  {\n    path: '\/admin',\n    component: () => import('..\/views\/AdminPanel.vue'),\n    meta: { requiresAuth: true, requiresAdmin: true },\n    beforeEnter: (to, from, next) => {\n      \/\/ Sadece bu rota i\u00e7in \u00f6zel bir kontrol\n      const isAdmin = \/<em> Y\u00f6neticilik kontrol\u00fc <\/em>\/ true; \/\/ \u00d6rnek\n      if (isAdmin) {\n        next();\n      } else {\n        next('\/'); \/\/ Anasayfaya y\u00f6nlendir\n      }\n    }\n  }\n];<\/code><\/pre>\n<h4>In-Component Guards (Bile\u015fen \u0130\u00e7i Korumalar)<\/h4>\n<p>Bu korumalar, do\u011frudan bile\u015fenlerin i\u00e7inde tan\u0131mlan\u0131r ve belirli bir bile\u015fene girerken, o bile\u015fende kal\u0131rken veya o bile\u015fenden ayr\u0131l\u0131rken tetiklenir.<\/p>\n<p>*   <strong><code>beforeRouteEnter(to, from, next)<\/code>:<\/strong> Bile\u015fene girilmeden \u00f6nce \u00e7a\u011fr\u0131l\u0131r. Bu s\u0131rada bile\u015fen \u00f6rne\u011fi hen\u00fcz olu\u015fturulmad\u0131\u011f\u0131 i\u00e7in <code>this<\/code>&#8216;e eri\u015filemez. <code>next<\/code> callback&#8217;i i\u00e7inde bir callback fonksiyonu ile bile\u015fen \u00f6rne\u011fine eri\u015filebilir.<br \/>\n*   <strong><code>beforeRouteUpdate(to, from, next)<\/code>:<\/strong> Ayn\u0131 rotan\u0131n farkl\u0131 parametrelerle (\u00f6rne\u011fin <code>\/users\/1<\/code>&#8216;den <code>\/users\/2<\/code>&#8216;ye) g\u00fcncellenmesi durumunda \u00e7a\u011fr\u0131l\u0131r. <code>this<\/code>&#8216;e eri\u015fim vard\u0131r.<br \/>\n*   <strong><code>beforeRouteLeave(to, from, next)<\/code>:<\/strong> Bile\u015fenden ayr\u0131lmadan \u00f6nce \u00e7a\u011fr\u0131l\u0131r. Kullan\u0131c\u0131ya bir formu kaydetmedi\u011fi konusunda uyar\u0131 vermek gibi senaryolarda kullan\u0131\u015fl\u0131d\u0131r. <code>this<\/code>&#8216;e eri\u015fim vard\u0131r.<\/p>\n<pre><code class=\"language-vue\"><!-- src\/views\/EditPost.vue -->\n<script>\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n  data() {\n    return {\n      hasUnsavedChanges: true \/\/ \u00d6rnek\n    };\n  },\n  beforeRouteLeave(to, from, next) {\n    if (this.hasUnsavedChanges && !confirm('Kaydedilmeyen de\u011fi\u015fiklikler var. Ayr\u0131lmak istedi\u011finizden emin misiniz?')) {\n      next(false); \/\/ Navigasyonu iptal et\n    } else {\n      next(); \/\/ Navigasyona devam et\n    }\n  }\n});\n<\/script><\/code><\/pre>\n<h3>Geli\u015fmi\u015f Konular<\/h3>\n<p>Vue Router, temel y\u00f6nlendirme ihtiya\u00e7lar\u0131n\u0131n \u00f6tesine ge\u00e7en bir dizi geli\u015fmi\u015f \u00f6zellik sunar.<\/p>\n<h4>\u0130simlendirilmi\u015f Rotalar (Named Routes)<\/h4>\n<p>Rotalara isim vermek, programatik navigasyonu ve <code>router-link<\/code> kullan\u0131m\u0131n\u0131 daha esnek hale getirir. URL yollar\u0131 de\u011fi\u015fse bile, isimlendirilmi\u015f rotalar\u0131 kullanan kodunuzu g\u00fcncellemeniz gerekmez.<\/p>\n<pre><code class=\"language-javascript\">const routes = [\n  {\n    path: '\/user\/:id',\n    name: 'userProfile', \/\/ Rotaya isim verdik\n    component: () => import('..\/views\/UserProfile.vue')\n  }\n];<\/code><\/pre>\n<p>Navigasyonda kullan\u0131m\u0131:<\/p>\n<pre><code class=\"language-html\"><router-link :to=\"{ name: 'userProfile', params: { id: 123 } }\">Kullan\u0131c\u0131 123<\/router-link><\/code><\/pre>\n<pre><code class=\"language-javascript\">router.push({ name: 'userProfile', params: { id: 456 } });<\/code><\/pre>\n<h4>\u0130simlendirilmi\u015f G\u00f6r\u00fcn\u00fcmler (Named Views)<\/h4>\n<p>Bazen ayn\u0131 anda birden fazla <code>router-view<\/code>&#8216;\u0131 kullanarak karma\u015f\u0131k bir layout olu\u015fturmak isteyebilirsiniz. \u0130simlendirilmi\u015f g\u00f6r\u00fcn\u00fcmler, bunu m\u00fcmk\u00fcn k\u0131lar.<\/p>\n<pre><code class=\"language-html\"><!-- src\/App.vue -->\n<template>\n  <div id=\"app\">\n    <router-view name=\"header\"><\/router-view>\n    <router-view name=\"sidebar\"><\/router-view>\n    <router-view><\/router-view> <!-- Varsay\u0131lan router-view -->\n    <router-view name=\"footer\"><\/router-view>\n  <\/div>\n<\/template><\/code><\/pre>\n<p>Rota tan\u0131m\u0131nda, hangi <code>router-view<\/code>&#8216;a hangi bile\u015fenin y\u00fcklenece\u011fini belirtirsiniz:<\/p>\n<pre><code class=\"language-javascript\">const routes = [\n  {\n    path: '\/',\n    components: {\n      default: () => import('..\/views\/HomeContent.vue'),\n      header: () => import('..\/components\/AppHeader.vue'),\n      sidebar: () => import('..\/components\/AppSidebar.vue'),\n      footer: () => import('..\/components\/AppFooter.vue')\n    }\n  },\n  {\n    path: '\/about',\n    components: {\n      default: () => import('..\/views\/AboutContent.vue'),\n      header: () => import('..\/components\/AppHeader.vue'),\n      sidebar: () => import('..\/components\/AppSidebar.vue')\n      \/\/ Footer bu rotada g\u00f6sterilmeyecek\n    }\n  }\n];<\/code><\/pre>\n<h4>Meta Alanlar\u0131 (Meta Fields)<\/h4>\n<p>Rota tan\u0131mlar\u0131na \u00f6zel veriler eklemek i\u00e7in <code>meta<\/code> \u00f6zelli\u011fini kullanabilirsiniz. Bu veriler, y\u00f6nlendirme korumalar\u0131 i\u00e7inde veya bile\u015fenler i\u00e7inde mevcut rotan\u0131n <code>meta<\/code> \u00f6zelli\u011finden eri\u015filebilir.<\/p>\n<pre><code class=\"language-javascript\">const routes = [\n  {\n    path: '\/dashboard',\n    component: () => import('..\/views\/Dashboard.vue'),\n    meta: {\n      requiresAuth: true,\n      title: 'Y\u00f6netim Paneli'\n    }\n  }\n];<\/code><\/pre>\n<p>Bile\u015fen i\u00e7inde eri\u015fim:<\/p>\n<pre><code class=\"language-javascript\">import { useRoute } from 'vue-router';\nconst route = useRoute();\nconsole.log(route.meta.title); \/\/ \"Y\u00f6netim Paneli\"<\/code><\/pre>\n<h4>Y\u00f6nlendirme Ge\u00e7i\u015fleri (Route Transitions)<\/h4>\n<p>Rota de\u011fi\u015fiklikleri s\u0131ras\u0131nda animasyonlar eklemek, kullan\u0131c\u0131 deneyimini zenginle\u015ftirir. Vue&#8217;nun <code><transition><\/code> bile\u015feni ile Vue Router&#8217;\u0131 entegre edebilirsiniz.<\/p>\n<pre><code class=\"language-html\"><!-- src\/App.vue -->\n<template>\n  <router-view v-slot=\"{ Component }\">\n    <transition name=\"fade\" mode=\"out-in\">\n      <component :is=\"Component\" \/>\n    <\/transition>\n  <\/router-view>\n<\/template>\n\n<style>\n.fade-enter-active,\n.fade-leave-active {\n  transition: opacity 0.5s ease;\n}\n.fade-enter-from,\n.fade-leave-to {\n  opacity: 0;\n}\n<\/style><\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>router-view<\/code>&#8216;\u0131n i\u00e7eri\u011fi de\u011fi\u015fti\u011finde bir solma animasyonu (fade transition) uygulan\u0131r. <code>mode=\"out-in\"<\/code> \u00f6nce eski bile\u015fenin kaybolup sonra yenisinin g\u00f6r\u00fcnmesini sa\u011flar.<\/p>\n<h4>Lazy Loading (Tembel Y\u00fckleme)<\/h4>\n<p>B\u00fcy\u00fck uygulamalarda, t\u00fcm rota bile\u015fenlerini uygulaman\u0131n ba\u015flang\u0131c\u0131nda y\u00fcklemek, ilk y\u00fckleme s\u00fcresini uzatabilir. Tembel y\u00fckleme (code splitting), bile\u015fenleri yaln\u0131zca ilgili rotaya eri\u015fildi\u011finde y\u00fckleyerek bu sorunu \u00e7\u00f6zer. Vue Router, dinamik import (ES mod\u00fclleri) ile bunu kolayca yapman\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-javascript\">const routes = [\n  {\n    path: '\/',\n    name: 'home',\n    component: () => import('..\/views\/HomeView.vue') \/\/ Sadece HomeView eri\u015fildi\u011finde y\u00fcklenecek\n  },\n  {\n    path: '\/about',\n    name: 'about',\n    component: () => import('..\/views\/AboutView.vue') \/\/ Sadece AboutView eri\u015fildi\u011finde y\u00fcklenecek\n  }\n];<\/code><\/pre>\n<p>Bu \u015fekilde, uygulaman\u0131z\u0131n ba\u015flang\u0131\u00e7 paketi (bundle) boyutu k\u00fc\u00e7\u00fcl\u00fcr ve daha h\u0131zl\u0131 y\u00fcklenir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Vue Router, Vue.js uygulamalar\u0131 i\u00e7in vazge\u00e7ilmez bir y\u00f6nlendirme \u00e7\u00f6z\u00fcm\u00fcd\u00fcr. Basit kurulumu, sezgisel API&#8217;si ve kapsaml\u0131 \u00f6zellik seti sayesinde, hem k\u00fc\u00e7\u00fck hem de b\u00fcy\u00fck \u00f6l\u00e7ekli tek sayfal\u0131k uygulamalar\u0131n y\u00f6nlendirme ihtiya\u00e7lar\u0131n\u0131 eksiksiz bir \u015fekilde kar\u015f\u0131lar. Temel rota tan\u0131mlar\u0131ndan dinamik rotalara, i\u00e7 i\u00e7e g\u00f6r\u00fcn\u00fcmlerden programatik navigasyona ve g\u00fc\u00e7l\u00fc y\u00f6nlendirme korumalar\u0131na kadar sundu\u011fu yeteneklerle, geli\u015ftiricilere esnek ve kontrol edilebilir bir y\u00f6nlendirme deneyimi sunar. Vue Router&#8217;\u0131 \u00f6\u011frenmek ve ustaca kullanmak, Vue.js ile daha performansl\u0131, daha organize ve daha kullan\u0131c\u0131 dostu web uygulamalar\u0131 geli\u015ftirmenin anahtar\u0131d\u0131r. Bu makale, Vue Router&#8217;a sa\u011flam bir giri\u015f yaparak, k\u00fct\u00fcphanenin sundu\u011fu temel ve geli\u015fmi\u015f \u00f6zelliklere dair kapsaml\u0131 bir bak\u0131\u015f a\u00e7\u0131s\u0131 sunmay\u0131 ama\u00e7lam\u0131\u015ft\u0131r. Daha derinlemesine bilgi ve en g\u00fcncel kullan\u0131m \u00f6rnekleri i\u00e7in her zaman resmi Vue Router dok\u00fcmantasyonuna ba\u015fvurman\u0131z \u00f6nerilir.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Vue.js&#8217;te Y\u00f6nlendirmeye Giri\u015f: Vue Router ile Uygulama Geli\u015ftirme\nVue.js, modern ve interaktif kullan\u0131c\u0131 aray\u00fczleri geli\u015ftirmek i\u00e7in pop\u00fcler","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":[1402],"tags":[],"class_list":{"0":"post-31698","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-vue","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>Vue.js&#039;te Y\u00f6nlendirmeye Giri\u015f: Vue Router ile Uygulama Geli\u015ftirme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\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\/vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Vue.js&#039;te Y\u00f6nlendirmeye Giri\u015f: Vue Router ile Uygulama Geli\u015ftirme\" \/>\n<meta property=\"og:description\" content=\"Vue.js&#039;te Y\u00f6nlendirmeye Giri\u015f: Vue Router ile Uygulama Geli\u015ftirme Vue.js, modern ve interaktif kullan\u0131c\u0131 aray\u00fczleri geli\u015ftirmek i\u00e7in pop\u00fcler\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-12T21:40:54+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=\"16 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Vue.js&#8217;te Y\u00f6nlendirmeye Giri\u015f: Vue Router ile Uygulama Geli\u015ftirme\",\"datePublished\":\"2025-10-12T21:40:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme\/\"},\"wordCount\":2508,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Vue\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme\/\",\"name\":\"Vue.js'te Y\u00f6nlendirmeye Giri\u015f: Vue Router ile Uygulama Geli\u015ftirme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-12T21:40:54+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vue.js&#8217;te Y\u00f6nlendirmeye Giri\u015f: Vue Router ile Uygulama Geli\u015ftirme\"}]},{\"@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":"Vue.js'te Y\u00f6nlendirmeye Giri\u015f: Vue Router ile Uygulama Geli\u015ftirme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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\/vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme\/","og_locale":"tr_TR","og_type":"article","og_title":"Vue.js'te Y\u00f6nlendirmeye Giri\u015f: Vue Router ile Uygulama Geli\u015ftirme","og_description":"Vue.js'te Y\u00f6nlendirmeye Giri\u015f: Vue Router ile Uygulama Geli\u015ftirme Vue.js, modern ve interaktif kullan\u0131c\u0131 aray\u00fczleri geli\u015ftirmek i\u00e7in pop\u00fcler","og_url":"https:\/\/fatihsoysal.com\/blog\/vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-12T21:40:54+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"16 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Vue.js&#8217;te Y\u00f6nlendirmeye Giri\u015f: Vue Router ile Uygulama Geli\u015ftirme","datePublished":"2025-10-12T21:40:54+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme\/"},"wordCount":2508,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Vue"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme\/","url":"https:\/\/fatihsoysal.com\/blog\/vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme\/","name":"Vue.js'te Y\u00f6nlendirmeye Giri\u015f: Vue Router ile Uygulama Geli\u015ftirme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-12T21:40:54+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/vue-jste-yonlendirmeye-giris-vue-router-ile-uygulama-gelistirme\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Vue.js&#8217;te Y\u00f6nlendirmeye Giri\u015f: Vue Router ile Uygulama Geli\u015ftirme"}]},{"@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\/31698","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=31698"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31698\/revisions"}],"predecessor-version":[{"id":31699,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31698\/revisions\/31699"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31698"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31698"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31698"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}