Memahami Kereaktifan Vue dengan Pinia Stores

Barbara Streisand
Lepaskan: 2024-11-20 15:51:14
asal
564 orang telah melayarinya

Understanding Vue Reactivity with Pinia Stores

Di tempat kerja saya, saya ditugaskan untuk mencipta kedai sembang olok-olok untuk kerja pembangun tempatan dalaman, dan semasa berbuat demikian saya membuat sedikit nota tentang Vue (saya mempunyai sedikit pengalaman, tetapi tidak dengan cangkuk), Jadi ini hanyalah nota obsidian saya, saya harap ia berguna untuk anda :)

Jadual Kandungan

  1. Rujukan dan Rujukan Reaktif
  2. Tonton dan Kereaktifan
  3. Integrasi Kedai Pinia
  4. Contoh Praktikal
  5. Amalan Terbaik
  6. Gotcha Biasa

Rujukan dan Rujukan Reaktif

Apa itu Ref?

ref ialah cara Vue menjadikan nilai primitif reaktif. Ia membungkus nilai dalam objek reaktif dengan sifat .value.

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
  }
})
Salin selepas log masuk

Jenis Rujukan di Kedai

// 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)
Salin selepas log masuk

Tonton dan Kereaktifan

Penggunaan Jam Tangan Asas

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)
  })
})
Salin selepas log masuk

Pilihan Tontonan

// 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
  }
)
Salin selepas log masuk

Integrasi Kedai Pinia

Struktur Stor dengan Ruj

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
  }
})
Salin selepas log masuk

Kedai Mengarang

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
    }
  )
})
Salin selepas log masuk

Contoh Praktikal

Autorefresh Pelaksanaan

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
  }
})
Salin selepas log masuk

Memuatkan Pengurusan Negeri

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.)
    }
  })
})
Salin selepas log masuk

Amalan Terbaik

1. Ref Permulaan

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

// ✅ Good
const data = ref<string[]>([])  // Explicitly typed
Salin selepas log masuk

2. Pembersihan Tontonan

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

// ✅ Good - With cleanup
watch(source, () => {
  const timer = setInterval(() => {}, 1000)
  return () => clearInterval(timer)  // Cleanup function
})
Salin selepas log masuk

3. Dikira lwn Watch

// ❌ 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)
Salin selepas log masuk

4. Organisasi Stor

// ✅ 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
  }
})
Salin selepas log masuk

Gotcha biasa

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

// ✅ Good
count.value++
Salin selepas log masuk
  1. Masa Tonton
// ❌ Bad - Might miss initial state
watch(source, () => {})

// ✅ Good - Catches initial state
watch(source, () => {}, { immediate: true })
Salin selepas log masuk
  1. Memori Bocor
// ❌ Bad - No cleanup
const store = useStore()
setInterval(() => {
  store.refresh()
}, 1000)

// ✅ Good - With cleanup
const intervalId = setInterval(() => {
  store.refresh()
}, 1000)
onBeforeUnmount(() => clearInterval(intervalId))
Salin selepas log masuk

Ingat: Sentiasa pertimbangkan pembersihan, keselamatan jenis dan penyusunan yang betul apabila bekerja dengan rujukan dan jam tangan di kedai Pinia

Atas ialah kandungan terperinci Memahami Kereaktifan Vue dengan Pinia Stores. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan