Cansu Arı Logo
Blog
Nedir?

Computed mı, Watch mı? Ne Zaman Hangisini Kullanmalı

Vue’nun reaktivite sisteminde computed ve watch benzer görünür ama temelde farklı amaçlara hizmet eder.

  • #Vue.js

Skip to content

Computed mı, Watch mı?

Vue’da reaktivite sisteminin iki temel oyuncusu vardır: computed ve watch. Her ikisi de veri değişimlerine tepki verir, ama aynı işi yapmazlar. Bu iki özelliği yanlış yerde kullanmak, gereksiz render’lar veya beklenmedik davranışlar doğurabilir.

Bu yazıda ikisinin farkını, doğru kullanım senaryolarını ve performans açısından nelere dikkat etmen gerektiğini anlatıyoruz.

Computed: Reaktif Hesaplama Alanı

computed, türetilmiş değerleri (derived state) oluşturmak için kullanılır. Yani bir veya birden fazla reaktif değişkene bağlı olarak otomatik hesaplanan sonuçlar üretir.
import { ref, computed } from 'vue'

const firstName = ref('Cansu')
const lastName = ref('Arı')
const fullName = computed(() => `${firstName.value} ${lastName.value}`)

Burada fullName, hem firstName hem lastName değiştiğinde kendini günceller. Vue, computed fonksiyonunu izler ve sadece bağımlı değerlerden biri değiştiğinde yeniden hesaplar. Diğer durumlarda önbellekten (cache) okur.

Özet: Computed, “bu değeri DOM’da göstereceğim, ama hesaplama bana ait” dediğin durumlar içindir.

Watch: Yan Etki (Side Effect) Dinleyicisi

watch, bir veya daha fazla reaktif değişkeni gözlemler ve bu değerler değiştiğinde belirli bir işlemi tetikler. Yani amaç hesap yapmak değil, reaksiyon göstermektir.
import { ref, watch } from 'vue'

const age = ref(20)

watch(age, (newVal, oldVal) => {
console.log(`Yaş değişti: ${oldVal} → ${newVal}`)
if (newVal >= 35) alert('Artık genç sayılmazsın 😛')
})

Burada age değiştiğinde Vue otomatik olarak callback’i çalıştırır. Bu genellikle API çağrısı yapmak, localStorage güncellemek veya bir animasyonu başlatmak için kullanılır.

Uyarı: watch asla template’teki bir değeri göstermek için kullanılmaz. Çünkü watcher bir değer döndürmez, sadece bir reaksiyon tanımlar.

Temel Farklar

ÖzellikComputedWatch
AmaçTüretilmiş değer hesaplamaYan etki çalıştırma
Geri dönen değerVar (return ile)Yok (callback)
ÖnbellekEvetHayır
Re-render tetikler mi?Evet, dolaylı olarakHayır, manuel olarak işlem yapar
Tipik kullanımfullname, filteredListAPI çağrısı, loglama, senkronizasyon

İleri Seviye: watchEffect

Vue 3 ile gelen watchEffect, hem computed hem watch arasında bir hibrittir. İçinde kullanılan tüm reaktif değişkenleri otomatik olarak izler.
import { ref, watchEffect } from 'vue'

const count = ref(0)
watchEffect(() => {
console.log('Count değişti:', count.value)
})

Hiç bağımlılık belirtmeden reaktif izleme yapmak istiyorsan watchEffect mükemmel bir seçenektir. Ancak bu fonksiyonun her render sonrası tetiklenme ihtimali yüksek olduğu için, dikkatli kullanılmalıdır.

watchEffect, genellikle veri yükleme veya cleanup gerektiren “otomatik reaksiyonlar” için kullanılır.

watch vs watchEffect Karşılaştırması

ÖzellikwatchwatchEffect
BağımlılıkManuel belirtilirOtomatik tespit edilir
İlk çalıştırmaDeğişiklik olduğundaHemen çalışır
PerformansDaha kontrollüDaha sık tetiklenebilir
Kullanım AlanıAPI, yan etkiBasit bağımlılık takibi

Performans ve En İyi Pratikler

  • Computed kullanırken fonksiyonun içinde asla yan etki yapma (örneğin fetch çağrısı). Computed yalnızca “veri üretmek” içindir.
  • Watch kullanırken debounce/throttle gerekebilir; çünkü çok sık tetiklenebilir.
  • Watcher’ın içinde reactive objeyi derin izlemek istiyorsan deep: true ayarını kullan:
watch(() => user.value, handler, { deep: true })
Ama gereksizse derin izleme performansı baltalar.

Hangi Durumda Hangisi?

SenaryoKullanılması Gereken
Template’te gösterilecek türetilmiş değercomputed
Kullanıcı bir input’a veri girdiğinde hesaplamacomputed
API çağrısı yapmakwatch veya watchEffect
localStorage senkronizasyonuwatch
Reaktif değişiklikle animasyon/scroll başlatmawatch
Basit console.log veya geçici reaksiyonwatchEffect

Gerçek Hayat Örneği

Bir filtreleme senaryosunu düşünelim:
const query = ref('')
const items = ref(['vue', 'react', 'svelte'])
const filtered = computed(() => items.value.filter(i => i.includes(query.value)))
Burada computed, DOM’da filtrelenmiş listeyi gösterir. Ama eğer bu değişikliğe göre bir API çağrısı yapmak istiyorsan:
watch(query, debounce(fetchResults, 500))
İşte burada watch devreye girer. Yani biri UI’nin neyi göstereceğini, diğeri UI dışında ne yapılacağını belirler.

Sonuç

Vue’da computed ve watch arasındaki fark, görünenden daha derindir. computed bir değeri hesaplar, watch bir olaya tepki verir. İkisini doğru kullandığında, hem gereksiz render’lardan kurtulursun hem de kodun çok daha okunabilir hale gelir.

Kısaca: computed veriyi dönüştürür, watch davranışı dönüştürür.

All tags
  • Vue.js