Cansu Arı Logo
Blog
Nedir?

ref, reactive ve toRefs Arasındaki Fark: Gerçek Reaktiviteyi Anlamak

Vue’nun reaktivite sistemi Proxy tabanlıdır. ref, reactive ve toRefs arasındaki farkı anlamak, neden .value kullanıyoruz sorusunun anahtarıdır.

  • #Vue.js

Skip to content

Reaktiviteyi Anlayalım.

Vue'da ekrandaki değerler, sen farkında bile olmadan kendini günceller. Fakat bu sistemin nasıl işlediğini anlamadan, “neden .value kullanıyoruz?” ya da “neden reactive içinde değişiklik algılanmadı?” gibi sorularla baş başa kalmak kaçınılmazdır.

Bu yazıda ref, reactive ve toRefs arasındaki farkı, gerçek örneklerle, Vue’nun reaktivite motorunun (Proxy tabanlı sistemin) iç mantığıyla birlikte ele alıyoruz.

Vue 3’ün Kalbi: Proxy Tabanlı Reaktivite

Vue 3, eski Object.defineProperty tabanlı sistemden vazgeçip Proxy API kullanıyor. Bu sayede bir nesnedeki tüm property erişimlerini izleyip, bağımlı bileşenleri sadece gerektiğinde yeniden render ediyor.

Yani Vue şu mantıkla çalışıyor:

const state = reactive({ count: 0 })
state.count++ // Proxy “aha değişti!” der

Arka planda, effect() adı verilen bir izleyici (watcher) bağımlılıkları toplar ve değişiklik olduğunda ilgili render’ı tetikler.

ref Nedir?

ref, ilkel (primitive) değerleri reaktif hale getirir. Vue’da number, string, boolean gibi türler doğrudan izlenemez; bu yüzden bir “kutu” içine alınır.
import { ref } from 'vue'
const count = ref(0)
console.log(count.value) // 0
count.value++
Buradaki .value aslında Proxy’nin kendisine erişim kapısıdır. Template içinde bu .value otomatik olarak açılır, yani şunu yazmak yeterlidir:
<p>{{ count }}</p>
Ama JS tarafında .value’yı yazmak zorundayız.

💡 İpucu: ref her zaman tek bir değer içindir. Nesne tutacaksa reactive tercih et.

reactive Nedir?

reactive nesne ve array gibi karmaşık yapıları kapsar. Proxy, her property değişikliğini takip eder:
const user = reactive({
name: 'Cansu',
age: 28
})
user.age++ // reactive proxy çalışır
Fakat dikkat: reactive içine ref koyarsan Vue bunları unwrap (çözümleme) eder. Yani user.age.value gibi yazman gerekmez; Vue otomatik .value’yu açar.

reactive’in Sınırlamaları

  • reactive sadece ilk katmanı izler; derin nested yapılar otomatik olarak proxylanmaz.
  • Destructuring yaptığında reaktivite kaybolur.
const state = reactive({ x: 1, y: 2 })
const { x } = state
x++ // artık reaktif değil!
İşte burada devreye toRefs() giriyor 👇

toRefs() -- Reaktiviteyi Koruyarak Destructure Etmek

toRefs, bir reactive nesneyi ref’lere dönüştürür, böylece destructure ettiğinde bile reaktivite kaybolmaz.
import { reactive, toRefs } from 'vue'
const state = reactive({ x: 1, y: 2 })
const { x, y } = toRefs(state)
x.value++ // hem x hem state.x güncellenir!
Bu sayede reactive bir nesneyi bileşenlere ...spread ederken veya Composition API fonksiyonlarına parametre olarak gönderirken reaktivite bozulmaz.

Derinleşelim: Reaktivite Akışı

Vue şu adımları izler:
  1. Proxy izleme başlatır (track()).
  2. Getter çağrıldığında bağımlılık eklenir.
  3. Setter çağrıldığında ilgili efekt tetiklenir (trigger()).
  4. Template render yeniden hesaplanır.
Yani ref bir tek değer deposu, reactive bir proxy kapsayıcı, toRefs ise bir köprü gibidir.

Ne Zaman Hangisini Kullanmalı?

DurumKullanNeden
Tek bir sayısal/metin değerrefBasit ve performanslı
Objeler / arrayreactiveProxy her property’i izler
Destructuring gerekiyorsatoRefsReaktiviteyi korur
Bir composable’dan dışarı state dönerkentoRefsReaktif nesne bileşenle uyumlu olur

Bonus: shallowRef, shallowReactive

Vue, performans için “shallow” versiyonlar da sunar. Bunlar yalnızca ilk katmanı izler, derin nesneleri proxylemez. Büyük veri listelerinde FPS düşüşünü önlemek için kullanışlıdır.
import { shallowReactive } from 'vue'
const table = shallowReactive({ rows: [] }) // sadece rows property’si izlenir

Sonuç

ref, reactive ve toRefs’ün farkını anlamak, Vue’da “nasıl olur da bir değişiklik ekrana yansımadı?” sorusunun yanıtıdır. Vue’nun reaktivite sistemi Proxy tabanlı bir orkestradır -- her değişiklik, sadece etkilenen bileşeni günceller.

Kısaca:

  • reftek değer kutusu
  • reactiveproxy sarmalayıcı
  • toRefsdestructure güvenlik ağı

Bunları doğru yerde kullanmak, hem performansı hem okunabilirliği zirveye taşır.

All tags
  • Vue.js