Pinia 的 Getters 是 Store 内基于 state 派生响应式、带缓存值的计算属性,支持箭头函数(纯派生)、普通函数(可访问其他 getter)和返回函数(参数化)三种写法,只读且不可修改 state。

Pinia 中的 Getters 就是 Store 内的计算属性,用于基于 state 派生出响应式、带缓存的值。它写法简洁,逻辑清晰,且天然支持类型推导(尤其在 TypeScript 中)。
基础写法:用箭头函数接收 state
最常用也最推荐的方式是使用箭头函数,直接接收 state 参数并返回计算结果:
- 无需手动声明返回类型,TypeScript 可自动推导
- 不能访问
this,所以只依赖当前 store 的state - 适合纯派生、无跨 getter 依赖的场景
示例:
getters: {
doubleCount: (state) => state.count * 2,
upperName: (state) => state.name?.toUpperCase() || '',
}进阶写法:用普通函数 + this 访问其他 getter 或整个 store
当需要复用本 store 的其他 getter,或需访问 state 以外的属性(比如 actions 或其他 computed 值)时,改用普通函数,并显式标注返回类型(TS 必须):
- 函数体内可通过
this访问当前 store 实例,包括所有state、getters、actions - TypeScript 下必须写明返回类型(如
doublePlusOne(): number) - JS 用户可用 JSDoc 注释辅助 IDE 补全(如
/** @returns {number} */)
示例:
getters: {
doubleCount: (state) => state.count * 2,
doublePlusOne(): number {
return this.doubleCount + 1 // ✅ 可访问其他 getter
}
}带参数的 getter:返回一个函数
Getter 本身不能直接传参,但可以返回一个接收参数的函数,实现“参数化计算”:
- 适用于根据 ID 查找、条件过滤等动态场景
- 返回的函数仍保持响应式,且内部访问
state是响应式的 - 注意:不要在模板中直接调用(会破坏响应性),应在 setup 中提前调用或封装为计算属性
示例:
getters: {
getItemById: (state) => (id: number) => {
return state.items.find(item => item.id === id)
}
}注意事项与最佳实践
定义时需留意几个关键点,避免常见陷阱:
- Getter 是只读的,不可在其中修改
state(应交由actions处理) - 避免在 getter 中执行副作用(如 API 请求、
console.log),它可能被多次求值或缓存失效 - 复杂逻辑建议抽离到
actions,getter 专注“派生状态” - 命名推荐语义化,如
isCartEmpty、completedItems,而非computedX


















