Pinia 状态管理
第10课 Pinia 状态管理理解为什么需要 Pinia跨组件共享状态掌握 store 的 state / getters / actions 三件套在组件中正确读写 store含storeToRefs的作用结合 localStorage 实现登录状态持久化Pinia官网Pinia | The intuitive store for Vue.js1. 为什么需要 Pinia1.1 props / emit 的局限父子组件逐层传递数据中间组件被迫当“传声筒”跨页面、跨层级共享数据十分麻烦。1.2 Pinia 的作用全局共享状态任意组件直接读写无需层层传递状态变化自动通知所有使用方响应式官方出品与 Vue3 完美配合1.3 什么数据适合放 store多个组件都要用到数据会发生变化例当前登录用户、购物车、主题色、权限信息组件内部用完即丢的数据留在组件自己的ref/reactive里不要什么都丢进 store。2. Store 三件套state / getters / actions成员职责类比对应 Vue 知识state存储数据储物柜的柜体ref/reactivegetters根据 state 计算派生数据有缓存取件窗口现用现算computedactions修改数据支持异步、调用其它 action业务柜台办手续methods写法规则state必须是函数返回对象避免多个实例共享同一对象getters接收state作为参数箭头函数actions用普通函数内部通过this访问 state 和其它 action3. 安装与注册npminstallpinia在main.js中注册import{createApp}fromvueimport{createPinia}frompinia// 1. 引入importAppfrom./App.vueconstappcreateApp(App)app.use(createPinia())// 2. 注册一定要在用 store 之前app.mount(#app)4. 创建第一个 store计数器示例文件src/stores/counter.jsimport{defineStore}frompiniaexportconstuseCounterStoredefineStore(counter,{state:()({count:0}),getters:{doubleCount:(state)state.count*2},actions:{increment(){this.count// 用 this 访问 state},addBy(step){this.countstep}}})defineStore第一个参数是 store 的唯一 ID全项目不可重复。5. 在组件中使用 store5.1 基本读写script setup import { storeToRefs } from pinia import { useCounterStore } from ../stores/counter const counterStore useCounterStore() // 获取 store 实例 // 解构 state/getters 并保持响应式 const { count, doubleCount } storeToRefs(counterStore) // actions 可直接解构函数没有响应式丢失问题 const { increment } counterStore function handleAdd() { counterStore.increment() // 调用 action 修改 } /script template p{{ count }}/p p{{ doubleCount }}/p button clickhandleAdd1/button /template5.2 直接解构 vsstoreToRefs直接解构(const { count } counterStore)数据会丢失响应式因为 store 内部用了reactive直接解构会断开响应式连接storeToRefs解构出来的每个值都是ref保持响应式模板中自动解包脚本中需.valueactions 可以直接解构函数没有响应式问题5.3 修改数据的两种姿势直接修改store.count适合简单操作通过 actionstore.increment()有业务逻辑、需要校验或组合多个字段时推荐6. 实战登录状态管理核心案例6.1 创建用户 Store (src/stores/user.js)import{defineStore}frompinia// localStorage 键名统一管理避免拼写错误constSTORAGE_KEYadmin_user// 从 localStorage 恢复登录状态functionloadUserFromStorage(){try{constsavedlocalStorage.getItem(STORAGE_KEY)returnsaved?JSON.parse(saved):null}catch{returnnull// 数据损坏时按未登录处理不崩溃}}exportconstuseUserStoredefineStore(user,{state:()({userInfo:loadUserFromStorage()// 初始化时自动恢复}),getters:{isLoggedIn:(state)state.userInfo!null,displayName:(state){if(!state.userInfo)return未登录return${state.userInfo.name}${state.userInfo.role}}},actions:{// 登录保存用户信息到 state同时写入 localStoragelogin(userInfo){this.userInfouserInfo localStorage.setItem(STORAGE_KEY,JSON.stringify(userInfo))},// 退出清空 state同时删除 localStoragelogout(){this.userInfonulllocalStorage.removeItem(STORAGE_KEY)}}})6.2 登录页改造 (LoginView.vue)import{useUserStore}from../stores/userconstuserStoreuseUserStore()// 登录成功时调用userStore.login({name:loginForm.username,role:管理员,loginTime:newDate().toLocaleString()})router.replace({name:dashboard})6.3 主布局顶部栏显示登录用户 (MainLayout.vue)script setup import { useUserStore } from ../stores/user const userStore useUserStore() function handleLogout() { userStore.logout() router.replace({ name: login }) } /script template span你好{{ userStore.displayName }}/span button clickhandleLogout退出登录/button /template6.4 路由守卫改造 (router/index.js)import{useUserStore}from../stores/userrouter.beforeEach((to,from,next){// 必须在守卫回调内部调用 useUserStore()此时 Pinia 已激活constuserStoreuseUserStore()if(to.path!/login!userStore.isLoggedIn){next({name:login})}else{next()}})7. 持久化三句话localStorage 配合时机操作代码位置登录时写入localStorage.setItemloginaction初始化时恢复localStorage.getItemstate初始化函数退出时清除localStorage.removeItemlogoutaction三个容易踩的坑对象必须JSON.stringify写入JSON.parse读出解析存档时用try/catch防止数据损坏导致页面崩溃退出时 store 和 localStorage两处同时清空否则刷新会“死而复生”8. 常见错误排查现象原因解决getActivePinia was called with no active Pinia忘记app.use(createPinia())在main.js中注册解构的 state 值不更新直接解构 store使用storeToRefs()actions 中this是 undefinedactions 写成箭头函数actions 必须用普通函数state 写成对象而非函数state: { count: 0 }改为state: () ({ count: 0 })路由守卫报 store 相关错误在文件顶层调用了useXxxStore()移到beforeEach回调内部退出后刷新又回到后台只清了 store 没清 localStoragelogout 中同时removeItem刷新后页面崩溃/白屏localStorage 数据损坏JSON.parse抛异常恢复函数加try/catch总结Pinia 全局公告栏任意组件读写共享数据无需 props 传递Store 三件套state 存、getters 算、actions 改组件使用useXxxStore()获取实例storeToRefs保持响应式解构持久化登录写入 → 初始化恢复 → 退出清除三句话守卫升级从localStorage.isLogin升级为store.isLoggedIn数据更完整

相关新闻

犬主动脉平滑肌细胞(ASMC)原代细胞介绍

犬主动脉平滑肌细胞(ASMC)原代细胞介绍

犬主动脉平滑肌细胞(Canine Aortic Smooth Muscle Cells, ASMC)是从健康犬主动脉血管中膜层分离提取的原代细胞,是心血管生物学、血管病理机制、兽药药理及血管工程研究的核心体外实验模型。该细胞严格保留犬源血管平滑肌细胞最原始的生物学特…

2026/10/11 15:11:31 阅读更多 →
以牌会友智竞交锋|第16期田与家掼蛋比赛暨百年建台·田与家紫桐杯盛大开赛

以牌会友智竞交锋|第16期田与家掼蛋比赛暨百年建台·田与家紫桐杯盛大开赛

2026年8月8日,第16期田与家掼蛋比赛暨百年建台田与家紫桐杯,在百年建台掼蛋俱乐部正式拉开战幕。本次赛事由田与家、紫桐冰酒、百年建台三方联合举办,汇聚众多掼蛋运动爱好者,以智力竞技为纽带,融合商务社交、文化交流…

2026/10/13 2:09:28 阅读更多 →
SpringBoot+Flowable 流程任务操作全景:通过拒绝转办委派加签退回抄送异同,与 operation-button 封装落地

SpringBoot+Flowable 流程任务操作全景:通过拒绝转办委派加签退回抄送异同,与 operation-button 封装落地

SpringBootFlowable 流程任务操作全景:通过拒绝转办委派加签退回抄送异同,与 operation-button 封装落地 🌐 演示地址:http://ruoyioffice.com | 📦 源码1GitHub:ruoyi-office | 📦 源码2GitCod…

2026/9/26 13:22:51 阅读更多 →

最新新闻

行为型设计模式详解:策略、模板方法、观察者、迭代器、责任链

行为型设计模式详解:策略、模板方法、观察者、迭代器、责任链

设计模式系列写到第四篇,终于轮到行为型模式了。前几篇我们把创建型(怎么把对象造出来)和结构型(怎么把对象组合起来)讲完了,这一篇开始讲行为型模式的“上篇”。如果你是跟着这个系列一路看过来的&#xf…

2026/10/13 12:24:19 阅读更多 →
K均值聚类实战:从原理到落地的完整指南

K均值聚类实战:从原理到落地的完整指南

1. 从一个真实需求说起:为什么聚类值得花时间搞明白做数据这行的朋友大概率都遇到过这种场景:手里攥着一份几万行的用户行为表,老板说“把这些人分分类,看看有没有什么规律”,但表里压根没有现成的标签,也没…

2026/10/13 12:24:19 阅读更多 →
图像形成物理:计算机视觉的底层逻辑与工程避坑指南

图像形成物理:计算机视觉的底层逻辑与工程避坑指南

我最早翻到《图像处理、分析与机器视觉(第四版)》的"图像形成物理"这一章时,第一反应是直接跳过。直觉告诉我,前面几章才是重头戏,图像形成不过是点物理常识,无非就是"光打到物体上、镜头收…

2026/10/13 12:24:19 阅读更多 →
AI基础经典试题全解析:归结反演与α-β剪枝手推题攻略

AI基础经典试题全解析:归结反演与α-β剪枝手推题攻略

简介:百度人工智能岗位的经典考试试题文档,覆盖语义网络、知识表示、推理方式、机器学习及自然语言处理等核心模块,并配有完整答案解析。题目按选择题、填空题、简答计算题、应用题四种形式编排,适合正在准备百度或同类互联网公司…

2026/10/13 12:24:19 阅读更多 →
MMDetection网络结构全解析:Backbone、Neck、Head与Loss设计

MMDetection网络结构全解析:Backbone、Neck、Head与Loss设计

1. 整体思路拆解:mmDetection 的网络部分为什么要这么设计我刚开始接触 mmDetection 的时候就一个感觉:模块太多了。一个检测器拆成 backbone、neck、head、loss,到处是 config、registry、builder,看两天源码直接想退坑。但后来切…

2026/10/13 12:24:19 阅读更多 →
Linux安装Oracle19C全攻略:前置检查、静默安装与高频报错排查

Linux安装Oracle19C全攻略:前置检查、静默安装与高频报错排查

简介:对Linux运维工程师和Oracle DBA而言,在CentOS 7与Red Hat 7中安装Oracle 19C,需要提前完成硬件检查、安全策略调整、网络和用户配置等一系列系统级准备,否则安装过程很容易中断。完整安装指南以docx格式提供,共1个…

2026/10/13 12:23:19 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →