引言
Vue 應用規模一大,狀態管理就會開始讓人頭痛。Pinia 是 Vue 官方推薦的狀態管理函式庫,設計目標是型別安全、直觀,且不需要 Vuex 那套繁瑣的 mutation 流程。本文涵蓋 Pinia 的核心概念、進階特性與常見實踐,從安裝到插件系統都會走一遍。
什麼是Pinia?
Pinia 是新一代的 Vue 狀態管理函式庫,定位上取代 Vuex。由 Vue 核心團隊成員 Eduardo San Martin Morote 建立,在 Vue 3 中成為官方推薦的狀態管理方案。
Pinia的主要特性:
- 直觀且簡潔的 API
- 完整的 TypeScript 支援
- 支援 Vue 2 和 Vue 3(Pinia v2;v3 起僅支援 Vue 3)
- 極小的套件大小
- 支援多個 Store
- 支援熱模組替換(HMR)
- 支援 Vue DevTools
- 插件系統可擴充
安裝和設置
1 | npm install pinia |
在 Vue 應用中引入 Pinia:
1 | import { createApp } from 'vue' |
Pinia的核心概念
Store
Store 是 Pinia 的核心,包含狀態(state)、getter 和 action。
建立一個基本的 Store:
1 | import { defineStore } from 'pinia' |
組合式API風格的Store
Pinia 也支援組合式 API 風格定義 Store,TypeScript 推斷會更完整:
1 | import { ref, computed } from 'vue' |
在組件中使用Store
1 | <template> |
注意:若要解構 store 裡的響應式屬性,需搭配 storeToRefs,直接解構會失去響應性:
1 | import { storeToRefs } from 'pinia' |
Pinia的高級特性
1. 訂閱狀態變化
1 | const unsubscribe = someStore.$subscribe((mutation, state) => { |
2. 持久化
搭配 pinia-plugin-persistedstate 可以把 store 狀態寫入 localStorage:
1 | import { createPinia } from 'pinia' |
3. 插件系統
Pinia 的插件接收每個 store 實例,可以在初始化時注入屬性或方法:
1 | pinia.use(({ store }) => { |
與Vuex的比較
Pinia 相比 Vuex 的主要差異:
- 不需要 mutation,action 直接修改狀態
- TypeScript 支援更完整,不需要額外的型別包裝
- 不需要嵌套模組,每個 store 獨立
- 套件更輕量
最佳實踐
- 按功能或業務領域拆分 store,避免一個 store 管所有狀態
- 組合式 API 風格對 TypeScript 推斷更友善,大型專案建議優先採用
- 需要跨元件共用的衍生狀態放 getter,副作用放 action
- 善用插件系統處理持久化、logging 等橫切關注點
結論
Pinia 把全域狀態管理的概念直接對齊 Vue 3 的組合式 API,上手成本低、型別推斷完整。對於已經在用 Vue 3 的專案來說,沒有特別理由繼續留在 Vuex。
參考資源
本部落格所有文章除特別聲明外,均採用CC BY-NC-SA 4.0 授權協議。轉載請註明來源 kyosora 筆記!
評論




