Vue.js’te Yönlendirmeye Giriş: Vue Router ile Uygulama Geliştirme
Vue.js, modern ve interaktif kullanıcı arayüzleri geliştirmek için popüler bir JavaScript çerçevesidir. Tek Sayfalı Uygulamalar (Single Page Applications – SPA) çağında, kullanıcıların farklı görünümler arasında sorunsuz bir şekilde gezinmesini sağlamak, herhangi bir web uygulamasının temel bir gereksinimidir. İşte bu noktada yönlendirme (routing) devreye girer. Yönlendirme, uygulamanın URL’sine göre farklı bileşenleri veya görünümleri görüntülemesini sağlayan mekanizmadır. Vue.js ekosisteminde bu görevi üstlenen resmi kütüphane ise Vue Router’dır. Bu makalede, Vue Router’ın temellerini, kurulumunu, temel ve gelişmiş kullanım senaryolarını detaylı bir şekilde inceleyeceğiz.
Giriş
Tek Sayfalı Uygulamalar (SPA’lar), geleneksel çok sayfalı uygulamaların aksine, tüm uygulamanın tek bir HTML sayfasında yüklendiği ve içeriklerin dinamik olarak JavaScript ile değiştirildiği modern web geliştirme paradigmasının önemli bir parçasıdır. Bu yaklaşım, sayfa yenilemeleri olmadan hızlı ve akıcı bir kullanıcı deneyimi sunar. Ancak SPA’larda, tarayıcının adres çubuğundaki URL’nin uygulamanın mevcut durumunu yansıtması ve kullanıcıların belirli bir görünüme doğrudan erişebilmesi veya tarayıcı geçmişini kullanarak geri/ileri gidebilmesi için bir yönlendirme mekanizmasına ihtiyaç duyulur. Vue Router, Vue.js ile geliştirilen SPA’lar için bu ihtiyacı karşılayan güçlü ve esnek bir çözümdür. Kullanıcı dostu API’si ve Vue’nun reaktif doğasıyla mükemmel entegrasyonu sayesinde, karmaşık yönlendirme senaryolarını bile basit ve anlaşılır bir şekilde yönetmeyi mümkün kılar.
Vue Router Nedir?
Vue Router, Vue.js uygulamaları için resmi yönlendirme kütüphanesidir. Uygulamanızın farklı URL yollarına (paths) göre hangi Vue bileşenlerinin gösterileceğini belirlemenizi sağlar. Bu, kullanıcıların bir web sitesinde gezinirken farklı sayfalar (aslında farklı bileşen görünümleri) arasında geçiş yapmasına olanak tanır. Vue Router, client-side routing prensibiyle çalışır; yani yönlendirme işlemleri sunucu tarafında değil, tarayıcıda JavaScript aracılığıyla gerçekleşir. Bu, her rota değiştiğinde sunucuya tam bir sayfa isteği göndermek yerine, sadece gerekli bileşenlerin dinamik olarak yüklenip değiştirilmesi anlamına gelir, bu da daha hızlı ve daha akıcı bir kullanıcı deneyimi sağlar.
Client-Side Routing ve Server-Side Routing Karşılaştırması
* Server-Side Routing: Geleneksel web uygulamalarında, her URL isteği sunucuya gönderilir ve sunucu, istenen kaynağı (genellikle tam bir HTML sayfası) geri döndürür. Bu, her navigasyonda sayfanın tamamen yeniden yüklenmesine neden olur.
* Client-Side Routing: SPA’larda, başlangıçta tüm uygulamanın HTML, CSS ve JavaScript kaynakları yüklenir. Sonraki navigasyonlar için sunucuya tam sayfa isteği yapılmaz. Bunun yerine, JavaScript tarayıcının URL’sini değiştirir (genellikle History API veya hash modu kullanarak) ve URL’ye karşılık gelen bileşeni dinamik olarak DOM’a enjekte eder. Vue Router da bu prensiple çalışır.
Vue Router’ın Temel Özellikleri
Vue Router, yönlendirme ihtiyaçlarını karşılamak için bir dizi güçlü özellik sunar:
* İç İçe Rotalar (Nested Routes): Bir ana bileşenin içinde alt rotalar tanımlayarak daha karmaşık UI yapıları oluşturma.
* Dinamik Rotalar (Dynamic Route Matching): URL’deki değişken parçaları (örneğin /users/:id) yakalayarak aynı bileşeni farklı verilerle kullanma.
* Programatik Navigasyon: Kullanıcı etkileşimlerine veya uygulama mantığına göre JavaScript kodu aracılığıyla yönlendirme yapma.
* Yönlendirme Korumaları (Navigation Guards): Bir rotaya erişmeden önce veya rotadan ayrılırken belirli koşulları kontrol etme (örneğin kimlik doğrulama).
* İsimlendirilmiş Rotalar (Named Routes): Rotalara isim vererek, URL yolları değişse bile navigasyonu kolaylaştırma.
* İsimlendirilmiş Görünümler (Named Views): Aynı anda birden fazla router-view örneğini kullanarak karmaşık layout’lar oluşturma.
* Yönlendirme Geçişleri (Route Transitions): Rota değişikliklerinde animasyonlar ekleme.
* Tembel Yükleme (Lazy Loading): Rota bileşenlerini yalnızca ihtiyaç duyulduğunda yükleyerek uygulamanın başlangıç performansını iyileştirme.
Kurulum ve Temel Kullanım
Vue Router’ı bir Vue.js projesine entegre etmek oldukça basittir. Öncelikle bir Vue projesi oluşturmanız gerekir. Bunu Vue CLI veya Vite gibi araçlarla yapabilirsiniz.
Proje Oluşturma (Vite ile Örnek)
npm create vue@latest
Proje adını girin, Vue Router'ı eklemek isteyip istemediğinizi sorunca 'Yes' seçin.
cd my-vue-app
npm install
npm run dev
Eğer Vue Router’ı proje oluşturma sırasında eklemediyseniz veya mevcut bir projeye eklemek istiyorsanız:
Vue Router’ı Yükleme
npm install vue-router@4 # Vue 3 için
veya
yarn add vue-router@4
Router Örneği Oluşturma
Vue Router’ı kullanmaya başlamak için bir router örneği oluşturmanız gerekir. Bu genellikle src/router/index.js gibi ayrı bir dosyada yapılır.
// src/router/index.js
import { createRouter, createWebHistory } from 'vue-router';
import HomeView from '../views/HomeView.vue';
import AboutView from '../views/AboutView.vue';
const routes = [
{
path: '/',
name: 'home',
component: HomeView
},
{
path: '/about',
name: 'about',
component: AboutView
}
];
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes
});
export default router;
Burada createRouter fonksiyonu ile bir router örneği oluşturulur. history özelliği, yönlendirme modunu belirler. createWebHistory HTML5 History API’sini kullanarak temiz URL’ler (örneğin /users/1) sağlar. createWebHashHistory ise hash tabanlı URL’ler (örneğin /#/users/1) kullanır, bu da daha eski tarayıcılarla uyumluluk için veya sunucu yapılandırması gerektirmeyen durumlar için faydalıdır. routes dizisi ise uygulamanızdaki tüm rota tanımlarını içerir. Her rota objesi path, name ve component gibi özelliklere sahiptir.
Uygulamayı Router ile Bağlama
Oluşturduğunuz router örneğini Vue uygulamanızla bağlamanız gerekir. Bu genellikle src/main.js dosyasında yapılır.
// src/main.js
import { createApp } from 'vue';
import App from './App.vue';
import router from './router'; // Oluşturduğumuz router'ı import ediyoruz
const app = createApp(App);
app.use(router); // Vue uygulamasını router ile kullanacak şekilde yapılandırıyoruz
app.mount('#app');
app.use(router) çağrısı, router örneğini Vue uygulamanıza enjekte eder ve tüm bileşenlerde this.$router ve this.$route (Composition API’da useRouter ve useRoute) gibi özelliklere erişim sağlar.
router-link ve router-view Bileşenleri
Vue Router, yönlendirme için iki global bileşen sağlar:
* : Bu bileşen, HTML’deki etiketi gibi çalışır ancak Vue Router tarafından yönetilen yönlendirme işlemleri için kullanılır. Tıklandığında sayfa yenilemesi olmadan rotayı değiştirir.
* : Bu bileşen, mevcut rotayla eşleşen bileşenin görüntüleneceği yer tutucudur. Router, eşleşen bileşeni bu etiketin içine dinamik olarak render eder.
Yukarıdaki örnekte, etiketleri kullanıcıların “Anasayfa” ve “Hakkında” rotaları arasında gezinmesini sağlar. ise, / yolu eşleştiğinde HomeView bileşenini, /about yolu eşleştiğinde ise AboutView bileşenini gösterecektir.
Rota Tanımları ve Bileşenler
Rota tanımları, uygulamanızın hangi URL’ye hangi bileşeni eşleyeceğini belirleyen temel yapı taşlarıdır.
Temel Rota Yapısı
Her rota tanımı bir JavaScript objesidir ve genellikle şu özellikleri içerir:
* path: URL yolu (örneğin /, /about, /users).
* component: Bu yolla eşleştiğinde görüntülenecek Vue bileşeni.
* name: Rotaya verilen benzersiz bir isim (programatik navigasyon ve isimlendirilmiş rotalar için kullanışlıdır).
* redirect: Bir rotadan başka bir rotaya yönlendirme.
* children: İç içe rotaları tanımlamak için kullanılır.
* meta: Rotaya özel key-value çiftleri eklemek için kullanılır (örneğin kimlik doğrulama gereksinimi).
const routes = [
{ path: '/', component: HomeView, name: 'home' },
{ path: '/about', component: AboutView, name: 'about' },
{ path: '/contact', component: () => import('../views/ContactView.vue'), name: 'contact' } // Lazy loading örneği
];
Bileşenlerin Oluşturulması
Yukarıdaki rota tanımlarında kullanılan HomeView, AboutView ve ContactView gibi bileşenler, genellikle src/views klasöründe yer alır ve standart Vue bileşenleridir.
Uygulamamıza hoş geldiniz!
router-link ile Navigasyon
router-link bileşeni, to prop’u aracılığıyla hedef rotayı belirtir. to prop’u bir string veya bir obje olabilir.
Hakkında
İletişim
Kullanıcı 123
router-link otomatik olarak aktif olan rotaya router-link-active ve router-link-exact-active sınıflarını ekler, böylece navigasyon menülerinizde aktif öğeyi stilize edebilirsiniz.
router-view ile İçerik Gösterimi
router-view bileşeni, Vue Router’ın rotalarla eşleşen bileşenleri render ettiği yerdir. Uygulamanızda yalnızca bir ana router-view olabileceği gibi, iç içe rotalar için birden fazla router-view de bulunabilir.
Dinamik Rotalar (Dynamic Routes)
Çoğu uygulamada, belirli bir kimliğe veya parametreye göre değişen URL’lere ihtiyaç duyulur. Örneğin, bir kullanıcı profil sayfası /users/1, /users/2 gibi URL’lere sahip olabilir. Vue Router, dinamik rota segmentlerini destekler.
URL Parametreleri
Rota tanımında iki nokta üst üste (:) ile başlayan bir segment, dinamik bir parametre olarak kabul edilir.
const routes = [
// ... diğer rotalar
{
path: '/users/:id',
name: 'user',
component: () => import('../views/UserDetail.vue')
}
];
Bu rota tanımı, /users/123 veya /users/abc gibi URL’lerle eşleşir. :id kısmı, rotanın dinamik parametresidir.
Parametrelere Erişim
Bileşen içinde, mevcut rotanın parametrelerine useRoute() Composition API fonksiyonu veya this.$route.params (Options API) aracılığıyla erişebilirsiniz.
Kullanıcı ID: {{ userId }}
Yukarıdaki örnekte, userId reaktif bir referans olarak tanımlanır ve route.params.id değerini alır. Ayrıca, kullanıcı /users/1‘den /users/2‘ye aynı UserDetail bileşeni içindeyken geçtiğinde watch kullanarak userId‘nin güncellenmesini sağlıyoruz.
Props ile Parametreleri Bileşene Geçirme
Parametreleri doğrudan bileşenin prop’ları olarak geçirmek, bileşenlerin daha temiz ve yeniden kullanılabilir olmasını sağlar.
Rota tanımında props: true ayarlayarak tüm rota parametrelerini bileşene prop olarak geçirebilirsiniz:
const routes = [
{
path: '/users/:id',
name: 'user',
component: () => import('../views/UserDetail.vue'),
props: true // :id parametresini UserDetail bileşenine prop olarak geçirecek
}
];
Ardından, UserDetail.vue bileşeninizde id prop’unu tanımlayabilirsiniz:
Kullanıcı ID: {{ id }}
Bu yaklaşım, bileşenin useRoute() bağımlılığını ortadan kaldırır ve onu daha test edilebilir hale getirir.
İç İçe Rotalar (Nested Routes)
Gerçek dünya uygulamalarında, kullanıcı arayüzleri genellikle hiyerarşik bir yapıya sahiptir. Örneğin, bir kullanıcı profil sayfasında “Profil”, “Gönderiler” ve “Ayarlar” gibi alt sekmeler olabilir. Vue Router, bu tür senaryolar için iç içe rotaları destekler.
children Özelliği
İç içe rotalar, bir rota tanımının children özelliğini kullanarak tanımlanır.
const routes = [
{
path: '/users/:id',
component: () => import('../views/UserLayout.vue'), // Ana bileşen
children: [
{
path: '', // Varsayılan alt rota (örneğin /users/1)
name: 'user-profile',
component: () => import('../views/UserProfile.vue')
},
{
path: 'posts', // /users/1/posts
name: 'user-posts',
component: () => import('../views/UserPosts.vue')
},
{
path: 'settings', // /users/1/settings
name: 'user-settings',
component: () => import('../views/UserSettings.vue')
}
]
}
];
Bu örnekte, /users/:id yolu UserLayout.vue bileşenini yükler. UserLayout.vue içinde, alt rotalar için bir daha bulunmalıdır.
Ana Bileşenin İçinde İkinci Bir router-view
UserLayout.vue bileşeni, ana tarafından yüklendiğinde, kendi içinde bir daha barındırarak alt rotaların içeriğini gösterecektir.
Kullanıcı: {{ $route.params.id }}
Bu yapı, karmaşık kullanıcı arayüzlerini daha modüler ve yönetilebilir hale getirir.
Programatik Navigasyon
Bazen, bir kullanıcı bir butona tıkladığında, bir form gönderildiğinde veya bir API çağrısı tamamlandığında olduğu gibi, programatik olarak bir rotaya gitmeniz gerekebilir. Vue Router, bu tür durumlar için çeşitli yöntemler sunar.
router.push(), router.replace(), router.go(), router.back()
* router.push(location): Yeni bir girişi tarayıcı geçmişine ekleyerek belirtilen location‘a gider. router-link‘e tıklamakla aynıdır.
* router.replace(location): Mevcut girişi tarayıcı geçmişinde location ile değiştirir, yani geri düğmesiyle önceki sayfaya dönemezsiniz.
* router.go(n): Tarayıcı geçmişinde n adım ileri veya geri gider. Pozitif bir sayı ileri, negatif bir sayı geri gider.
* router.back(): router.go(-1) ile aynıdır, bir adım geri gider.
Bu yöntemlere Composition API’da useRouter() hook’u aracılığıyla erişilirken, Options API’da this.$router aracılığıyla erişilir.
İsimlendirilmiş Rotalarla Navigasyon
Programatik navigasyon yaparken, rota yolları yerine rota isimlerini kullanmak daha güvenli ve esnektir. Yol değişse bile kodunuzu güncellemeniz gerekmez.
router.push({ name: 'user', params: { id: 123 } });
Query Parametreleri ve Hash ile Navigasyon
router.push ve router.replace yöntemleri, query ve hash özelliklerini de destekler.
// Query parametreleri ile: /search?q=vue&page=2
router.push({ path: '/search', query: { q: 'vue', page: 2 } });
// Hash ile: /about#section-2
router.push({ path: '/about', hash: '#section-2' });
Bu parametrelere bileşen içinde useRoute().query ve useRoute().hash ile erişebilirsiniz.
Yönlendirme Korumaları (Navigation Guards)
Yönlendirme korumaları, bir navigasyonun tamamlanmasını engelleyebilir veya yönlendirme sırasında ek eylemler gerçekleştirebilir. Genellikle kimlik doğrulama, yetkilendirme, veri çekme veya bir rotadan ayrılmadan önce kullanıcıdan onay alma gibi senaryolarda kullanılırlar.
Vue Router’da üç tür yönlendirme koruması bulunur:
Global Guards
* router.beforeEach(to, from, next): Her navigasyondan önce çağrılır. to ve from rota objeleri, next ise navigasyonu kontrol etmek için kullanılan bir fonksiyondur.
* router.afterEach(to, from): Her navigasyondan sonra çağrılır. Bu korumalar next fonksiyonunu almaz ve navigasyonu etkileyemezler, genellikle analitik izleme veya sayfa başlığı güncelleme gibi yan etkiler için kullanılırlar.
// src/router/index.js
router.beforeEach((to, from, next) => {
const isAuthenticated = / Kullanıcının oturum açıp açmadığını kontrol et / true; // Örnek
if (to.meta.requiresAuth && !isAuthenticated) {
// Kimlik doğrulama gerektiren bir rotaya erişmeye çalışıyor ve oturum açmamış
next('/login'); // Giriş sayfasına yönlendir
} else {
next(); // Navigasyona devam et
}
});
Per-Route Guards (Rota Başına Korumalar)
Rota tanımının içinde beforeEnter özelliği kullanılarak belirli bir rotaya özgü korumalar tanımlanabilir.
const routes = [
{
path: '/admin',
component: () => import('../views/AdminPanel.vue'),
meta: { requiresAuth: true, requiresAdmin: true },
beforeEnter: (to, from, next) => {
// Sadece bu rota için özel bir kontrol
const isAdmin = / Yöneticilik kontrolü / true; // Örnek
if (isAdmin) {
next();
} else {
next('/'); // Anasayfaya yönlendir
}
}
}
];
In-Component Guards (Bileşen İçi Korumalar)
Bu korumalar, doğrudan bileşenlerin içinde tanımlanır ve belirli bir bileşene girerken, o bileşende kalırken veya o bileşenden ayrılırken tetiklenir.
* beforeRouteEnter(to, from, next): Bileşene girilmeden önce çağrılır. Bu sırada bileşen örneği henüz oluşturulmadığı için this‘e erişilemez. next callback’i içinde bir callback fonksiyonu ile bileşen örneğine erişilebilir.
* beforeRouteUpdate(to, from, next): Aynı rotanın farklı parametrelerle (örneğin /users/1‘den /users/2‘ye) güncellenmesi durumunda çağrılır. this‘e erişim vardır.
* beforeRouteLeave(to, from, next): Bileşenden ayrılmadan önce çağrılır. Kullanıcıya bir formu kaydetmediği konusunda uyarı vermek gibi senaryolarda kullanışlıdır. this‘e erişim vardır.
Gelişmiş Konular
Vue Router, temel yönlendirme ihtiyaçlarının ötesine geçen bir dizi gelişmiş özellik sunar.
İsimlendirilmiş Rotalar (Named Routes)
Rotalara isim vermek, programatik navigasyonu ve router-link kullanımını daha esnek hale getirir. URL yolları değişse bile, isimlendirilmiş rotaları kullanan kodunuzu güncellemeniz gerekmez.
const routes = [
{
path: '/user/:id',
name: 'userProfile', // Rotaya isim verdik
component: () => import('../views/UserProfile.vue')
}
];
Navigasyonda kullanımı:
Kullanıcı 123
router.push({ name: 'userProfile', params: { id: 456 } });
İsimlendirilmiş Görünümler (Named Views)
Bazen aynı anda birden fazla router-view‘ı kullanarak karmaşık bir layout oluşturmak isteyebilirsiniz. İsimlendirilmiş görünümler, bunu mümkün kılar.
Rota tanımında, hangi router-view‘a hangi bileşenin yükleneceğini belirtirsiniz:
const routes = [
{
path: '/',
components: {
default: () => import('../views/HomeContent.vue'),
header: () => import('../components/AppHeader.vue'),
sidebar: () => import('../components/AppSidebar.vue'),
footer: () => import('../components/AppFooter.vue')
}
},
{
path: '/about',
components: {
default: () => import('../views/AboutContent.vue'),
header: () => import('../components/AppHeader.vue'),
sidebar: () => import('../components/AppSidebar.vue')
// Footer bu rotada gösterilmeyecek
}
}
];
Meta Alanları (Meta Fields)
Rota tanımlarına özel veriler eklemek için meta özelliğini kullanabilirsiniz. Bu veriler, yönlendirme korumaları içinde veya bileşenler içinde mevcut rotanın meta özelliğinden erişilebilir.
const routes = [
{
path: '/dashboard',
component: () => import('../views/Dashboard.vue'),
meta: {
requiresAuth: true,
title: 'Yönetim Paneli'
}
}
];
Bileşen içinde erişim:
import { useRoute } from 'vue-router';
const route = useRoute();
console.log(route.meta.title); // "Yönetim Paneli"
Yönlendirme Geçişleri (Route Transitions)
Rota değişiklikleri sırasında animasyonlar eklemek, kullanıcı deneyimini zenginleştirir. Vue’nun bileşeni ile Vue Router’ı entegre edebilirsiniz.
Bu örnekte, router-view‘ın içeriği değiştiğinde bir solma animasyonu (fade transition) uygulanır. mode="out-in" önce eski bileşenin kaybolup sonra yenisinin görünmesini sağlar.
Lazy Loading (Tembel Yükleme)
Büyük uygulamalarda, tüm rota bileşenlerini uygulamanın başlangıcında yüklemek, ilk yükleme süresini uzatabilir. Tembel yükleme (code splitting), bileşenleri yalnızca ilgili rotaya erişildiğinde yükleyerek bu sorunu çözer. Vue Router, dinamik import (ES modülleri) ile bunu kolayca yapmanızı sağlar.
const routes = [
{
path: '/',
name: 'home',
component: () => import('../views/HomeView.vue') // Sadece HomeView erişildiğinde yüklenecek
},
{
path: '/about',
name: 'about',
component: () => import('../views/AboutView.vue') // Sadece AboutView erişildiğinde yüklenecek
}
];
Bu şekilde, uygulamanızın başlangıç paketi (bundle) boyutu küçülür ve daha hızlı yüklenir.
Sonuç
Vue Router, Vue.js uygulamaları için vazgeçilmez bir yönlendirme çözümüdür. Basit kurulumu, sezgisel API’si ve kapsamlı özellik seti sayesinde, hem küçük hem de büyük ölçekli tek sayfalık uygulamaların yönlendirme ihtiyaçlarını eksiksiz bir şekilde karşılar. Temel rota tanımlarından dinamik rotalara, iç içe görünümlerden programatik navigasyona ve güçlü yönlendirme korumalarına kadar sunduğu yeteneklerle, geliştiricilere esnek ve kontrol edilebilir bir yönlendirme deneyimi sunar. Vue Router’ı öğrenmek ve ustaca kullanmak, Vue.js ile daha performanslı, daha organize ve daha kullanıcı dostu web uygulamaları geliştirmenin anahtarıdır. Bu makale, Vue Router’a sağlam bir giriş yaparak, kütüphanenin sunduğu temel ve gelişmiş özelliklere dair kapsamlı bir bakış açısı sunmayı amaçlamıştır. Daha derinlemesine bilgi ve en güncel kullanım örnekleri için her zaman resmi Vue Router dokümantasyonuna başvurmanız önerilir.