Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

Vue.js'te v-if ile v-show arasındaki kritik performans farkını hangi senaryoda hangisini seçerek çözdüm

stackor

Üye
Katılım
14 Mart 2026
Mesajlar
16
Merhaba arkadaşlar, bugün başımı çok ağrıtan bir Vue.js optimizasyon sorunundan bahsedeceğim. Uzun süredir "v-if ve v-show zaten aynı işi yapıyor, fark ne?" diye düşünüyordum. Ta ki, yüzlerce satırlık bir veri tablosunu render eden ve sürekli açılıp kapanan bir modal bileşenimde ciddi bir gecikme hissedene kadar! İşte o zaman bu iki direktif arasındaki farkın sandığımdan çok daha kritik olduğunu anladım.

🔥 Karşılaştığım Sorun

Projemde, kullanıcının bir tablodaki satıra tıklayınca açılan ve o satıra ait detaylı, karmaşık bir bileşen içeren bir modalım vardı. Bu modal'ı açıp kapamak için basit bir `isModalOpen` değişkeni kullanıyordum ve görünürlüğünü kontrol etmek için v-if kullanmıştım. İlk başta sorun yoktu. Ancak, modal içindeki bileşen büyüdükçe (grafikler, hesaplamalar, alt bileşenler) her açılışta hissedilir bir gecikme oluşmaya başladı. Sanki modal her seferinde sıfırdan doğuyordu. Konsolu açtığımda, modalın DOM'dan tamamen silinip tekrar eklendiğini ve tüm yaşam döngüsü hook'larının (created, mounted) her seferinde tetiklendiğini gördüm. Bu da gereksiz hesaplamalara ve render maliyetine yol açıyordu.

🔍 v-if vs v-show: Temel Fark Nedir?

Araştırdığımda ikisinin temel farkını netleştirdim:
v-if gerçek anlamda "koşullu oluşturma" yapar. Koşul yanlışsa, bileşen/eleman DOM'dan tamamen kaldırılır. Koşul doğru olduğunda ise sıfırdan oluşturulup DOM'a eklenir. Bu, yaşam döngüsünün (created/mounted -> destroyed/unmounted) her seferinde çalışması demek.

v-show ise sadece CSS tabanlı bir görünürlük değiştiricidir. Eleman/bileşen her zaman DOM'da oluşturulur ve kalır, sadece `display: none` ile gizlenir. Yaşam döngüsü hook'ları sadece ilk oluşturmada bir kere çalışır.

💡 Hangi Senaryoda Hangisini Seçtim?

İşte kritik karar noktası:
v-if'i ne zaman kullanırım? Eğer elemanın/bileşenin çok sık değişmeyeceğini (aç/kapa) veya ilk render maliyetinin yüksek olduğunu biliyorsam. Örneğin, kullanıcı profili sayfasındaki "Gelişmiş Ayarlar" sekmesi gibi nadiren açılan bölümler için v-if mükemmeldir. İlk yük daha hızlı olur.

v-show'u ne zaman kullanırım? Elemanın/bileşenin çok sık görünürlüğünün değişeceğini biliyorsam (toggle'lanacaksa) ve bileşenin oluşturulma maliyetinin yüksek olduğunu görüyorsam. İşte benim modal sorunumun tam çözümü buydu!

⚙️ Uyguladığım Çözüm ve Kod

Modal bileşenimi, sık sık açılıp kapanacağı ve içeriğinin ağır olduğu için v-if'ten v-show'a çevirdim. İşte basit örnek:

JavaScript:
<template>
  <div>
    <!-- Tablo vs. burada -->
    <button @click="isModalOpen = !isModalOpen">Detayları Göster</button>

    <!-- ESKİ YÖNTEM (Performans Sorunlu) -->
    <!-- <HeavyDetailModal v-if="isModalOpen" :item="selectedItem" @close="isModalOpen = false" /> -->

    <!-- YENİ ve OPTİMİZE YÖNTEM -->
    <HeavyDetailModal v-show="isModalOpen" :item="selectedItem" @close="isModalOpen = false" />
  </div>
</template>

<script>
import HeavyDetailModal from './HeavyDetailModal.vue';

export default {
  components: { HeavyDetailModal },
  data() {
    return {
      isModalOpen: false,
      selectedItem: null
    };
  },
  // Modal açma metodunuz...
}
</script>

`HeavyDetailModal.vue` bileşeninin `created()` veya `mounted()` hook'unda yaptığı ağır veri çekme işlemleri artık sadece ilk yüklemede bir kere çalışıyor. Modal her açılıp kapandığında, sadece CSS `display` özelliği değişiyor. Bu da kullanıcı deneyiminde anlık bir iyileşme sağladı.

🎯 Sonuç ve Tavsiyem

Bu küçük değişiklik, modalın açılış hızını inanılmaz derecede artırdı. Artık kullanıcı tıkladığı anda modal ekranda beliriyor. Özetle, eğer bileşeniniz sık sık toggle'lanacaksa ve oluşturulma maliyeti yüksekse, v-show sizin için daha performanslı olacaktır. Eğer bileşen nadiren görünecekse veya koşul çoğunlukla yanlışsa, o zaman v-if ile ilk yük performansını artırabilirsiniz.

Siz Vue.js projelerinizde bu ikilinin seçimi konusunda ne gibi deneyimler yaşadınız? Özellikle büyük ölçekli uygulamalarda fark eden başka ince nüanslar var mı? Yorumlarda buluşalım!
 

Tema özelleştirme sistemi

Bu menüden forum temasının bazı alanlarını kendinize özel olarak düzenleye bilirsiniz.

Zevkine göre renk kombinasyonunu belirle

Tam ekran yada dar ekran

Temanızın gövde büyüklüğünü sevkiniz, ihtiyacınıza göre dar yada geniş olarak kulana bilirsiniz.

Geri