首页/新闻资讯/正文详情

Pinia 备忘清单深度解析:Vue 状态管理从安装、Store 到持久化与测试(jaywcjlove/reference)

发布时间:2026/9/24 10:19:24 来源:云帆数科 栏目:资讯中心
Pinia 备忘清单深度解析:Vue 状态管理从安装、Store 到持久化与测试(jaywcjlove/reference)
文档知识库教程开发工具【免费下载链接】reference为开发人员分享快速参考备忘清单(速查表)项目地址https://gitcode.com/jaywcjlove/reference点击查看免费下载Pinia 是 Vue 官方推荐的下一代状态管理库它以简洁的 API、完整的 TypeScript 支持和模块化的 store 设计成为 Vue 3 生态中替代 Vuex 的首选方案。本文基于 jaywcjlove/reference 仓库中的 Pinia 备忘清单 展开深度讲解覆盖从安装接入、Store 定义、组件消费、热重载与 Devtools 调试到插件扩展、状态持久化、SSR、异步 Actions 与单元测试的完整实战链路帮助你在一份速查式指南中掌握 Pinia 的日常高频用法。一、这份备忘清单在仓库中的位置在 jaywcjlove/reference 仓库中Pinia 被归类在 Vue 生态之下README.md 的 Vue 区块里以绿色标签形式列出了 Pinia与其相邻的是 Vue 3 与 Vue 2 备忘清单。仓库为 Pinia 准备了专属图标 assets/pinia.svg。值得留意的是Vue 3 备忘清单 在介绍官方脚手架create-vue时交互式提问中便包含了Add Pinia for state management? … No/Yes说明 Pinia 已是 Vue 3 项目脚手架的一等公民勾选后即可自动接入。因此阅读本文前建议先浏览 Vue 3 备忘清单 了解应用骨架的搭建。此外仓库通过refs-cli见 package.json 的build/start脚本将 Markdown 渲染为站点页面文档中出现的!--rehype:wrap-class...--、!--rehype:style...--等注释即是为该渲染器提供的布局与样式注解如col-span-2 row-span-2控制卡片栅格占位不影响读者直接阅读源码中的技术内容。二、安装 Pinia 并创建实例安装命令Pinia 以独立包形式分发可通过任一主流包管理器安装npm install pinia # or yarn add pinia # or pnpm add pinia创建 Pinia 实例并挂载到 Vue 应用安装完成后需要在应用入口创建 Pinia 实例并通过app.use(pinia)注册为插件使其对所有组件可见import { createApp } from vue import { createPinia } from pinia import App from ./App.vue const app createApp(App) const pinia createPinia() app.use(pinia) app.mount(#app)在你的 Vue 应用中createPinia()返回的实例既是插件也是后续所有 store 的共享上下文载体app.use(pinia)之后组件内即可通过useXxxStore()组合式函数访问对应 store。三、定义 StoreOptions API 风格核心三要素state / getters / actions创建一个 store 文件例如src/stores/counter.js并使用defineStore定义storeimport { defineStore } from pinia export const useCounterStore defineStore(counter, { state: () ({ count: 0 }), actions: { increment() { this.count } }, getters: { doubleCount: (state) state.count * 2 } })三个配置项各自承担不同职责state定义响应式数据的初始值必须是返回对象的函数以保证每个 store 实例拥有独立的数据副本actions定义修改状态的方法。与 Vuex 不同Pinia 的 actions 不再需要显式 commit/mutation直接通过this.count修改即可且 actions 内可使用this访问整个 store包括其他 actions 与 gettersgetters定义基于 state 的派生值类似 Vue 的computed。上述示例中doubleCount接收state作为参数并返回state.count * 2组件中读取时无需括号。Modules 模式放弃嵌套模块改用独立文件Pinia 不使用传统的 Vuex 模块模式嵌套modules: {}而是推荐将每个 store 拆分为独立的 store 文件每个文件通过defineStore定义唯一命名如user、counter// src/stores/user.js import { defineStore } from pinia export const useUserStore defineStore(user, { state: () ({ name: Alice, age: 25 }), actions: { setName(name) { this.name name } }, getters: { isAdult: (state) state.age 18 } })这种设计消除了 Vuex 时代的模块命名空间namespaced配置成本——每个文件天然就是一个独立命名空间store 之间需要协作时直接相互调用对方的useXxxStore()即可代码组织和依赖关系都更加直观。四、在组件中使用 Store在setup()中直接消费在组件中调用useCounterStore()即可获得 store 实例其 state、getters、actions 会作为响应式属性与方法暴露给模板template div pCount: {{ counterStore.count }}/p pDouble Count: {{ counterStore.doubleCount }}/p button clickcounterStore.incrementIncrement/button /div /template script import { useCounterStore } from /stores/counter export default { setup() { const counterStore useCounterStore() return { counterStore } } } /script注意模板中建议整体返回counterStore对象再通过counterStore.xxx访问避免解构导致响应性丢失若确需解构请配合storeToRefs使用详见 Pinia 官方文档。使用 Options API如果你更喜欢 Options API同样可以在setup()中获取 store 并返回给模板使用script import { defineComponent } from vue import { useCounterStore } from /stores/counter export default defineComponent({ setup() { const counterStore useCounterStore() return { counterStore } } }) /script无论组件采用script setup、setup()组合式 API 还是 Options APIPinia 的接入方式都保持一致——在setup阶段调用useXxxStore()从而与 Vue 的响应式系统无缝衔接。将 Store 封装进组合函数你可以将 store 与组合函数一起使用把取 store 派生数据 操作封装成可复用的逻辑单元// src/composables/useCounter.js import { useCounterStore } from /stores/counter export function useCounter() { const counterStore useCounterStore() return { count: counterStore.count, doubleCount: counterStore.doubleCount, increment: counterStore.increment } }这样组件只需const { count, doubleCount, increment } useCounter()即可获得一整套与计数器相关的状态与操作适合在多处复用的业务逻辑中应用。五、开发体验热重载与 Vue DevtoolsVite 下的热重载HMR使用 Vite 时你可以启用热重载功能使编辑 store 后无需刷新页面即可保留当前状态if (import.meta.hot) { import.meta.hot.accept(acceptHMRUpdate(useCounterStore, import.meta.hot)) }acceptHMRUpdate由 Pinia 导出接收当前 store 的useXxxStore函数与import.meta.hot对象将该段代码置于 store 文件底部即可在开发模式下让 store 与组件一起热更新。使用 Vue Devtools 调试Pinia 可以与 Vue Devtools 一起使用。确保你安装了最新版本的 Vue Devtools然后你可以在 Devtools 中查看和调试你的 Pinia store——包括查看各 store 的 state 快照、追踪 action 调用、时间旅行式地观察状态变更调试体验与 Vuex 时期相当甚至更直观。六、插件机制与状态持久化编写插件扩展 PiniaPinia 支持插件通过pinia.use(plugin)注册。插件接收包含store的上下文对象可用于监听 action、扩展 store 属性或注入全局逻辑// src/plugins/piniaPlugin.js export function piniaPlugin({ store }) { store.$onAction(({ name, store, args, after, onError }) { console.log(Action ${name} was called with args:, args) }) } // main.js import { createPinia } from pinia import { piniaPlugin } from ./plugins/piniaPlugin const pinia createPinia() pinia.use(piniaPlugin)$onAction是 Pinia 提供的 action 钩子订阅 API回调中可拿到 action 名称name、参数args以及after成功后回调与onError失败后回调两个注册器非常适合做日志埋点、请求统计或权限校验等横切关注点。所有 store 都会自动获得通过pinia.use()注册的插件能力。使用pinia-plugin-persist持久化状态为了让 store 状态在刷新后依然保留社区常用pinia-plugin-persist插件实现 localStorage/sessionStorage 持久化完整流程分四步。1. 安装插件npm install pinia-plugin-persist2. 配置 Pinia 和pinia-plugin-persist在入口文件中注册插件。⚠️ Vue 2 项目需要额外接入vue/composition-api与PiniaVuePluginimport Vue from vue import vueCompositionApi from vue/composition-api import { createPinia, PiniaVuePlugin } from pinia import piniaPersist from pinia-plugin-persist import App from ./App.vue Vue.use(vueCompositionApi) Vue.use(PiniaVuePlugin) const pinia createPinia() pinia.use(piniaPersist) new Vue({ pinia, render: h h(App) }).$mount(#app)Vue 3 项目直接通过app.use(pinia)挂载import { createApp } from vue import { createPinia } from pinia import piniaPersist from pinia-plugin-persist import App from ./App.vue const pinia createPinia() pinia.use(piniaPersist) createApp(App) .use(pinia) .mount(#app)3. 创建 Store 并启用持久化在 store 的第三层配置persist选项enabled: true开启持久化strategies数组可精确控制存储介质与需要持久化的字段路径// stores/userStore.js import { defineStore } from pinia export const useUserStore defineStore(userStore, { state: () ({ firstName: S, lastName: L, accessToken: xxxxxxxxxxxxx }), actions: { setToken(value) { this.accessToken value } }, persist: { enabled: true, strategies: [ { storage: localStorage, paths: [accessToken] } ] } })配置要点storage指定持久化介质常用localStorage或sessionStorage默认一般为localStoragepaths指定要持久化的 state 路径数组例如[accessToken]表示仅持久化accessToken字段其余字段如本例中的姓名不落盘从而实现敏感数据随刷新保留、非必要数据不占空间的精细化控制若不配置paths插件会默认持久化整个 state。4. 在组件中使用持久化的 Store组件中的使用方式与普通 store 完全一致刷新页面后accessToken会自动从存储介质中恢复// src/components/SomeComponent.vue template div p{{ userStore.firstName }} {{ userStore.lastName }}/p p{{ userStore.accessToken }}/p /div /template script import { useUserStore } from /stores/userStore export default { setup() { const userStore useUserStore() return { userStore } } } /script七、SSR 支持Pinia 支持服务端渲染 (SSR)。由于 SSR 下每个请求都需要独立的 store 实例避免请求间状态串扰正确做法是在工厂函数createApp()内创建 Pinia 实例而不是在模块顶层创建import { createPinia } from pinia export function createApp() { const app createSSRApp(App) const pinia createPinia() app.use(pinia) return { app, pinia } }将{ app, pinia }一并返回服务端渲染时即可按请求实例化独立的应用与状态容器配合pinia-plugin-persist等插件时SSR 场景还需注意避免在服务端访问浏览器专有的localStorage通常需要针对服务端禁用或替换持久化策略。八、使用异步 ActionsPinia 支持在 actions 中使用异步代码actions可以是async函数内部可直接await异步请求并更新 state// src/stores/todo.js import { defineStore } from pinia import axios from axios export const useTodoStore defineStore(todo, { state: () ({ todos: [] }), actions: { async fetchTodos() { const response await axios.get(/api/todos) this.todos response.data } } })组件中通过todoStore.fetchTodos()触发请求请求完成后todos自动更新并驱动视图刷新由于 actions 返回 Promise组件内还可以进一步await或使用.then()处理加载完成后的后续逻辑。相比 Vuex 中需要借助 async/await 手动编排 mutation 的方式Pinia 的异步 action 写法与普通业务函数无异。九、测试 Pinia Store你可以使用 Vue Test Utils 和 Jest 来测试 Pinia store。核心要点是在每个测试用例前通过setActivePinia(createPinia())创建并激活一个全新的 Pinia 实例保证用例之间状态隔离// __tests__/counterStore.test.js import { setActivePinia, createPinia } from pinia import { useCounterStore } from /stores/counter describe(Counter Store, () { beforeEach(() { setActivePinia(createPinia()) }) it(increments the count, () { const counterStore useCounterStore() expect(counterStore.count).toBe(0) counterStore.increment() expect(counterStore.count).toBe(1) }) it(returns double count, () { const counterStore useCounterStore() counterStore.count 2 expect(counterStore.doubleCount).toBe(4) }) })测试要点setActivePinia用于为当前测试环境设置活动的 Pinia 实例此后调用useCounterStore()均从该实例解析 store通过beforeEach重建实例可确保每个用例都从干净的初始状态count 0开始测试中可以直接读写 state如counterStore.count 2并断言 getters 的计算结果无需挂载组件即可完成纯逻辑验证对于异步 actions可使用await counterStore.fetchTodos()后再断言更新后的 state。十、延伸阅读Vue 3 备忘清单Pinia 通常与之配套使用其中包含create-vue脚手架接入 Pinia 的交互式配置流程Vue 2 备忘清单在 Vue 2 项目中使用 Pinia 时的配套参考仓库首页 README查看 Pinia 在仓库 Vue 生态分类中的完整索引。赞分享文档知识库教程开发工具【免费下载链接】reference为开发人员分享快速参考备忘清单(速查表)项目地址https://gitcode.com/jaywcjlove/reference点击查看免费下载相关推荐Pinia 状态管理完整速查Store 定义、插件持久化与 SSR 实战Quick Reference 备忘清单详解Pinia 状态管理完整速查Store 定义、插件持久化与 SSR 实战Quick Reference 备忘清单详解 本篇技术指南基于 Quick Ref文档教程HTTP 状态码快速参考备忘清单jaywcjlove/reference 速查表HTTP 状态码快速参考备忘清单jaywcjlove/reference 速查表 本指南以 jaywcjlove/reference https://lin文档知识库教程开发工具JavaScript 速查表jaywcjlove/reference 中的 JavaScript 备忘清单全解析JavaScript 速查表jaywcjlove/reference 中的 JavaScript 备忘清单全解析 本指南以开源仓库 jaywcjlove/re文档知识库教程开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

【Springboot毕设全套源码+文档】基于Java+spring boot的中药科普知识平台设计与实现(丰富项目+远程调试+讲解+定制)
【Springboot毕设全套源码+文档】基于Java+spring boot的中药科普知识平台设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am… · 2026/9/24 10:19:12

【JAVA毕设源码分享】基于spring boot的中药科普知识平台设计与实现(程序+文档+代码讲解+一条龙定制)
【JAVA毕设源码分享】基于spring boot的中药科普知识平台设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am… · 2026/9/24 10:19:05

办公文档格式互转,多款文档转换工具能力客观记录
办公文档格式互转,多款文档转换工具能力客观记录

日常办公、资料整理、文稿归档时,经常需要在不同文档格式之间互相转换。各类文档转换工具支持的文件类型、批量处理能力、排版保留效果存在明显差别。下文客观记录多款文档转换工具基础能力与使用边界,本文无任何商业合作,不区分好坏优劣&… · 2026/9/24 10:18:53

泰科纳气泡图软件:图纸更新,可以自动版本比对,不用重新标注!
泰科纳气泡图软件:图纸更新,可以自动版本比对,不用重新标注!

产品研发阶段图纸迭代频繁,每一次图纸改版,质检团队都要重新标注气泡、重新整理检测项目。微小改动,也要整张图纸重新核对,大量重复工作,拖慢样品验证进度。很多气泡工具没有版本对比功能,图纸一改&#xf… · 2026/9/24 10:50:16

第九章 · 代理 — 明星不出面,经纪人全搞定
第九章 · 代理 — 明星不出面,经纪人全搞定

这一章,她学会了"代理":正主不露面,中间挡一层。起因,是她迷上了一个所有事都走经纪人的爱豆。晚上八点,沙发 “我跟你讲,我这个爱豆,微博从来不自己发,全是经纪人发的。”… · 2026/9/24 10:50:10

Noctalia 贡献者指南深度解析:设计原则、技术栈、源码布局与调试实战
Noctalia 贡献者指南深度解析:设计原则、技术栈、源码布局与调试实战

桌面应用 【免费下载链接】noctalia A sleek, customizable desktop shell crafted for Wayland. 项目地址: https://gitcode.com/gh_mirrors/no/noctalia 点击查看 免费下载 Noctalia 是一款面向 Wayland 的轻量可定制桌面 Shell(项目 README&#xff… · 2026/9/24 10:50:04

汽车售后索赔怎么上升?常规/异常两个走法+三级机制讲透
汽车售后索赔怎么上升?常规/异常两个走法+三级机制讲透

汽车售后索赔怎么上升?常规/异常两个走法三级机制讲透本文节选自新书 《汽车Tier1供应商售后全生命周期管理》第5章 核心活动:索赔管理(5.3 上升机制)。作者基于一线 SQE(供应商质量工程师)视角的实战总结… · 2026/9/24 10:49:58

鸿蒙开发:了解Context
鸿蒙开发:了解Context

前言之前在封装图片滑动验证,还有当下的一个自适应背景颜色功能时,都需要获取到image.PixelMap对象,于是就使用了getMediaContent方法,代码如下:const resourceMgr: resourceManager.ResourceManager this.getUIConte… · 2026/9/24 10:49:51

用 C++ 写 Web 服务实战(二):路由进阶、中间件链与文件上传
用 C++ 写 Web 服务实战(二):路由进阶、中间件链与文件上传

用 C 写 Web 服务实战(二):路由进阶、中间件链与文件上传 上一篇我们搭起了一个能跑的 Web 应用骨架——监听端口、注册 JSON 路由、绑定静态目录、开启多事件循环、写了一个文件日志中间件。这篇在这个骨架之上继续往上盖:路由参… · 2026/9/24 10:49:45

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码