Skip to content

什么是 Pinia?

Pinia 是 Vue.js 的官方状态管理库。它为 Vue 应用提供了一个集中式的状态存储,让您可以在整个应用中共享状态。

核心特性

🍍 直观易用

Pinia 提供了简洁直观的 API,让状态管理变得简单明了。您无需编写复杂的样板代码,可以专注于业务逻辑的实现。

🔒 类型安全

完整的 TypeScript 支持,提供出色的类型推断和自动补全体验。即使在 JavaScript 项目中,您也能享受到类型提示的便利。

🛠️ 开发工具支持

强大的 Vue DevTools 支持,包括:

  • 时间旅行调试
  • 热重载
  • 状态快照
  • 动作追踪

🔧 可扩展

通过插件系统扩展 Pinia 功能,满足各种复杂需求:

  • 状态持久化
  • 数据同步
  • 中间件支持

📦 模块化

每个 store 都是独立的模块,支持:

  • 代码分割
  • 懒加载
  • 树摇优化

🪶 轻量级

压缩后仅约 1.5KB,对应用性能影响极小。

与 Vuex 的对比

特性PiniaVuex
API 复杂度简单直观相对复杂
TypeScript 支持原生支持需要额外配置
模块化天然支持需要命名空间
代码分割自动支持手动配置
组合式 API完美集成需要辅助函数
包大小~1.5KB~2.5KB

何时使用 Pinia?

您应该考虑使用 Pinia 当:

多个组件需要共享状态

javascript
// 用户信息需要在多个页面显示
const userStore = useUserStore()

状态逻辑变得复杂

javascript
// 复杂的购物车逻辑
const cartStore = useCartStore()
cartStore.addItem(product)
cartStore.applyDiscount(coupon)

需要持久化状态

javascript
// 用户偏好设置
const settingsStore = useSettingsStore()
// 自动保存到 localStorage

构建大型应用

javascript
// 模块化的状态管理
import { useAuthStore } from '@/stores/auth'
import { useProductStore } from '@/stores/product'

基本概念

Store(存储)

Store 是一个保存状态和业务逻辑的实体,类似于组件,但可以在整个应用中访问。

State(状态)

State 是 store 的核心,包含应用的数据。

javascript
state: () => ({
  user: null,
  isLoggedIn: false,
  preferences: {}
})

Getters(获取器)

Getters 是 store 的计算属性,用于派生状态。

javascript
getters: {
  fullName: (state) => `${state.user.firstName} ${state.user.lastName}`,
  isAdmin: (state) => state.user?.role === 'admin'
}

Actions(动作)

Actions 用于修改状态,可以包含异步逻辑。

javascript
actions: {
  async login(credentials) {
    const user = await api.login(credentials)
    this.user = user
    this.isLoggedIn = true
  }
}

简单示例

让我们看一个简单的计数器示例:

javascript
// stores/counter.js
import { defineStore } from 'pinia'

export const useCounterStore = defineStore('counter', {
  // 状态
  state: () => ({
    count: 0,
    name: 'Eduardo'
  }),
  
  // 获取器
  getters: {
    doubleCount: (state) => state.count * 2
  },
  
  // 动作
  actions: {
    increment() {
      this.count++
    },
    
    async fetchUserData() {
      // 异步操作
      const userData = await api.getUser()
      this.name = userData.name
    }
  }
})

在组件中使用:

vue
<template>
  <div>
    <p>{{ counter.name }}: {{ counter.count }}</p>
    <p>双倍: {{ counter.doubleCount }}</p>
    <button @click="counter.increment()">+1</button>
  </div>
</template>

<script setup>
import { useCounterStore } from '@/stores/counter'

const counter = useCounterStore()
</script>

下一步

现在您已经了解了 Pinia 的基本概念,让我们继续学习:

准备好深入了解 Pinia 了吗?让我们开始吧!🚀

Released under the MIT License.