# 状态管理 ## Pinia基础 ### 安装Pinia ```bash npm install pinia ``` ### 创建Store ```javascript // stores/counter.js import { defineStore } from 'pinia' import { ref, computed } from 'vue' export const useCounterStore = defineStore('counter', () => { // state const count = ref(0) // getters const doubleCount = computed(() => count.value * 2) // actions function increment() { count.value++ } function decrement() { count.value-- } async function fetchCount() { // 异步操作 const response = await fetch('/api/count') const data = await response.json() count.value = data.count } return { count, doubleCount, increment, decrement, fetchCount } }) ``` ### 使用Store ```vue ``` ## 解构Store ### storeToRefs ```vue ``` ## 持久化 ### 安装插件 ```bash npm install pinia-plugin-persistedstate ``` ### 配置持久化 ```javascript // stores/index.js import { createPinia } from 'pinia' import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' const pinia = createPinia() pinia.use(piniaPluginPersistedstate) export default pinia ``` ### 使用持久化 ```javascript // stores/user.js import { defineStore } from 'pinia' import { ref } from 'vue' export const useUserStore = defineStore('user', () => { const token = ref('') const userInfo = ref(null) function setToken(newToken) { token.value = newToken } function setUserInfo(info) { userInfo.value = info } function logout() { token.value = '' userInfo.value = null } return { token, userInfo, setToken, setUserInfo, logout } }, { persist: { key: 'my-user-store', storage: localStorage, paths: ['token', 'userInfo'] } }) ``` ## 组合多个Store ```javascript // stores/index.js import { useCounterStore } from './counter' import { useUserStore } from './user' export function useRootStore() { const counter = useCounterStore() const user = useUserStore() function resetAll() { counter.$reset() user.$reset() } return { counter, user, resetAll } } ``` ## 订阅状态变化 ```vue ``` ## 插件开发 ```javascript // plugins/piniaLogger.js export function piniaLogger({ store }) { store.$onAction(({ name, args, after, onError }) => { console.log(`[${store.$id}] ${name} 开始`, args) after((result) => { console.log(`[${store.$id}] ${name} 完成`, result) }) onError((error) => { console.error(`[${store.$id}] ${name} 失败`, error) }) }) } // 使用插件 const pinia = createPinia() pinia.use(piniaLogger) ```