Skip to content

Pinia

v2.x
TypeScript

概述

Pinia 是 Vue 3 官方推荐的状态管理库,是 Vuex 的继任者。它提供了更简洁的 API、完整的 TypeScript 支持和开发工具集成。

何时使用 Pinia?

并非所有状态都需要 Pinia。遵循以下原则:

场景推荐方案
组件内部状态ref() / reactive()
父子组件共享props / emit / provide / inject
服务端数据缓存TanStack Query (composables)
只在组件树中共享Composables
需要在非组件环境访问Pinia
全局共享 + DevToolsPinia

必须使用 Pinia 的场景

用户认证状态

认证状态需要在路由守卫、HTTP 拦截器等非组件环境中访问,必须使用 Pinia:

stores/auth.ts

在非组件环境使用

api/client.ts
router/index.ts

Store 定义方式

Setup Store(推荐)

Composition API 风格

Options Store

Options API 风格

在组件中使用

使用 Store
解构响应式

直接解构 store 会丢失响应式,必须使用 storeToRefs()

typescript
// ❌ 丢失响应式
const { user, isAuthenticated } = authStore

// ✅ 保持响应式
const { user, isAuthenticated } = storeToRefs(authStore)

状态持久化

使用 VueUse 的 useStorage 实现持久化:

持久化状态

组合多个 Store

Store 组合

最佳实践

Pinia 使用建议
  1. 最小化使用:能用 composables/TanStack Query 就不用 Pinia
  2. 合理拆分:每个 store 只负责一个领域
  3. 持久化:需要持久化的状态使用 useStorage
  4. 类型安全:使用 TypeScript,定义好所有类型
  5. 命名规范:store 名称使用 use[Feature]Store

不推荐使用 Pinia 的场景

场景替代方案
服务器数据缓存TanStack Query
只在几个组件间共享的状态Composables
表单状态TanStack Form
临时 UI 状态(弹窗开关等)组件本地 ref
使用 Composable 替代

相关资源

Released under the MIT License.