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 provide/inject ile derin component ağaçlarında reactivity'yi kaybetmemek için kullandığım reactive() trick'i

thecoder

Üye
Katılım
14 Mart 2026
Mesajlar
3
Merhaba arkadaşlar, bugün başımı çok ağrıtan bir sorunu ve onun en temiz çözümünü paylaşmak istiyorum. Vue 3 Composition API ile uygulama geliştirirken, provide/inject mekanizmasını kullanarak derin component ağaçlarına state iletmek harika bir şey. Ancak, bir noktada reactivity'nin kaybolduğunu fark ettim ve bu beni epey düşündürdü. İlk başta "ben mi yanlış yapıyorum?" diye sorguladım ama sorun bende değilmiş.

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

Bir parent component'tan, birkaç kat aşağıdaki bir child component'a bir obje sağlamak (provide) istedim. Basit bir değer (string, number) gönderdiğimde her şey yolundaydı. Fakat karmaşık, iç içe geçmiş (nested) bir reactive obje gönderdiğimde, child component'ta bu objenin property'lerini güncellediğimde, reactive updates tetiklenmiyordu. Yani DOM güncellenmiyordu! Bu hatayı ilk gördüğümde kafayı yemiştim, çünkü mantıken çalışması gerekiyordu.

Araştırdım ve gördüm ki, provide ederken doğrudan reactive() ile oluşturduğum objeyi verirsem, bu reactivity zinciri inject edilen yerde kopabiliyor. Sebebi, provide/inject'in reactivity'yi "aktarmak" yerine, mevcut reactive objenin kendisini iletmesi ve bazen bu bağlantının zayıflaması.

🔧 Bulduğum Çözüm: reactive() ile Sarmalayıcı Obje

Çözüm, provide ederken ham state'imizi yeni bir reactive() objesi içine sarmak. Böylece, provide edilen şey, orijinal state'imizin bir proxy'si değil, onu içeren yepyeni ve sağlam bir reactive obje oluyor. Bu yeni obje, inject edildiği her yerde reactivity'sini titizlikle koruyor.

İşte benim kullandığım en temiz çözüm. Önce sorunlu kodu, sonra düzelttiğim haliyle göstereyim.

Sorunlu Örnek (Reactivity Kaybolabilir):
JavaScript:
// ParentComponent.vue
import { reactive, provide } from 'vue';

const state = reactive({
  user: {
    name: 'Bingül',
    preferences: {
      theme: 'dark',
      notifications: true
    }
  }
});

// Burada doğrudan reactive objeyi sağlıyoruz.
provide('userState', state);

JavaScript:
// DeepChildComponent.vue
import { inject } from 'vue';

const injectedState = inject('userState');

// Aşağıdaki güncelleme, ParentComponent'taki state'i değiştirir
// ancak BU component'ta reactivity tetiklenmeyebilir (DOM güncellenmez).
const updateTheme = () => {
  injectedState.user.preferences.theme = 'light'; // 🚨 Riskli!
};

✅ Çalışan Çözüm: reactive() Trick'im

Şimdi, aynı kodu güvenli hale getirelim. Anahtar nokta, provide ederken yeni bir reactive obje oluşturmak.

JavaScript:
// ParentComponent.vue
import { reactive, provide } from 'vue';

const state = reactive({
  user: {
    name: 'Bingül',
    preferences: {
      theme: 'dark',
      notifications: true
    }
  }
});

// TRICK BURASI! State'i yeni bir reactive objenin property'si yapıyoruz.
provide('userState', reactive({
  state // Burada 'state' artık yeni reactive objenin bir parçası.
}));

JavaScript:
// DeepChildComponent.vue
import { inject, toRefs } from 'vue';

// Inject ettiğimiz şey artık { state: ... } şeklinde bir reactive obje.
const injected = inject('userState');

// Reactivity'yi garanti altına almak için toRefs kullanabiliriz (isteğe bağlı).
// const { state } = toRefs(injected);
// Veya doğrudan kullanabiliriz, çünkü 'injected' artık sağlam bir reactive.

const updateTheme = () => {
  injected.state.user.preferences.theme = 'light'; // 🎉 Artık sorunsuz çalışıyor!
  // Değişiklik hem burada hem de parent'ta reactivity'yi tetikler.
};

// Template'de kullanım: {{ injected.state.user.name }}

Bu yöntemle, provide/inject ile oluşturduğumuz kanalın her iki ucunda da güçlü bir reactive bağlantı kurmuş oluyoruz. Artık state ne kadar derine inerse insin, güncellemeler sorunsuz bir şekilde reactivity'yi tetikliyor.

💎 Son Düşünceler

Bu küçük trick, özellikle global state management (Pinia) kullanmak istemediğimiz ama birkaç katmanlı component yapılarımız olduğu durumlarda hayat kurtarıcı oldu. Vue 3'ün reactivity sisteminin derinliklerine inmek bazen böyle incelikleri gösteriyor.

Siz Vue.js'te provide/inject kullanırken benzer bir reactivity kaybı yaşadınız mı? Veya state'i derin component ağaçlarında taşımak için farklı, belki daha sade bir yönteminiz var mı? Yorumlarda deneyimlerinizi paylaşın, tartış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