Heim > Web-Frontend > js-Tutorial > Hauptteil

Vue-Reaktivität mit Pinia Stores verstehen

Barbara Streisand
Freigeben: 2024-11-20 15:51:14
Original
564 Leute haben es durchsucht

Understanding Vue Reactivity with Pinia Stores

An meinem Arbeitsplatz wurde ich damit beauftragt, einen simulierten Chat-Store für interne lokale Entwicklungsarbeit zu erstellen, und während ich das tat, machte ich mir ein paar Notizen über Vue (ich hatte einige Erfahrung, aber nicht mit Haken), Das sind also nur meine Obsidian-Notizen, ich hoffe, sie sind nützlich für Sie :)

Inhaltsverzeichnis

  1. Ref- und reaktive Referenzen
  2. Beobachtung und Reaktionsfähigkeit
  3. Pinia Store-Integration
  4. Praxisbeispiele
  5. Best Practices
  6. Häufige Fallstricke

Ref- und reaktive Referenzen

Was ist Ref?

ref ist Vues Art, primitive Werte reaktiv zu machen. Es verpackt den Wert in ein reaktives Objekt mit einer .value-Eigenschaft.

import { ref } from 'vue'

// Inside Pinia Store
export const useMyStore = defineStore('my-store', () => {
  // Creates a reactive reference
  const count = ref<number>(0)

  // To access or modify:
  function increment() {
    count.value++  // Need .value for refs
  }

  return {
    count,  // When exposed, components can use it without .value
    increment
  }
})
Nach dem Login kopieren

Arten von Refs in Geschäften

// Simple ref
const isLoading = ref<boolean>(false)

// Array ref
const messages = ref<Message[]>([])

// Complex object ref
const currentUser = ref<User | null>(null)

// Ref with undefined
const selectedId = ref<string | undefined>(undefined)
Nach dem Login kopieren

Beobachtung und Reaktionsfähigkeit

Grundlegende Verwendung der Uhr

import { watch, ref } from 'vue'

export const useMyStore = defineStore('my-store', () => {
  const messages = ref<Message[]>([])

  // Simple watch
  watch(messages, (newMessages, oldMessages) => {
    console.log('Messages changed:', newMessages)
  })
})
Nach dem Login kopieren

Watch-Optionen

// Immediate execution
watch(messages, (newMessages) => {
  // This runs immediately and on changes
}, { immediate: true })

// Deep watching
watch(messages, (newMessages) => {
  // Detects deep object changes
}, { deep: true })

// Multiple sources
watch(
  [messages, selectedId], 
  ([newMessages, newId], [oldMessages, oldId]) => {
    // Triggers when either changes
  }
)
Nach dem Login kopieren

Pinia Store-Integration

Shop-Struktur mit Refs

export const useMyStore = defineStore('my-store', () => {
  // State
  const items = ref<Item[]>([])
  const isLoading = ref(false)
  const error = ref<Error | null>(null)

  // Computed
  const itemCount = computed(() => items.value.length)

  // Actions
  const fetchItems = async () => {
    isLoading.value = true
    try {
      items.value = await api.getItems()
    } catch (e) {
      error.value = e as Error
    } finally {
      isLoading.value = false
    }
  }

  return {
    items,
    isLoading,
    error,
    itemCount,
    fetchItems
  }
})
Nach dem Login kopieren

Zusammenstellen von Geschäften

export const useMainStore = defineStore('main-store', () => {
  // Using another store
  const otherStore = useOtherStore()

  // Watching other store's state
  watch(
    () => otherStore.someState,
    (newValue) => {
      // React to other store's changes
    }
  )
})
Nach dem Login kopieren

Praxisbeispiele

Implementierung der automatischen Aktualisierung

export const useChatStore = defineStore('chat-store', () => {
  const messages = ref<Message[]>([])
  const refreshInterval = ref<number | null>(null)
  const isRefreshing = ref(false)

  // Watch for auto-refresh state
  watch(isRefreshing, (shouldRefresh) => {
    if (shouldRefresh) {
      startAutoRefresh()
    } else {
      stopAutoRefresh()
    }
  })

  const startAutoRefresh = () => {
    refreshInterval.value = window.setInterval(() => {
      fetchNewMessages()
    }, 5000)
  }

  const stopAutoRefresh = () => {
    if (refreshInterval.value) {
      clearInterval(refreshInterval.value)
      refreshInterval.value = null
    }
  }

  return {
    messages,
    isRefreshing,
    startAutoRefresh,
    stopAutoRefresh
  }
})
Nach dem Login kopieren

Ladezustandsverwaltung

export const useDataStore = defineStore('data-store', () => {
  const data = ref<Data[]>([])
  const isLoading = ref(false)
  const error = ref<Error | null>(null)

  // Watch loading state for side effects
  watch(isLoading, (loading) => {
    if (loading) {
      // Show loading indicator
    } else {
      // Hide loading indicator
    }
  })

  // Watch for errors
  watch(error, (newError) => {
    if (newError) {
      // Handle error (show notification, etc.)
    }
  })
})
Nach dem Login kopieren

Best Practices

1. Ref-Initialisierung

// ❌ Bad
const data = ref()  // Type is 'any'

// ✅ Good
const data = ref<string[]>([])  // Explicitly typed
Nach dem Login kopieren

2. Sehen Sie sich „Aufräumen“ an

// ❌ Bad - No cleanup
watch(source, () => {
  const timer = setInterval(() => {}, 1000)
})

// ✅ Good - With cleanup
watch(source, () => {
  const timer = setInterval(() => {}, 1000)
  return () => clearInterval(timer)  // Cleanup function
})
Nach dem Login kopieren

3. Berechnet vs. beobachten

// ❌ Bad - Using watch for derived state
watch(items, (newItems) => {
  itemCount.value = newItems.length
})

// ✅ Good - Using computed for derived state
const itemCount = computed(() => items.value.length)
Nach dem Login kopieren

4. Filialorganisation

// ✅ Good store organization
export const useStore = defineStore('store', () => {
  // State refs
  const data = ref<Data[]>([])
  const isLoading = ref(false)

  // Computed properties
  const isEmpty = computed(() => data.value.length === 0)

  // Watchers
  watch(data, () => {
    // Handle data changes
  })

  // Actions
  const fetchData = async () => {
    // Implementation
  }

  // Return public interface
  return {
    data,
    isLoading,
    isEmpty,
    fetchData
  }
})
Nach dem Login kopieren

Häufige Fallstricke

  1. Wert vergessen
// ❌ Bad
const count = ref(0)
count++ // Won't work

// ✅ Good
count.value++
Nach dem Login kopieren
  1. Timing ansehen
// ❌ Bad - Might miss initial state
watch(source, () => {})

// ✅ Good - Catches initial state
watch(source, () => {}, { immediate: true })
Nach dem Login kopieren
  1. Speicherlecks
// ❌ Bad - No cleanup
const store = useStore()
setInterval(() => {
  store.refresh()
}, 1000)

// ✅ Good - With cleanup
const intervalId = setInterval(() => {
  store.refresh()
}, 1000)
onBeforeUnmount(() => clearInterval(intervalId))
Nach dem Login kopieren

Denken Sie daran: Denken Sie bei der Arbeit mit Referenzen und Uhren in Pinia-Geschäften

immer an Sauberkeit, Typsicherheit und ordnungsgemäße Organisation

Das obige ist der detaillierte Inhalt vonVue-Reaktivität mit Pinia Stores verstehen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage