Vue中Pinia和Vuex有什么区别该用哪个

发布时间:2026/9/22 9:35:03

Vue中Pinia和Vuex有什么区别该用哪个 Vue 中 Pinia 和 Vuex 有什么区别该用哪个一句话总结Pinia 是 Vue 3 官方推荐的状态管理库比 Vuex 更轻、更简洁、TypeScript 支持更好。新项目直接 Pinia老项目逐步迁移别犹豫正文目录Pinia 和 Vuex 的核心区别5 大高频踩坑场景 迁移代码万能兜底Pinia 标准 Store 模板预防 checklist不再踩坑一句话总结一、Pinia 和 Vuex 的核心区别对比项Vuex 4PiniaVue 版本Vue 2 / Vue 3Vue 2 / Vue 3Store 定义state getters mutations actionsstate getters actions无 mutationsTypeScript 支持一般需要大量类型断言优秀自动类型推断模块化需要modules嵌套每个 Store 独立天然扁平Composition API需要适配原生支持 setup 语法体积~10KB~6KBDevTools 支持✅✅学习成本高mutations 概念冗余低直觉式 API一句话Pinia 砍掉了 mutations每个 Store 独立定义setup 语法天然支持TS 类型自动推断。新项目无脑选 Pinia。二、5 大高频踩坑场景 迁移代码① Vuex 习惯修改 state 必须走 mutations// ❌ Vuex 习惯修改 state 必须写 mutationconststore{state:()({count:0}),mutations:{increment(state){state.count;}},actions:{asyncIncrement({commit}){commit(increment);// ❌ Pinia 不需要 commit}}};// 组件里this.$store.commit(increment);// ❌ Pinia 没有 commit修复Pinia 直接改 stateactions 里直接操作// ✅ Pinia直接改不需要 mutationsimport{defineStore}frompinia;exportconstuseCounterStoredefineStore(counter,{state:()({count:0}),actions:{increment(){this.count;// ✅ 直接改不需要 commit},asyncIncrement(){this.count;// ✅ action 里也可以直接改}}});// 组件里constcounteruseCounterStore();counter.increment();// ✅ 直接调counter.count10;// ✅ 也可以直接改② Vuex 模块嵌套太深取数据一长串// ❌ Vuex 模块嵌套取数据路径太长conststore{modules:{user:{modules:{profile:{state:()({name:张三}),namespaced:true}}}}};// 组件里this.$store.state.user.profile.name;// ❌ 路径太长this.$store.commit(user/profile/setName,李四);// ❌ 命名空间拼接修复Pinia 每个 Store 独立扁平化// ✅ Pinia每个 Store 独立定义exportconstuseUserStoredefineStore(user,(){constnameref(张三);constsetName(val){name.valueval;};return{name,setName};});// 组件里直接用constuserStoreuseUserStore();userStore.name;// ✅ 直接访问userStore.setName(李四);// ✅ 直接调用③ 用 setup 语法时 Vuex 类型推断差// ❌ Vuex TypeScript类型推断差需要大量断言import{useStore}from/store;conststoreuseStore();constcountstore.state.count;// ❌ 类型是 anyconstuserstore.state.user.nameasstring;// ❌ 手动断言修复Pinia 自动类型推断// ✅ Pinia自动类型推断import{useUserStore}from/stores/user;constuserStoreuseUserStore();userStore.name;// ✅ 自动推断 stringuserStore.setName(李四);// ✅ 参数类型自动校验// ✅ setup 风格的 Storeimport{defineStore}frompinia;import{ref,computed}fromvue;exportconstuseUserStoredefineStore(user,(){constnamerefstring(张三);constagerefnumber(18);constinfocomputed(()${name.value},${age.value}岁);constsetName(val:string){name.valueval;};return{name,age,info,setName};});④ Pinia 持久化刷新后状态丢失// ❌ Pinia 默认不持久化刷新页面状态丢失exportconstuseUserStoredefineStore(user,(){consttokenref();constlogin(t){token.valuet;};return{token,login};});// 刷新页面 → token 变回空字符串 ❌修复方案一手动 localStorage// ✅ 在 action 里手动存exportconstuseUserStoredefineStore(user,(){consttokenref(localStorage.getItem(token)||);constlogin(t){token.valuet;localStorage.setItem(token,t);// ✅ 存};constlogout(){token.value;localStorage.removeItem(token);// ✅ 清};return{token,login,logout};});修复方案二用 pinia-plugin-persistedstate 插件// ✅ 插件自动持久化import{createPinia}frompinia;importpiniaPluginPersistedstatefrompinia-plugin-persistedstate;constpiniacreatePinia();pinia.use(piniaPluginPersistedstate);// ✅ 全局注册// Store 里声明 persistexportconstuseUserStoredefineStore(user,{state:()({token:,user:null}),persist:true,// ✅ 自动持久化整个 state});⑤ Pinia 解构丢失响应式!-- ❌ 解构后丢失响应式 -- script setup import { useUserStore } from /stores/user; const userStore useUserStore(); const { name, age } userStore; // ❌ 解构后不是响应式的 /script template div{{ name }}/div !-- ❌ name 变了页面不更新 -- /template修复用 storeToRefs!-- ✅ 用 storeToRefs 解构保持响应式 -- script setup import { storeToRefs } from pinia; import { useUserStore } from /stores/user; const userStore useUserStore(); const { name, age } storeToRefs(userStore); // ✅ 响应式保留 // actions 可以直接解构函数不需要响应式 const { setName } userStore; /script template div{{ name }}/div !-- ✅ name 变了页面更新 -- /template三、万能兜底Pinia 标准 Store 模板Option 风格类似 Vuex适合简单 Storeimport{defineStore}frompinia;exportconstuseCounterStoredefineStore(counter,{state:()({count:0,history:[],}),getters:{double:(state)state.count*2,historyLength:(state)state.history.length,},actions:{increment(){this.count;this.history.push(1);},decrement(){this.count--;this.history.push(-1);},reset(){this.count0;this.history[];},},});Setup 风格Composition API推荐import{defineStore}frompinia;import{ref,computed}fromvue;exportconstuseUserStoredefineStore(user,(){// stateconstuserref(null);consttokenref();// gettersconstisLoggedIncomputed(()!!token.value);constuserNamecomputed(()user.value?.name||游客);// actionsconstloginasync(credentials){constresawaitfetch(/api/login,{method:POST,body:JSON.stringify(credentials),});constdataawaitres.json();token.valuedata.token;user.valuedata.user;};constlogout(){token.value;user.valuenull;};constupdateUser(patch){user.value{...user.value,...patch};};return{// stateuser,token,// gettersisLoggedIn,userName,// actionslogin,logout,updateUser,};});组件里使用script setup import { storeToRefs } from pinia; import { useUserStore } from /stores/user; const userStore useUserStore(); // ✅ 响应式数据用 storeToRefs const { user, token, isLoggedIn, userName } storeToRefs(userStore); // ✅ actions 直接解构 const { login, logout, updateUser } userStore; // ✅ 也可以直接用 $patch 批量更新 const updateProfile () { userStore.$patch({ user: { name: 新名字 } }); }; // ✅ $reset 重置仅 Option 风格支持 const resetAll () userStore.$reset(); /script四、预防 checklist新项目直接用 Pinia不要用 VuexPinia没有 mutationsactions 里直接this.xxx val修改 state每个 Store独立定义不需要 modules 嵌套组件里解构 Store 数据必须用 storeToRefs否则丢失响应式actions/methods可以直接解构函数不需要响应式持久化用 pinia-plugin-persistedstate插件或手动 localStorage推荐用setup 风格定义 StoreComposition APITS 支持更好跨 Store 调用在 action 里useOtherStore()即可$patch批量更新比逐个赋值性能更好$reset()只在 Option 风格 Store 中可用setup 风格需手动实现五、一句话总结「Pinia 更轻更直觉的 Vuex」。砍掉 mutations、扁平化 Store、setup 语法原生支持、TS 自动推断。新项目无脑 Pinia解构用 storeToRefs持久化用插件。状态管理就该这么简单最后问候亲爱的朋友们并邀请你们阅读我的全新著作 《Vue.js 3企业级项目开发实战微课视频版》
延伸阅读

更多相关文章

2026/9/21 7:33:31

Ubuntu系统下JAX GPU环境搭建:从驱动到验证的完整指南

1. 为什么在Ubuntu上安装JAX GPU版本是个“技术活”? 如果你正在Ubuntu上折腾机器学习,尤其是想用上Google那个以高性能和函数式编程著称的JAX库,并且希望它能调用你的NVIDIA GPU来加速计算,那你大概率已经踩过坑,或者…

2026/9/20 4:01:23

微客外链功能解析:抖音_快手私信跳转微信的实现原理与技术路径

微客外链功能解析:抖音/快手私信跳转微信的实现原理与技术路径 微客外链支持通过抖音、快手官方私信卡片,以及短信、浏览器等通用渠道,将用户引导至微信生态内指定入口——包括个人微信扫码添加页、企业微信联系页、微信群二维码页。该能力基…

2026/9/20 4:01:23

从 OpenRouter 看 AI 模型路由层:技术架构与中小开发者的切入思路

📌 本文是一篇技术案例分析。文中涉及的融资与经营数据均来自公开报道,部分数据为媒体披露口径,引用时已做标注,仅供技术讨论与架构参考。 2026 年 5 月 28 日,AI 模型聚合平台 OpenRouter​ 官方宣布完成 1.13 亿美元 B 轮融资,由 Alphabet 旗下成长基金 CapitalG 领投…

2026/9/22 9:30:21

3个坑搞定火花探测,一文搞懂前端实战逻辑

3个坑搞定火花探测,一文搞懂前端实战逻辑 刚学完 JavaScript 语法,对着文档敲代码挺顺,但让你搭个完整项目,脑子瞬间空白?别慌,这种“会写语句但不会拼项目”的尴尬,90% 的前端新手都经历过。今天不聊虚的,直接拿 火花探测…

2026/9/22 9:30:21

吴洪声源码解析:从入门到精通,5个细节搞定核心逻辑

吴洪声源码解析:从入门到精通,5个细节搞定核心逻辑 官方文档翻了三遍还是云里雾里?代码跑通了但心里没底?这种“看似懂了,实则懵了”的状态,是绝大多数开发者从入门到精通路上的最大绊脚石。很多人以为看源码是高手的专利,其实不然,看懂核心逻辑比背…

2026/9/22 9:30:21

Ablation Plan

AI 技能/插件AI 评测科研人工智能MCP 服务dsh-plugin 【免费下载链接】Auto-claude-code-research-in-sleep ARIS ⚔️ (Auto-Research-In-Sleep) — Lightweight Markdown-only skills for autonomous ML research: cross-model review loops, idea discovery, and experiment…

2026/9/22 9:25:21

萧平性能优化:解决版本升级API全变的底层逻辑

萧平性能优化:解决版本升级API全变的底层逻辑 版本升级后 API 全变了,这是很多开发者在接手旧项目或跟进新框架时最头疼的噩梦。你刚把代码跑通,下个版本一更新,核心接口直接失效,报错信息看都看不懂。这时候盲目查文档不仅效率低,还容易踩坑,…

2026/9/21 3:28:31

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/22 9:07:39

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/22 0:04:49

输电线路在线监测高频面试题拆解 3秒抓住官方文档重点

输电线路在线监测高频面试题拆解 3秒抓住官方文档重点 官方文档几百页翻到头还是懵?面试问到 输电线路在线监测 的数据链路时,脑子一片空白?别慌,这种 高频面试题 我整理了10年,专门治各种“文档太长抓不住重点”的毛病。…

2026/9/22 0:04:49

中介房源管理系统重构避坑:3个关键步骤搞定API变更

中介房源管理系统重构避坑:3个关键步骤搞定API变更 版本升级后 API 全变了,这种痛只有真做过的人懂。 很多团队在接手老旧房产项目时,最崩溃的不是代码烂,而是底层框架升级后,原本熟悉的接口调用方式彻底失效。 这份 保姆级教程…

2026/9/22 0:04:49

3个坑点带你一文搞懂55gg小游戏源码

3个坑点带你一文搞懂55gg小游戏源码 盯着控制台满屏的红色报错,看着那一长串 StackTrace ,是不是脑子瞬间宕机?别急,这种时候最忌讳的就是盲目改代码。很多刚入行的前端同学,面对 55gg 小游戏这类轻量级 H5…

2026/9/20 4:54:47

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/21 18:32:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/21 10:29:02

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码