首页
/ Pinia核心概念:定义与使用Store详解

Pinia核心概念:定义与使用Store详解

2025-07-06 02:27:32作者:邬祺芯Juliet

什么是Pinia Store

Pinia作为Vue的官方状态管理库,其核心概念之一就是Store(存储)。Store可以理解为一个集中管理应用状态的容器,它包含了应用的状态(state)、计算属性(getters)和修改状态的方法(actions)。与Vue组件不同,Store可以在多个组件间共享状态。

定义Store的基本方式

在Pinia中,我们使用defineStore()函数来定义一个Store。这个函数需要两个主要参数:

  1. 一个唯一的Store名称(ID)
  2. 定义Store内容的配置对象或Setup函数
import { defineStore } from 'pinia'

export const useCounterStore = defineStore('counter', {
  // Store配置项
})

最佳实践是将返回的函数命名为useXxxStore形式,这符合Vue组合式API的命名约定。

两种定义Store的语法

Pinia提供了两种定义Store的方式,类似于Vue的Options API和Composition API。

1. Options Store(选项式Store)

这种方式与Vue的Options API非常相似,适合习惯Vue 2.x风格的开发者:

export const useCounterStore = defineStore('counter', {
  state: () => ({
    count: 0,
    name: 'Eduardo'
  }),
  getters: {
    doubleCount: (state) => state.count * 2
  },
  actions: {
    increment() {
      this.count++
    }
  }
})
  • state:相当于组件中的data,存储状态数据
  • getters:相当于计算属性,基于state派生新数据
  • actions:相当于方法,用于修改state

2. Setup Store(组合式Store)

这种方式使用组合式API风格,适合熟悉Vue 3 Composition API的开发者:

export const useCounterStore = defineStore('counter', () => {
  const count = ref(0)
  const name = ref('Eduardo')
  const doubleCount = computed(() => count.value * 2)
  
  function increment() {
    count.value++
  }

  return { count, name, doubleCount, increment }
})

在这种方式中:

  • ref()定义的变量成为state属性
  • computed()定义的变量成为getters
  • 普通函数成为actions

两种语法的比较与选择

特性 Options Store Setup Store
学习曲线 较低,适合Vue 2迁移 较高,需要熟悉Composition API
灵活性 一般 更高,可以使用所有Composition API特性
SSR支持 完整支持 需要额外注意返回所有state
代码组织 按选项分类 按逻辑组织

选择哪种语法取决于团队偏好和项目需求。对于新项目,Setup Store可能更灵活;对于已有Vue 2项目迁移,Options Store可能更平滑。

使用Store的最佳实践

在组件中使用Store非常简单:

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

const store = useCounterStore()
</script>

重要注意事项:

  1. Store是响应式的,但直接解构会破坏响应性
  2. 使用storeToRefs()可以安全解构state和getters
  3. Actions可以直接从store解构,因为它们绑定在store实例上
<script setup>
import { storeToRefs } from 'pinia'
import { useCounterStore } from '@/stores/counter'

const store = useCounterStore()
const { count, doubleCount } = storeToRefs(store) // 保持响应性
const { increment } = store // 直接解构action
</script>

高级技巧

在Setup Store中,你可以利用Vue的依赖注入系统访问全局属性:

import { inject } from 'vue'
import { useRoute } from 'vue-router'

export const useSearchStore = defineStore('search', () => {
  const route = useRoute()
  const appProvided = inject('appProvided')
  
  // ...
})

总结

Pinia提供了灵活多样的Store定义方式,无论是Options语法还是Setup语法,都能有效地管理应用状态。理解这两种方式的区别和适用场景,将帮助你在项目中做出更合理的选择。记住,Store的核心目标是提供可预测的状态管理,同时保持代码的清晰和可维护性。