Episode ini membedah cara mengelola state Pinia: akses langsung, update multi-field dengan $patch, reset memakai $reset, hingga destructuring reaktif dengan storeToRefs. Kalian juga memahami perbedaan destructuring biasa yang mematikan reactivity versus storeToRefs yang menjaganya tetap hidup.

State adalah jantung sebuah store — sumber kebenaran yang dibaca oleh getters, diubah oleh actions, dan dirender oleh komponen. Setelah memahami anatomi store, kini saatnya memahami seluruh cara berinteraksi dengan state: membaca, mengubah, mereset, dan mengambilnya ke komponen tanpa kehilangan reactivity.
Episode 5 membedah empat API utama pengelolaan state Pinia: akses langsung, $patch, $reset, dan storeToRefs. Kesalahan paling umum di dunia Pinia — destructuring biasa yang membuat UI tidak pernah terupdate — akan kita bedah tuntas di sini.
Cara paling sederhana untuk membaca dan menulis state adalah lewat instance store:
import { useCounterStore } from '@/stores/counter'
const store = useCounterStore()
console.log(store.count)
store.count = 10Karena store dibungkus reactive, store.count = 10 langsung memicu pembaruan di komponen mana pun yang membaca store.count. Untuk satu assignment sederhana, pola ini adalah yang paling jernih.
Saat kalian perlu mengubah beberapa field sekaligus, store.$patch lebih efisien daripada banyak assignment terpisah. Ada dua bentuk: object dan function:
store.$patch({ count: 5, title: 'Lima' })
store.$patch((state) => {
state.items.push({ id: 3, name: 'Baru' })
state.count++
})Bentuk object store.$patch({ count: 5 }) cocok untuk assignment sederhana. Bentuk function store.$patch((state) => ...) diperlukan untuk operasi seperti push ke array yang sulit ditulis sebagai object literal.
Untuk mengembalikan state ke nilai inisial, gunakan $reset():
store.$reset()store.$reset() mengembalikan seluruh state ke nilai awal yang didefinisikan di state. Sangat berguna untuk tombol "reset form" atau sebelum sebuah test dimulai. Catatan: $reset hanya tersedia di Options store, karena Setup store tidak punya definisi state tunggal.
Ini bagian yang paling sering salah dipahami. Destructuring biasa akan melepas koneksi reactivity:
// SALAH: reactivity hilang, UI tidak pernah update
const { count } = useCounterStore()
count++
// BENAR: tetap reaktif
import { storeToRefs } from 'pinia'
const { count } = storeToRefs(useCounterStore())
count.value++const { count } = storeToRefs(useCounterStore()) menghasilkan ref, sehingga saat di template kalian menulis count (auto-unwrap), dan di kode menulis count.value. Destructuring biasa menyalin nilai saat itu juga — mengubahnya tidak akan pernah sampai ke store.
Warning
Ingat: storeToRefs hanya memetakan state dan getters. Actions adalah fungsi biasa dan tetap bisa di-destructure langsung, misalnya const { increment } = store.
Sebagai panduan cepat:
store.count langsung.storeToRefs(store).$patch.$reset() (Options store).import { useCounterStore } from '@/stores/counter'
import { storeToRefs } from 'pinia'
const store = useCounterStore()
const { count, double } = storeToRefs(store)
const { increment } = storeconst { increment } = store aman untuk action karena action tidak reaktif — dia tetap terikat ke store yang sama. Gabungan dua baris destructuring ini adalah pola paling umum di project Pinia.
Episode 5 menutup fondasi state Pinia. Kalian sekarang bisa membaca dan mengubah state secara langsung, melakukan update multi-field dengan $patch, mereset dengan $reset, dan melakukan destructuring reaktif dengan storeToRefs tanpa jebakan reactivity.
Inti yang harus dibawa pulang:
store.count tetap reaktif.$patch untuk update banyak field sekaligus.$patch bentuk function untuk operasi array.$reset() mengembalikan state ke nilai awal.storeToRefs.storeToRefs hanya memetakan state dan getters, bukan actions.Di episode 6 selanjutnya kita akan membahas getters — computed properties milik store untuk derived state, termasuk mengakses state store lain, getter dengan parameter yang mengembalikan function, dan perilaku memoization yang wajib dipahami. Ini akan membuat template kalian jauh lebih bersih.