概要
Vue 3 の新しい状態管理ライブラリ Pinia の使い方について簡単に紹介します。
インストール
まずはcreatePinia
を呼び出します。
その前にuseUserStore
などの個別のストアを呼び出してはいけません。
import { useUserStore } from '@/stores/user'
import { createApp } from 'vue'
import App from './App.vue'
const app = createApp(App)
const pinia = createPinia()
app.use(pinia)
const store = useUserStore()
ストアの作成
Pinia
を読み込んだら、ストアを作成します。
簡単なストアの例を以下に示します。
状態count
とその値を更新させるincrement
を定義しています。
defineStore
の第一引数にはストアの名前を渡します。
これはストア全体でユニークなものである必要があります。
export const useStore = defineStore('count', {
state: () => ({ count: 0 }),
actions: {
increment(amount) { this.count = this.count + amount }
}
}
ストアを使うにはコンポーネントのsetup
で呼び出します。
値を分割代入して使いたい場合はstoreToRefs
でストアをラップします。
ラップしないと値がリアクティブでなくなります。
import { useStore } from '@/stores/count'
import { storeToRefs } from 'pinia'
export default {
setup() {
const store = useStore()
const { count } = storeToRefs(store)
return { store }
},
}
ステート
ストアの値は直接読みだすことができます。
そのまま書き換えることも可能です。
const store = useStore()
store.count = 100
ゲッター
ゲッターはdefineStore
の引数のgetters
プロパティ内に定義します。
用途としてはコンポーネントのcomputed
のような使い方をします。
export const useStore = defineStore('count', {
state: () => ({ count: 0 }),
getters: {
doubleCount: (state) => state.count * 2,
},
})
アクション
コンポーネントのmethods
に相当するのがアクションです。
defineStore
のactions
プロパティに定義します。
アプリケーションのビジネスロジックを書く場所として最適です。
export const useStore = defineStore('count', {
state: () => ({ count: 0 }),
actions: {
increment(amount) { this.count = this.count + amount }
},
})
アクションの呼び出しはメソッドのように簡単にできます。
import { useStore } from '@/stores/count'
import { storeToRefs } from 'pinia'
export default {
setup() {
const store = useStore()
store.increment(100)
return { store }
},
}