Pinia 状态管理

中等 🟡Vue 生态
4 个标签
预计阅读时间:4 分钟
VuePinia状态管理Store

Pinia 状态管理

Pinia 是 Vue 3 官方推荐的状态管理库,替代了 Vuex,提供了更简洁的 API 和更好的 TypeScript 支持。

Pinia 简介

Pinia 与 Vuex 的区别:

更简洁的 API,无需 mutations
更好的 TypeScript 支持
支持组合式 API
更小的包体积
更灵活的存储结构

安装:

npm install pinia
Vue 3:app.use(createPinia()):Vue 3使用createPinia()创建Pinia实例,通过app.use()方法注册到Vue应用,Pinia是Vue 3官方推荐的状态管理库,提供了更简洁的API、更好的TypeScript支持、模块化状态管理、自动订阅等特性,是Vue 3项目状态管理的首选
Vue 2:需要 @vue/composition-api:Vue 2使用Pinia需要安装@vue/composition-api插件来支持Composition API,配置后可以在Vue 2项目中使用createPinia()创建状态存储,@vue/composition-api是Vue 2使用Composition API的官方适配器,使得Vue 2也可以享受Composition API带来的代码组织优势

基本使用

创建 Store:

defineStore() 函数
第一个参数是 store 的唯一 ID
第二个参数是 store 的配置

State:

定义初始状态
可以是函数或对象
响应式数据

Getters:

计算属性
自动缓存
可以访问其他 getters

Actions:

异步操作
可以提交状态更改
可以访问其他 actions

Store 配置

State 定义:

javascriptCode
export const useCounterStore = defineStore('counter', {
  state: () => ({
    count: 0,
    name: 'Pinia'
  }),
  getters: {
    doubleCount: (state) => state.count * 2,
    doubleCountPlusOne: (state, getters) => getters.doubleCount + 1
  },
  actions: {
    increment() {
      this.count++
    },
    async incrementAsync() {
      await new Promise(resolve => setTimeout(resolve, 1000))
      this.count++
    }
  }
})

组件中使用:

javascriptCode
import { useCounterStore } from '@/stores/counter'

export default {
  setup() {
    const store = useCounterStore()
    
    return {
      store,
      increment: () => store.increment()
    }
  }
}

高级特性

模块化:

按功能创建多个 store
模块之间可以相互访问
更好的代码组织

持久化:

pinia-plugin-persistedstate
自动保存到 localStorage
支持自定义存储

插件系统:

扩展 Pinia 功能
自定义插件
官方插件生态

调试:

Vue DevTools 支持:Vue DevTools是Vue官方浏览器扩展,提供组件树检查、组件状态查看、Vuex状态管理、时间旅行调试等功能,可以直观地查看组件层级、数据状态、事件流,是Vue开发调试的必备工具,支持Vue 2和Vue 3,在Chrome和Firefox商店可以安装
时间旅行
状态快照

最佳实践

按功能划分 store
使用 TypeScript 类型
合理使用 actions 处理异步
避免直接修改 state
测试 store 逻辑
性能优化策略