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

Pinia 详细使用手册

一、Pinia 核心概述Pinia 是 Vue 官方推荐的新一代状态管理库专为 Vue3 设计也兼容 Vue2。它抛弃了 Vuex 的 Mutations仅保留 State、Getters、ActionsAPI 极简、TypeScript 支持完善、轻量高效约 1KB是 Vue 项目状态管理的首选方案。核心优势扁平化模块设计无嵌套结构维护更简单天然支持 TS自动类型推导编码更安全支持组合式Setup与选项式Options两种写法与 Vue DevTools 深度集成支持时间旅行调试支持服务端渲染SSR与状态持久化二、环境安装与初始化1. 安装 Pinia# npm npm install pinia # yarn yarn add pinia # pnpm推荐 pnpm add pinia2. 全局挂载main.ts/main.jsimport { createApp } from vue import { createPinia } from pinia import App from ./App.vue const appcreateApp(App) const piniacreatePinia() // 创建 Pinia 实例 app.use(pinia) // 挂载到 Vue 应用 app.mount(#app)三、Store 定义两种写法Store 是 Pinia 的核心每个 Store 对应一个独立的状态模块用defineStore定义第一个参数为全局唯一 ID。1. 选项式写法Options类似 Vuex// stores/counter.ts import { defineStore } from pinia export const useCounterStoredefineStore(counter, { // State状态数据源必须是函数避免多实例污染 state: () ({ count: 0, name: Pinia }), // Getters计算属性缓存类似组件 computed getters: { // 基础用法接收 state doubleCount: (state) state.count*2, // 访问其他 getter用 this doubleCountPlusOne(): number { return this.doubleCount1 } }, // Actions同步/异步方法类似组件 methods actions: { // 同步修改 increment() { this.count // 直接访问 state }, // 异步修改 async fetchData() { const resawait fetch(/api/data) const dataawait res.json() this.namedata.name } } })2. 组合式写法SetupVue3 风格更灵活支持 Vue 组合式 APIref/reactive/computed// stores/user.ts import { defineStore } from pinia import { ref, computed } from vue export const useUserStoredefineStore(user, () { // State用 ref/reactive 定义 const usernameref(游客) const tokenref() const isLoginref(false) // Getters用 computed 定义 const upperUsernamecomputed(() username.value.toUpperCase()) // Actions用普通函数定义 function login(data: { username: string; token: string }) { username.valuedata.username token.valuedata.token isLogin.valuetrue } function logout() { username.value游客 token.value isLogin.valuefalse } // 返回 state/getters/actions暴露给组件 return { username, token, isLogin, upperUsername, login, logout } })四、组件中使用 Store1. 基础用法直接访问template div p计数{{ counter.count }}/p p双倍计数{{ counter.doubleCount }}/p button clickcounter.increment1/button /div /template script setup // 导入 store import { useCounterStore } from /stores/counter // 创建 store 实例 const counteruseCounterStore() /script {insert\_element\_0\_} ### 2. 解构用法保持响应式 用 storeToRefs 解构避免直接解构丢失响应式 vue template div p用户名{{ username }}/p p大写用户名{{ upperUsername }}/p button clickhandleLogin登录/button /div /template script setup import { useUserStore } from /stores/user import { storeToRefs } from pinia const userStoreuseUserStore() // 解构state/getters 用 storeToRefsactions 直接解构 const { username, upperUsername }storeToRefs(userStore) const { login }userStore function handleLogin() { login({ username: 张三, token: 123456 }) } /script五、State 操作详解1. 直接修改const counteruseCounterStore() counter.count10 // 直接赋值修改2. 批量修改$patch一次性修改多个状态性能更优// 对象形式 counter.$patch({ count: 5, name: New Pinia }) // 函数形式更灵活支持逻辑 counter.$patch((state) { state.count 3 state.name Pro }) {insert\_element\_1\_} ### 3. 重置状态$reset 恢复 state 到初始值 javascript counter.$reset() // { count: 0, name: Pinia }4. 替换整个状态$state直接覆盖 statecounter.$state{ count: 100, name: Replace Pinia }六、Getters 高级用法1. 依赖其他 Gettersgetters: { doubleCount: (state) state.count*2, // 依赖 doubleCount quadrupleCount(): number { return this.doubleCount*2 } }2. 传参 Getters返回函数实现传参getters: { getCountByN: (state) { return (n: number) state.count*n } } // 组件中使用counter.getCountByN(3)3. 访问其他 Store 的 Gettersimport { useUserStore } from ./user getters: { userInfo(): string { const userStoreuseUserStore() return userStore.username } }七、Actions 高级用法1. 异步操作actions: { async getUserInfo(userId: number) { const resawait fetch(/api/user/${userId}) const dataawait res.json() this.userInfodata // 修改 state return data // 返回结果给组件 } } // 组件中调用await userStore.getUserInfo(1)2. 访问其他 Store 的 Actionsimport { useCounterStore } from ./counter actions: { incrementAndLog() { const counterStoreuseCounterStore() counterStore.increment() // 调用其他 store 的 action console.log(计数已增加) } }3. 批量修改状态Actions 中可直接修改多个 state无需$patchactions: { updateUser() { this.username李四 this.token654321 this.isLogintrue } }八、状态持久化pinia-plugin-persistedstate默认状态刷新页面会丢失用持久化插件保存到 localStorage/sessionStorage。1. 安装插件npm install pinia-plugin-persistedstate # yarn add pinia-plugin-persistedstate # pnpm add pinia-plugin-persistedstate2. 全局注册main.tsimport { createPinia } from pinia import piniaPluginPersistedstate from pinia-plugin-persistedstate const piniacreatePinia() pinia.use(piniaPluginPersistedstate) // 注册持久化插件3. 启用持久化Store 中选项式export const useUserStoredefineStore(user, { state: () ({ username: 游客, token: }), persist: true // 开启当前 store 持久化 })组合式export const useUserStoredefineStore(user, () { const usernameref(游客) return { username } }, { persist: true // 开启持久化 })4. 自定义持久化规则persist: { key: user-info, // 自定义存储 key storage: sessionStorage, // 存储位置默认 localStorage paths: [username], // 仅持久化指定字段 // 加密存储敏感数据 serialize: (state) { return JSON.stringify({ ...state, token: btoa(state.token) }) }, deserialize: (value) { const stateJSON.parse(value) state.tokenatob(state.token) return state } }九、模块化与多 Store1. 目录结构推荐src/ ├── stores/ │ ├── index.ts # 统一导出 │ ├── counter.ts │ ├── user.ts │ └── cart.ts2. 统一导出stores/index.tsexport { useCounterStore } from ./counter export { useUserStore } from ./user export { useCartStore } from ./cart3. 组件中导入import { useCounterStore, useUserStore } from /stores十、TypeScript 支持Pinia 天然支持 TS自动类型推导// 选项式自动推导 state/getters/actions 类型 export const useCounterStoredefineStore(counter, { state: () ({ count: 0 }), actions: { increment() { this.count // TS 自动识别 count 类型 } } }) // 组合式ref/computed 自动推导类型 const countref(0) // 类型Refnumber十一、常见问题与避坑解构后丢失响应式必须用storeToRefs解构 state/gettersactions 可直接解构。State 必须是函数避免多个组件实例共享同一状态导致数据污染。持久化异步数据确保异步操作完成后再修改 state否则插件无法监听。全局 ID 唯一defineStore 的第一个参数必须全局唯一否则状态冲突。十二、官方文档与资源官方文档https://pinia.vuejs.org/zh/GitHub 仓库https://github.com/vuejs/pinia持久化插件https://github.com/prazdevs/pinia-plugin-persistedstate

相关文章:

Pinia 详细使用手册

一、Pinia 核心概述 Pinia 是 Vue 官方推荐的新一代状态管理库,专为 Vue3 设计,也兼容 Vue2。它抛弃了 Vuex 的 Mutations,仅保留 State、Getters、Actions,API 极简、TypeScript 支持完善、轻量高效(约 1KB&#xff…...

技术人退休倒计时:软件测试从业者的后职业生涯规划

一、盘点自身:挖掘退休后的核心竞争力(一)技术经验的沉淀与梳理软件测试从业者在职业生涯中,积累了丰富的技术经验,这是退休后宝贵的财富。从功能测试到性能测试,从自动化测试到安全测试,每一个…...

地铁屏蔽门电机故障诊断【附代码】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,查看文章底部二维码(1)基于相关系数优化的变分模态分解信号预处理&#x…...

双鸭山皮带机

在双鸭山的物流、仓储等行业中,皮带机作为一种重要的输送设备,发挥着至关重要的作用。它能够实现物料的连续输送,提高生产效率,降低劳动强度。然而,面对市场上众多的皮带机产品和供应商,企业该如何做出正确…...

别再死记硬背了!用Python的NumPy和Matplotlib亲手画一遍反双曲函数图像,理解立马翻倍

用Python可视化反双曲函数:从数学公式到动态图像的探索之旅 数学公式总是让人望而生畏,尤其是那些带着"反"字头的函数——反三角函数、反双曲函数,光是名字就足以让大多数人头疼。但如果你见过它们的图像,一切就会变得直…...

专业游戏叠加层工具HunterPie:3个步骤实现《怪物猎人世界》数据可视化

专业游戏叠加层工具HunterPie:3个步骤实现《怪物猎人世界》数据可视化 【免费下载链接】HunterPie-legacy A complete, modern and clean overlay with Discord Rich Presence integration for Monster Hunter: World. 项目地址: https://gitcode.com/gh_mirrors/…...

多级注意力Transformer反应再生系统故障诊断【附代码】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,查看文章底部二维码(1)自适应正交变分模态分解与贝叶斯优化的特征提取&am…...

联邦学习中的数据预处理:FedPS框架解析与实践

1. 项目概述:当联邦学习遇上数据预处理在联邦学习场景中,我们常常面临一个尴尬局面:各参与方的本地数据质量参差不齐,却由于隐私限制无法直接交换原始数据。传统做法是让每个参与方独立进行数据预处理,但这种分散处理方…...

高考导数压轴题新宠:5分钟搞懂‘凹凸反转’怎么用(附经典例题拆解)

高考导数压轴题新宠:5分钟搞懂‘凹凸反转’怎么用(附经典例题拆解) 高考数学的导数大题常常让考生望而生畏,尤其是那些看似复杂的不等式证明题。传统的构造函数求导方法有时会陷入计算泥潭,而"凹凸反转"技巧…...

鸣潮自动化助手完全指南:3天掌握智能游戏解放方案

鸣潮自动化助手完全指南:3天掌握智能游戏解放方案 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 你是否厌倦了每天重复…...

从Bode图到参数调优:手把手教你用MATLAB搞定准PR控制器设计

从Bode图到参数调优:手把手教你用MATLAB搞定准PR控制器设计 在电力电子控制领域,准PR(准比例谐振)控制器因其对交流信号优异的跟踪性能而备受青睐。与传统的PI控制器不同,准PR控制器能够直接对特定频率的交流信号实现…...

汽车ECU休眠唤醒那些事:从TJA1021的INH引脚到AUTOSAR LinTrcv的实战设计

汽车ECU休眠唤醒实战:TJA1021硬件设计与AUTOSAR LinTrcv深度解析 在汽车电子架构中,低功耗设计已成为衡量ECU性能的关键指标。当夜幕降临,车辆停泊在车库时,如何确保各电子控制单元既能快速响应唤醒事件,又能最大限度降…...

别再手动加词了!用Custom_phrase.txt文件批量导入你的Rime小狼毫个人词库

高效管理Rime词库:Custom_phrase.txt批量导入实战指南 每次在Rime输入法中手动添加自定义词汇时,你是否感到效率低下?专业术语、个人常用语、网络热词一个个输入不仅耗时耗力,还容易出错。本文将带你深入了解如何利用Custom_phras…...

iMX6ULL开发板GPIO调试利器:libgpiod命令行工具(gpiodetect/gpiomon)实战手册

iMX6ULL开发板GPIO调试利器:libgpiod命令行工具实战手册 当iMX6ULL设备在现场出现GPIO相关异常时,嵌入式系统测试工程师和现场支持人员往往面临巨大压力。按键无响应、LED不亮这类看似简单的问题,背后可能隐藏着复杂的硬件交互故障。本文将深…...

WindowResizer终极指南:如何强制调整任何窗口大小,轻松解决顽固窗口问题

WindowResizer终极指南:如何强制调整任何窗口大小,轻松解决顽固窗口问题 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些无法调整大小的应用程序…...

量化投资新纪元:如何用AKShare构建专业级金融数据获取系统

量化投资新纪元:如何用AKShare构建专业级金融数据获取系统 【免费下载链接】akshare AKShare is an elegant and simple financial data interface library for Python, built for human beings! 开源财经数据接口库 项目地址: https://gitcode.com/gh_mirrors/ak…...

ComfyUI ControlNet辅助预处理器完全指南:如何实现AI图像生成精准控制

ComfyUI ControlNet辅助预处理器完全指南:如何实现AI图像生成精准控制 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 想要让AI图像生成完全按…...

YoloX训练实战:从零开始用PyTorch训练一个自定义数据集(附完整代码)

YoloX实战指南:PyTorch自定义数据集训练全流程解析 在工业检测、自动驾驶、安防监控等领域,目标检测技术正发挥着越来越重要的作用。YoloX作为Yolo系列的最新演进版本,凭借其Anchor-Free设计、SimOTA动态匹配等创新特性,在精度和速…...

别再傻傻分不清了!一张图帮你理清YOLO各版本(v1-v13)的‘血缘关系’与核心团队

YOLO进化图谱:从v1到v13的技术传承与团队变迁 在计算机视觉领域,YOLO(You Only Look Once)目标检测算法的发展史堪称一部技术创新的微型史诗。从2016年Joseph Redmon提出初代YOLO开始,这个系列已经迭代了13个主要版本…...

如何快速解密网易云音乐NCM格式:3种简单方法重获音乐自由

如何快速解密网易云音乐NCM格式:3种简单方法重获音乐自由 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾为网易云音乐下载的NCM格式歌曲无法在其他设备播放而烦恼?那些精心收藏的音乐文件就像被锁在…...

Rusted PackFile Manager深度解析:Total War MOD开发的架构革命与技术实践

Rusted PackFile Manager深度解析:Total War MOD开发的架构革命与技术实践 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项…...

第5篇:重复执行——让程序帮你干活 Rust中文编程

第5篇:重复执行——让程序帮你干活 作者: 李金雨 联系方式: wbtm2718qq.com 目标读者: Rust中文编程 核心理念: AI时代必须使用中文编程,母语编程阅读效率极高 1. 开篇引入 本课目标 掌握for循环的使用掌…...

Windows右键菜单终极管理指南:告别混乱,实现高效文件操作

Windows右键菜单终极管理指南:告别混乱,实现高效文件操作 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 在Windows系统中,右…...

别再到处找现成的了!手把手教你用CentOS 7.9定制一个带专属软件的LiveCD启动盘

从零构建企业级CentOS 7.9定制化LiveCD实战指南 每次新员工入职都要重复配置相同的开发环境?客户演示时总被环境差异搞得手忙脚乱?教学实验室的机器配置参差不齐?这些场景正是定制化LiveCD大显身手的地方。本文将带你深入掌握基于CentOS 7.9打…...

告别界面拥挤!用ttkbootstrap的Notebook组件给你的Python GUI做个清爽的‘文件夹‘

用ttkbootstrap的Notebook组件打造清爽Python GUI界面 每次打开一个功能繁杂的桌面应用,看到满屏按钮和输入框挤在一起,是不是感觉头都大了?就像把办公桌上所有文件、文具、咖啡杯都堆在同一个角落,找什么都费劲。Python的tkinter…...

小红书App深度链接(Scheme)逆向与安全实践指南:以AutoJs调用为例

小红书深度链接(Scheme)安全分析与AutoJs自动化实践 打开手机上的小红书App,点击某个按钮跳转到指定页面——这背后隐藏着一套名为**深度链接(Deep Link)**的技术机制。对于安全研究人员和高级开发者而言,理解这套机制不仅意味着能够实现自动化操作&…...

5个开源解码技巧:如何用MPC-BE突破Windows媒体播放性能瓶颈

5个开源解码技巧:如何用MPC-BE突破Windows媒体播放性能瓶颈 【免费下载链接】MPC-BE MPC-BE – универсальный проигрыватель аудио и видеофайлов для операционной системы Windows. 项目地址…...

Python+GeoPandas实战:5分钟搞定地图坐标系转换(附常见CRS避坑指南)

PythonGeoPandas实战:5分钟搞定地图坐标系转换(附常见CRS避坑指南) 当你在高德地图上标注的店铺位置,放到百度地图却偏移了500米;当你的GPS设备采集的坐标在地图上显示到隔壁街区;当你的地理分析结果与官方…...

别再只用Task.Run了!用TaskCompletionSource在C#里优雅地控制异步流程(附真实支付场景代码)

用TaskCompletionSource重构C#异步支付流程:从回调地狱到优雅编排 在电商支付这类多步骤异步操作中,我们常常遇到这样的困境:库存检查、支付网关调用、订单状态更新等操作存在严格的先后依赖关系,而传统的Task.Run或Task.Wait要么…...

爬虫党必看:实测6个免费代理网站,手把手教你筛选出最快最稳的IP

高效数据采集实战:6大免费代理源测评与智能筛选方案 在数据采集领域,代理IP的质量直接影响着爬虫的稳定性和效率。面对市场上众多的免费代理源,如何快速识别可用资源并建立有效的筛选机制,成为每位数据工程师的必备技能。本文将基…...