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 Pinia store'unu component içinde kullanırken reactivity'nin bozulmaması için dikkat ettiğim noktalar

codexor

Üye
Katılım
14 Mart 2026
Mesajlar
6
Merhaba arkadaşlar, bugün Vue 3 ve Pinia ile uğraşırken başımı çok ağrıtan bir konudan bahsedeceğim. Store'dan aldığım bir state'i component'imde kullanıyordum ama bir türlü değişiklikler ekrana yansımıyordu. "Bu state değişti, neden component güncellenmiyor?" diye kafayı yemiştim. Meğerse reactivity'yi, yani Vue'un tepkiselliğini, yanlış kullanıyormuşum. İşte bu süreçte öğrendiğim ve artık her projemde uyguladığım kurşun geçirmez yöntemler.

🔥 Karşılaştığım Sorun: Gizemli Bir Güncelleme Kaybı

Bir kullanıcı listemi Pinia store'unda tutuyordum. Listeyi component'imde döngüye alıp her bir kullanıcı için "düzenle" butonu yapmıştım. Butona tıklayınca, store'daki ilgili kullanıcı nesnesini doğrudan değiştiriyordum. Ama ekran bir türlü güncellenmiyordu! Console'da verinin değiştiğini görüyordum ama DOM'a yansımıyordu. Sorun, reactive proxy zincirini kırmamdan kaynaklanıyormuş.

🛡️ Çözüm 1: Store State'ini Doğrudan Parçalama (Destructure)

En sık yapılan hata, store state'ini `toRefs` kullanmadan parçalamak. Bu, reactivity bağını tamamen koparır.

YANLIŞ KULLANIM: Reactivity kaybolur!
JavaScript:
import { useUserStore } from '@/stores/user'

const userStore = useUserStore()

// BU TEHLİKELİ! Reactivity'yi yok eder.
const { users, isLoading } = userStore

DOĞRU KULLANIM: Store nesnesinin kendisini kullan veya `storeToRefs` ile parçala.
JavaScript:
import { useUserStore } from '@/stores/user'
import { storeToRefs } from 'pinia'

const userStore = useUserStore()

// Yöntem A: Direkt store üzerinden erişim (Tavsiye edilen)
console.log(userStore.users) // Reactive

// Yöntem B: Reactivity'yi koruyarak parçalama
const { users, isLoading } = storeToRefs(userStore)
// Artık `users` bir ref, reactivity korundu!

🔧 Çözüm 2: Nested Object'leri Güncellerken Dikkat!

Store'unuzda iç içe geçmiş (nested) bir obje varsa, onun property'lerini doğrudan değiştirmek de sorun çıkarabilir. En temiz çözüm, action'ları kullanmak veya `$patch` metoduna başvurmak.

SORUNLU YAKLAŞIM:
JavaScript:
// Component içinde...
const handleUpdateName = (userId, newName) => {
  const user = userStore.users.find(u => u.id === userId)
  if (user) {
    user.name = newName // Bu bazen reactivity'yi tetiklemeyebilir!
  }
}

TEMİZ ÇÖZÜM: Store action'ını kullanın.
JavaScript:
// store/user.js (Pinia store action'ı)
actions: {
  updateUserName({ userId, newName }) {
    const user = this.users.find(u => u.id === userId)
    if (user) {
      // Object.assign veya yeni referans ataması yap
      Object.assign(user, { name: newName })
      // Veya: user = { ...user, name: newName } (dikkatli olun)
    }
  }
}

// Component içinde...
const handleUpdateName = (userId, newName) => {
  userStore.updateUserName({ userId, newName }) // Her şey kontrol altında!
}

ALTERNATİF ÇÖZÜM: `$patch` ile güncelleme. Özellikle birden fazla alanı aynı anda güncellerken çok şık.
JavaScript:
const handleUpdateUser = (userId, updates) => {
  userStore.$patch((state) => {
    const user = state.users.find(u => u.id === userId)
    if (user) {
      Object.assign(user, updates)
    }
  })
}

💎 Altın Kural: Computed Getter'lar Gücünüz Olsun

Store state'ini component'te hesaplamalara tabi tutacaksanız, bunu asla component'in `computed` bloğunda uzun uzun yazmayın. Bunun yerine, store'un içine bir getter tanımlayın. Bu, hem kodu temizler hem de reactivity garantisi verir.

JavaScript:
// Pinia Store'umuz
export const useUserStore = defineStore('user', {
  state: () => ({ users: [] }),
  getters: {
    // Reactivity garantili getter
    activeUsers: (state) => state.users.filter(user => user.isActive),
    userCount: (state) => state.users.length
  }
})

// Component'te kullanımı süper basit ve güvenli
import { storeToRefs } from 'pinia'
const userStore = useUserStore()
const { activeUsers, userCount } = storeToRefs(userStore) // Hepsi reactive!

Sonuç olarak, Pinia ile çalışırken reactivity sihirli bir değnek değil, kuralları olan bir sistem. Bu kurallara (doğrudan state parçalama, nested güncelleme, getter kullanımı) dikkat ettiğimden beri hayatım çok kolaylaştı. Artık ekranın güncellenmemesi gibi bir derdim kalmadı.

Siz Vue.js ve Pinia'da reactivity konusunda benzer sorunlar yaşadınız mı? Belki sizin de "Aman şuna dikkat edin!" dediğiniz farklı bir nokta vardır? Yorumlarda deneyimlerinizi paylaşalım, hep birlikte öğrenelim.
 

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