React ve Vue, kullanıcı arayüzlerini bileşenlerden kurmaya yarayan JavaScript araçlarıdır (React kendine bir kütüphane, Vue ise aşamalı bir framework der) ve fikirlerin çoğunu paylaşırlar: props aşağı, olaylar yukarı, reaktif state, bir sanal DOM. Pratik farklar şunlardır: React işaretlemeyi JSX'te yazar ve state'in bir setter ile yerine konmasını bekler; Vue ise işaretlemeyi tek dosyalı bileşenlerin içindeki HTML şablonlarına yazar ve reaktif değerleri doğrudan değiştirmene izin verir. İşte React'te bir sayaç:
Ve aynı sayaç bir Vue tek dosyalı bileşeni (Counter.vue) olarak:
<script setup>
import { ref } from 'vue';
const count = ref(0);
</script>
<template>
<button @click="count++">Clicked {{ count }} times</button>
</template>
useState(0), ref(0) olur; onClick, @click olur; {count} de {{ count }} olur. Görünür fark count++'tır: Vue değeri yerinde değiştirmene izin verir ve reaktivite sistemi bunu fark eder. React'in setCount'a ihtiyacı vardır, çünkü yalnızca ona yeni bir değer verdiğinde yeniden render eder.
JSX ve tek dosyalı bileşenler
Bir React bileşeni JSX döndüren bir JavaScript fonksiyonudur. Koşullar && ya da bir ternary'dir, listeler .map()'tir ve stiller ne seçersen ondan gelir (CSS dosyaları, CSS modülleri, bir utility framework'ü).
Bir Vue bileşeni genellikle üç bloklu bir .vue dosyasıdır: mantık için <script setup>, işaretleme için <template> ve CSS'i yalnızca o bileşene uygulanan isteğe bağlı bir <style scoped>. Şablonlar direktifler kullanır: v-if, v-for, iki yönlü input bağlama için v-model, bir değeri bağlamak için :prop ve dinlemek için @event. Şablonlar işaretlemeyi HTML bilen herkes için okunabilir tutar; JSX ise işaretlemede sana JavaScript'in tamamını verir. Vue JSX de kullanabilir ve React şablon kullanamaz, ama her birindeki kodun çoğu kendi varsayılanını izler.
İşte karşılaştırılacak ikinci özellik, filtrelenmiş bir liste.
Boş mesajı görmek için xyz yazmayı dene, sonra sil. Vue sürümü:
<script setup>
import { ref, computed } from 'vue';
const fruits = ['Apple', 'Banana', 'Cherry', 'Grape', 'Mango', 'Peach'];
const query = ref('');
const visible = computed(() =>
fruits.filter((f) => f.toLowerCase().includes(query.value.toLowerCase()))
);
</script>
<template>
<input v-model="query" placeholder="Filter fruit" />
<ul>
<li v-for="fruit in visible" :key="fruit">{{ fruit }}</li>
<li v-if="visible.length === 0">No match</li>
</ul>
</template>
v-model, value artı onChange çiftinin yerini alır, computed de düz değişkenin. React'te visible her render'da yeniden hesaplanır, çünkü bileşen fonksiyonu yeniden çalışır; Vue'da computed onu önbelleğe alır ve yalnızca query değiştiğinde yeniden hesaplar. İkisi de liste öğelerini ayırt etmek için bir key kullanır.
Reaktivite modeli
İkisi arasındaki en derin fark budur.
React: değişmez state ve yeniden render'lar. State bir anlık görüntüdür. Bir setter'ı yeni bir değerle çağırırsın, React bileşen fonksiyonunu yeniden çalıştırır, yeni JSX'i eskisiyle karşılaştırır ve DOM'u günceller. React değerleri Object.is ile karşılaştırır, bu yüzden bir nesneyi ya da diziyi yerinde değiştirip aynısını geri aktarmak hiç değişiklik yokmuş gibi görünür.
"push() in place"e tıkla; ekranda hiçbir şey değişmez, çünkü dizi aynı nesnedir. Sonra "New array"e tıkla: render pushed'u da gösterir, çünkü önceki mutation gerçekten oldu, React'in sadece bakmak için bir nedeni yoktu. useState sayfası bu kalıbı derinlemesine anlatıyor.
Vue: değiştirilebilir reaktif değerler. Bir ref ya da reactive nesne onu kimin okuduğunu kaydeder (bir ref, .value getter'ı aracılığıyla; bir reactive nesne bir proxy aracılığıyla). Ona yazdığında Vue hangi computed değerlerin, watcher'ların ve şablon parçalarının ona bağlı olduğunu tam olarak bilir ve yalnızca onları günceller. Vue'da items.value.push('pushed') ekranı günceller. Daha az tören yazarsın ve bir değerin elinin altında asla değişmeyeceği garantisinden vazgeçersin.
Hiçbir model tipik uygulamalar için önemli olacak şekilde daha hızlı değildir. React değişiklik başına daha fazla bileşen kodu çalıştırabilir ve işi atlamak için memoization'a (elle ya da React Compiler aracılığıyla) güvenir; Vue bağımlılıkları çalışma anında takip eder, bu yüzden o işi varsayılan olarak atlar.
Composition API ve hook'lar
Vue 3'ün Composition API'si ve React hook'ları aynı sorunu çözer: ilişkili state'i ve mantığı bir araya koymak ve bileşenler arasında yeniden kullanmak. Vue yeniden kullanılabilir fonksiyonlara composable (useMouse()), React ise özel hook (useMouse()) der. Kurallar kodun ne zaman çalıştığı nedeniyle farklıdır.
- Ne zaman çalışır. Bir Vue
setup'ı bileşen oluşturulduğunda bir kez çalışır. Bir React bileşen fonksiyonu her render'da çalışır ve içindeki hook'lar onunla birlikte çalışır. - Sıra kuralları. React hook'ları çağrı sırasına göre eşleştirir, bu yüzden onları koşulların ya da döngülerin içinde çağıramazsın. Vue'nun
refvecomputediçin böyle bir kuralı yoktur, çünkü setup bir kez çalışır. - Bağımlılıklar. React efektleri ve memo'ları bağımlılıklarını senin bakımını yaptığın bir dizide listeler. Vue'nun
watchEffectvecomputed'u okuduklarını otomatik olarak takip eder. - Eski değerler. Bir React callback'i daha önceki bir render'dan eski bir state değerini yakalayabilir (klasik
setIntervalhatası). Bir Vue callback'icount.value'yu çağrı anında okur ve her zaman mevcut değeri görür.
React'in modeli her render'ı props ve state'in saf bir fonksiyonu yapar; bunu test etmek ve üzerine düşünmek kolaydır. Vue'nun modeli ise bağımlılık dizileriyle ilgili bir hata sınıfını ortadan kaldırır. Birini bilen geliştiriciler genellikle diğerini hızla kavrar.
Ekosistem
| React | Vue | |
|---|---|---|
| İşaretleme | JSX | .vue dosyalarında HTML şablonları (JSX isteğe bağlı) |
| State güncellemeleri | Bir setter ile yerine koy, sonra yeniden render | Reaktif bir değeri değiştir, bağımlılar güncellenir |
| Mantığı yeniden kullanma | Özel hook'lar | Composable'lar |
| Türetilmiş değerler | Render sırasında hesaplanır, useMemo | computed (önbellekli) |
| İki yönlü input bağlama | value artı onChange | v-model |
| Kapsamlı CSS | Yerleşik değil (CSS modülleri, kütüphaneler) | <style scoped> yerleşik |
| Yönlendirme | React Router, TanStack Router, framework'ler | Vue Router (resmi) |
| Global state | Context, Zustand, Redux Toolkit | Pinia (resmi) |
| Full-stack framework | Next.js, React Router framework modu | Nuxt |
| Mobil uygulamalar | React Native | Resmi seçenek yok (Capacitor, NativeScript-Vue) |
| Derleme aracı | Vite ya da bir framework | Vite |
| Bakımını yapan | Meta ve topluluk | Bağımsız bir çekirdek ekip ve topluluk |
O tablodaki kalıp: Vue'nun çekirdek ekibi yönlendiricinin, store'un ve devtools'un bakımını birlikte yapar, bu yüzden bir Vue projesinin her biri için bariz bir varsayılanı vardır. React bunları topluluğa bırakır; bu da sana daha fazla seçenek ve daha fazla karar verir. İkisinde de yeni projeler için olağan derleme aracı olan Vite, Vue'nun yaratıcısı tarafından başlatıldı.
Öğrenme eğrisi
Vue çoğu zaman daha yumuşak bir başlangıçtır. Şablonlar zaten bildiğin HTML gibi okunur, v-model kontrollü input kalıp kodunu ortadan kaldırır ve reaktif bir değer, onu değiştirdiğinde ekranı günceller. React ise baştan JSX'i ve değişmez güncelleme alışkanlığını ister; JSX sayfası çoğu kişinin ihtiyaç duyduğu ilk şeydir.
Temellerden sonra fark daralır. Vue kendi kavramlarını ekler (ref'ler ve reaktif nesneler, script'lerde .value ama şablonlarda değil, watcher'lar), React de efektleri, memoization'ı ve hook kurallarını ekler. Bölgendeki iş ilanları sözdiziminden daha yararlı bir eşitlik bozucudur.
Hangisi ne zaman seçilmeli
React'i şu durumlarda seç:
- Geniş bir topluluk kütüphanesi ve bileşen seçimi istiyorsan ya da React Native ile yerel mobil uygulamalar kurmayı planlıyorsan.
- Mantığı ve işaretlemeyi tek bir JavaScript fonksiyonunda tutmayı seviyorsan ve Next.js gibi bir framework istiyorsan.
- Ekibin, her render'ı izlemeyi kolaylaştıran açık, değişmez güncellemelere değer veriyorsa.
Vue'yu şu durumlarda seç:
- Yönlendirme ve state için resmi, uyumlu araçlar ve verilecek daha az karar istiyorsan.
- Ekibinde HTML şablonlarıyla rahat olan tasarımcılar ya da back-end geliştiricileri varsa.
- Mevcut, sunucuda render edilen sayfalara etkileşim ekliyorsan: Vue bir sayfaya bir script etiketinden eklenip oradan büyüyebilir.
İkisi de olgun ve her ölçekten şirket tarafından production'da kullanılıyor; birinde öğrendiğin kavramlar (bileşenler, props, türetilmiş state, key'li listeler) doğrudan diğerine taşınır.
Sıkça Sorulan Sorular
Vue React'ten daha mı kolay?
Birçok yeni başlayan Vue'yu başta daha kolay bulur, çünkü şablonlar düz HTML'e benzer ve reaktif bir değeri değiştirmek (count.value++) ekranı setter olmadan günceller. React ise JSX'i ve state'in değiştirilmek değil yerine konmak zorunda olduğu kuralını öğrenmeni ister. İlk haftalardan sonra zorluk benzerdir.
React mı daha iyi, Vue mu?
Genel olarak hiçbiri kazanmaz. React yönlendirmeyi ve state'i topluluk kütüphanelerine bırakır ve mobil için React Native'e sahiptir. Vue'nun birlikte bakımı yapılan resmi bir yönlendiricisi, store'u ve devtools'u vardır ve birçok kişinin okumayı daha kolay bulduğu şablonları vardır. Ekibinin ya da iş piyasasının kullandığını seç.
Vue'nun Composition API'si ile React hook'ları arasındaki fark nedir?
İkisi de state'li mantığı yeniden kullanılabilir fonksiyonlarda gruplar. Bir Vue setup'ı bileşen başına bir kez çalışır ve bağımlılıkları otomatik olarak takip eder, bu yüzden bağımlılık dizileri ve eski closure'lar yoktur. Bir React bileşen fonksiyonu her render'da çalışır, bu yüzden hook'lar her seferinde aynı sırayla çağrılmalı ve efektler bağımlılıklarını listelemelidir.
Vue JSX kullanır mı?
Vue bir eklenti aracılığıyla JSX'i destekler, ama çoğu Vue kodu tek dosyalı bileşenlerde (.vue dosyaları) HTML şablonları kullanır. React neredeyse her yerde JSX kullanır.
Next.js'in Vue karşılığı nedir?
Nuxt. React için Next.js gibi, Vue'nun üstüne dosya tabanlı yönlendirme, sunucu tarafı render, statik üretim ve sunucu rotaları ekler.