当前位置: 首页 > news >正文

《Vue3 从入门到大神12篇》组件通信全景图(下)—— Vuex 到 Pinia 的华丽转身

前言

在前一篇文章中,我们明确了:

Event Bus 已死,Props / Emit / Provide-Inject 各有边界。

但还有一个问题没有解决:

❓ 真正的全局状态应该放在哪里?

Vue2 时代,答案是Vuex

Vue3 时代,官方给出的答案是:

Pinia

这一篇,我们就来讲清楚:

  • Pinia 到底是什么?

  • 它如何取代 Vuex?

  • State / Getter / Action 怎么用?

  • 为什么它更适合 Composition API?


一、Vuex 的历史地位与痛点

1️⃣ Vuex 解决了什么问题?

✅ 集中式状态管理

✅ 可预测的数据流

✅ DevTools 支持


2️⃣ 但 Vuex 也有明显痛点

痛点

说明

概念太多

State / Getter / Mutation / Action

修改状态繁琐

必须 commit mutation

TypeScript 支持差

类型推导极其痛苦

代码冗长

一个简单的状态改动要写很多样板代码

📌一句话总结

Vuex 是为 Vue2 设计的,不是为 Composition API 设计的。


二、Pinia 是什么?

官方定义:

Pinia 是 Vue 的官方状态管理库,是 Vuex 的继任者。

它的设计目标非常明确:

  • ✅ 更简单

  • ✅ 更直观

  • ✅ 更好的 TypeScript 支持

  • ✅ 更贴合 Composition API


三、Pinia 核心概念(State / Getter / Action)

1️⃣ 定义一个 Store

// stores/user.ts import { defineStore } from 'pinia' export const useUserStore = defineStore('user', { state: () => ({ name: 'Tom', age: 18 }), getters: { doubleAge: (state) => state.age * 2 }, actions: { growUp() { this.age++ } } })

📌对比 Vuex

  • ❌ 没有 mutation

  • ✅ 只有 state / getter / action


四、在组件中使用 Pinia

1️⃣ 安装 Pinia

// main.ts import { createApp } from 'vue' import { createPinia } from 'pinia' import App from './App.vue' createApp(App) .use(createPinia()) .mount('#app')

2️⃣ 使用 Store

<script setup lang="ts"> import { useUserStore } from '@/stores/user' const userStore = useUserStore() </script> <template> <div> <p>{{ userStore.name }}</p> <p>{{ userStore.doubleAge }}</p> <button @click="userStore.growUp">长大</button> </div> </template>

像使用普通对象一样使用状态


五、为什么 Pinia 能取代 Vuex?

1️⃣ 去掉了 Mutation

Vuex:

commit('increment')

Pinia:

store.increment()

📌结论

Mutation 是冗余设计。


2️⃣ 天然支持 TypeScript

const store = useUserStore() store.age // ✅ 类型提示

Vuex 需要:

(this as any).$store.state.user.age

3️⃣ 与 Composition API 完美融合

export function useUser() { const store = useUserStore() return { ...store } }

Pinia 本身就是 Composable 风格


六、Pinia 的响应式与解构

❌ 错误用法

const { name } = userStore

👉 会失去响应式


✅ 正确用法

import { storeToRefs } from 'pinia' const { name } = storeToRefs(userStore)

七、Pinia 的高级能力

1️⃣ 模块化(天生支持)

stores/ ├── user.ts ├── cart.ts └── product.ts

无需 namespace


2️⃣ 组合式写法(推荐 ✅)

export const useUserStore = defineStore('user', () => { const name = ref('Tom') const age = ref(18) const doubleAge = computed(() => age.value * 2) const growUp = () => age.value++ return { name, age, doubleAge, growUp } })

📌这是 Pinia 的终极形态。


八、Pinia vs Vuex 对比总结

对比项

Vuex

Pinia

Mutation

TypeScript

Composition API

代码量

学习成本


九、面试高频问答

Q1:Pinia 为什么去掉 Mutation?

因为 Mutation 增加了不必要的复杂度。

Q2:Pinia 和 Vuex 能共存吗?

可以,但不推荐。

Q3:Pinia 是全局状态还是局部状态?

全局状态,但可按模块拆分。


十、总结

  • Vuex 已完成历史使命

  • Pinia 是 Vue3 状态管理的唯一官方答案

  • 更简洁、更类型安全、更 Composable

  • 新项目100% 使用 Pinia


📢 下期预告

👉第 13 篇:插槽(Slots)完全指南 —— 从匿名插槽到作用域插槽

http://www.jsqmd.com/news/1072329/

相关文章:

  • 丹东黄金白银回收铂金旧金回收无套路门店 TOP 榜单 实地测评资料整理
  • 降价也卖不动的合资燃油车开始主动撤出门店-2026.6.23
  • AI建站工具从入门到上线:一篇搞懂智能对话式建站全流程
  • SQL注入漏洞批量挖掘实战:从原理到自动化检测脚本编写
  • GPT-5.6 Agent安全实战:提示注入攻防SOP与企业权限治理手册
  • 2026保姆级教程:word压缩图片大小方法,多种途径压缩word文件大小
  • AI产业陷入光纤荒:需求暴增、扩产困难,中国光纤产业成大赢家!
  • Spring AI 2.x 深度技术解析:从架构重构到企业级落地
  • 现代农业类企业申报高企
  • ComfyUI Reactor Node完整指南:快速AI换脸技术的终极解决方案
  • 基于 C++ 实现的(控制台)考试系统
  • 【MATLAB】多障碍物环境无人机动态避障实现
  • MedLab-EPPM 电子压痛仪
  • 数据湖新范式:火山引擎基于 Lance 的多模态数据湖落地实践
  • 2026免费去水印工具推荐:无广告安全导出,网页/APP/电脑端全覆盖
  • 干细胞,真能改写健康认知吗?
  • 简单理解:清零为什么多此一举加取反
  • Meta 员工跟踪计划因安全漏洞暂停,内部数据收集引隐私担忧
  • Ultralytics:解读DWConv模块
  • 【2026最新版】超详细Metasploit安装保姆级教程,Wireshark抓包(网络分析),收藏这一篇就够了
  • 先导02:SECS\-I 串口 \+ HSMS 以太网完整通信底层原理
  • NeuN:神经元特异性核蛋白的多维生物学特性及其在神经科学研究中的关键作用
  • Gaussian-Splatting-SLAM 结合前沿高斯泼溅与slam,这一篇我有时间会复现一下
  • 抚顺黄金白银回收铂金旧金回收无套路门店 TOP 榜单 实地测评资料整理
  • UNiTY疑难杂症
  • 如何三步彻底解决C盘爆红问题:Windows Cleaner实战指南
  • 先导01:SEMI 行业标准体系总览 E4/E5/E37/E87/E40/E94 完整拆解
  • 武汉全屋定制秘籍:转角柜这样设计,衣柜收纳空间大提升!
  • Google研究:对话式医疗系统AMIE升级,管理推理能力不劣于人类医生!
  • 鸿蒙 Next 小众爱好图鉴 App 开发实战:兴趣发现 + 分类系统 + 收藏管理