开会员与付费前请必须阅读这篇文章,在首页置顶第一篇:(进站必看本站VIP介绍/购买须知)
本站所有源码均为自动秒发货,默认(百度网盘)
本站所有源码均为自动秒发货,默认(百度网盘)
Pinia 是 Vue 官方推荐的状态管理库,也是 Vuex 的继任者(Vuex 5 已被官方搁置,Pinia 成为事实上的新标准)。相比 Vuex(尤其是 Vuex 3/4),Pinia 在设计、使用体验和适配 Vue 3 上都有显著优势,下面我会从新手易懂的角度详细拆解。
一、Pinia 相比 Vuex 的核心优势
1. 更简洁的 API,告别复杂的嵌套结构
Vuex 的核心概念包含
State、Getter、Mutation、Action、Module,其中:- Mutation 必须是同步的,异步逻辑只能写在 Action 里,增加了心智负担;
- Module 嵌套过深时,命名空间、模块注册等逻辑繁琐,新手容易出错。
而 Pinia 彻底简化了这些概念:
- 移除了
Mutation:无论同步 / 异步逻辑,都直接写在actions里; - 没有
Module概念:每个 Store 就是一个独立的模块,无需嵌套,组合使用更灵活; - Getter 用法和 Vue 计算属性几乎一致,学习成本极低。
代码对比(以 Vue 3 + Composition API 为例)
- Vuex 4 写法:
javascript
运行
// store/index.js
import { createStore } from 'vuex'
export default createStore({
state: () => ({ count: 0 }),
mutations: {
// 同步修改必须写在这里
increment(state) {
state.count++
}
},
actions: {
// 异步逻辑写在这里,还要调用 mutation
async incrementAsync({ commit }) {
await new Promise(resolve => setTimeout(resolve, 1000))
commit('increment')
}
},
getters: {
doubleCount: state => state.count * 2
}
})
- Pinia 写法:
javascript
运行
// stores/counter.js
import { defineStore } from 'pinia'
// 一个 Store 就是一个独立模块,无需嵌套
export const useCounterStore = defineStore('counter', {
state: () => ({ count: 0 }),
getters: {
doubleCount: (state) => state.count * 2
},
actions: {
// 同步/异步都写在这里,无需 mutation
increment() {
this.count++
},
async incrementAsync() {
await new Promise(resolve => setTimeout(resolve, 1000))
this.count++
}
}
})
2. 完美适配 Vue 3 的 Composition API
Pinia 从设计之初就为 Vue 3 量身定制:
- 支持解构赋值(无需像 Vuex 那样用
mapState/mapGetters辅助函数); - 结合
<script setup>语法,使用体验极致简洁; - 类型推导更完善,TS 支持零配置(Vuex 需手动写大量类型声明)。
Pinia 在 Vue 3 组件中使用示例:
vue
<script setup>
// 直接导入定义好的 Store
import { useCounterStore } from '@/stores/counter'
const counterStore = useCounterStore()
// 直接访问 state
console.log(counterStore.count)
// 直接调用 actions(同步/异步都可)
const handleAdd = () => counterStore.increment()
const handleAddAsync = () => counterStore.incrementAsync()
</script>
<template>
<div>
<p>计数:{{ counterStore.count }}</p>
<p>双倍计数:{{ counterStore.doubleCount }}</p>
<button @click="handleAdd">同步加1</button>
<button @click="handleAddAsync">异步加1</button>
</div>
</template>
3. 更小的体积 & 更好的性能
- Pinia 体积仅约 1KB(gzip 后),远小于 Vuex;
- 无需像 Vuex 那样手动注册模块,运行时开销更低;
- 对 Vue 3 的响应式系统(Proxy)做了深度优化,状态更新更高效。
4. 无命名空间困扰,组合更灵活
Vuex 的 Module 若不开启命名空间,容易出现命名冲突;开启后又要写
namespaced: true、commit('moduleName/mutationName') 等繁琐代码。Pinia 每个 Store 都是独立的,天然隔离,无需命名空间:
javascript
运行
// 同时使用多个 Store,无冲突
import { useCounterStore } from '@/stores/counter'
import { useUserStore } from '@/stores/user'
const counterStore = useCounterStore()
const userStore = useUserStore()
二、为什么 Vue 3 推荐使用 Pinia?
- 官方背书:Pinia 由 Vue 核心团队维护,是 Vue 官方文档明确推荐的状态管理方案,Vuex 已停止新功能开发;
- 适配 Vue 3 生态:完美兼容 Vue 3 的 Composition API、
<script setup>、TS 类型系统,而 Vuex 是为 Vue 2 设计的,适配 Vue 3 时体验较差; - 降低学习成本:去掉了 Vuex 中冗余的概念(如 Mutation),新手能更快上手,代码也更易维护;
- 未来兼容性:Vue 官方明确表示 Pinia 是状态管理的未来,后续的 Vue 生态升级会优先适配 Pinia。
总结
- API 更简洁:移除 Mutation、简化 Module,同步 / 异步逻辑统一写在 Actions 里,新手易上手;
- 适配 Vue 3 更彻底:完美支持 Composition API 和 TS,体积更小、性能更好;
- 官方推荐 + 未来趋势:Pinia 是 Vue 核心团队维护的官方方案,替代 Vuex 已成定局,学习 Pinia 更符合 Vue 3 生态的发展方向。
简单来说,Pinia 解决了 Vuex 的所有痛点,同时保留了状态管理的核心能力,是 Vue 3 项目状态管理的最优选择。