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

Vue3 状态管理方案:Pinia 全指南

Vue3 状态管理方案Pinia 全指南Pinia 是 Vue 官方推荐的下一代状态管理库完全替代 Vuex支持 Vue3 Composition API、TypeScript 友好、轻量灵活。本文从基础使用、核心 API、高级技巧、注意事项、常见坑五个维度全面讲解。一、快速上手安装与基础使用1. 安装方式1Vite/Vue CLI 项目# npmnpminstallpinia# yarnyarnaddpinia# pnpmpnpmaddpinia2CDN 引入scriptsrchttps://unpkg.com/pinia2.1.7/dist/pinia.iife.js/scriptscriptconst{createPinia}Pinia/script2. 初始化 Pinia在main.ts中注册 Piniaimport{createApp}fromvueimport{createPinia}frompiniaimportAppfrom./App.vueconstappcreateApp(App)constpiniacreatePinia()app.use(pinia)// 注册 Piniaapp.mount(#app)3. 创建第一个 StorePinia 中没有modules每个 Store 都是独立的通过defineStore定义1选项式写法类似 Vuex// src/stores/counter.tsimport{defineStore}frompinia// 第一个参数是 Store 的唯一 ID必须全局唯一exportconstuseCounterStoredefineStore(counter,{// 状态返回初始状态的函数state:()({count:0,name:Pinia}),// 计算属性类似 Vue 的 computed自动缓存getters:{doubleCount:(state)state.count*2,// 访问其他 getters 用 this需指定返回值类型doubleCountPlusOne():number{returnthis.doubleCount1}},// 动作支持同步/异步修改状态的唯一推荐方式actions:{increment(){this.count},asyncfetchData(){constresawaitfetch(/api/data)constdataawaitres.json()this.namedata.name}}})2组合式写法Vue3 Composition API更灵活适合复杂场景// src/stores/user.tsimport{defineStore}frompiniaimport{ref,computed}fromvueexportconstuseUserStoredefineStore(user,(){// 状态用 ref/reactive 定义constuserInforef({name:,age:0})consttokenref()// 计算属性用 computed 替代 gettersconstisAdultcomputed(()userInfo.value.age18)// 动作普通函数支持同步/异步constupdateUser(info:{name:string;age:number}){userInfo.valueinfo}constloginasync(username:string,password:string){constresawaitfetch(/api/login,{method:POST,body:JSON.stringify({username,password})})constdataawaitres.json()token.valuedata.token}// 返回需要暴露的属性和方法return{userInfo,token,isAdult,updateUser,login}})二、核心 API 详解1. Store 实例属性API作用示例$state获取/替换整个状态对象store.$state { count: 10 }$patch批量修改状态推荐store.$patch({ count: store.count 1 })或函数式store.$patch(state state.count)$reset重置状态到初始值仅选项式写法支持组合式需手动实现store.$reset()$subscribe监听状态变化store.$subscribe((mutation, state) console.log(状态变化, mutation))$onAction监听 actions 调用store.$onAction(({ name, args, after, onError }) {})2. Getters 特性缓存机制只有依赖的状态变化时才重新计算访问其他 Store在 getters 中可以调用其他 Store 实例import{useCounterStore}from./countergetters:{crossStoreCount(state){constcounterStoreuseCounterStore()returnstate.countcounterStore.count}}传递参数getters 返回函数实现参数传递此时不会缓存结果getters:{getCountByMultiplier:(state)(multiplier:number)state.count*multiplier}// 组件中调用store.getCountByMultiplier(3)3. Actions 特性支持异步直接在 actions 中使用async/await修改状态可直接修改this.count或用$patch访问其他 Store同 getters直接在 actions 中调用其他 Store错误处理可通过try/catch或$onAction监听错误。三、组件中使用 Store1. Setup 语法糖推荐template div{{ count }}/div button clickincrement1/button /template script setup langts import { useCounterStore } from /stores/counter import { storeToRefs } from pinia // 获取 Store 实例 const counterStore useCounterStore() // 直接访问状态/动作 const increment () counterStore.increment() // 解构状态时必须用 storeToRefs 保持响应式 const { count, doubleCount } storeToRefs(counterStore) /script2. 选项式 API 兼容适合老项目迁移script langts import { useCounterStore } from /stores/counter import { mapState, mapActions, mapGetters } from pinia export default { computed: { ...mapState(useCounterStore, [count, name]), ...mapGetters(useCounterStore, [doubleCount]) }, methods: { ...mapActions(useCounterStore, [increment]) }, mounted() { this.increment() } } /script四、高级技巧1. Store 持久化插件使用pinia-plugin-persistedstate实现状态持久化到 localStorage/sessionStorage安装npminstallpinia-plugin-persistedstate配置// main.tsimport{createPinia}frompiniaimportpersistedstatefrompinia-plugin-persistedstateconstpiniacreatePinia()pinia.use(persistedstate)在 Store 中启用// 选项式写法exportconstuseCounterStoredefineStore(counter,{state:()({count:0}),persist:true// 全局默认配置localStorage// 自定义配置// persist: {// key: counter-store,// storage: sessionStorage,// paths: [count] // 仅持久化count字段// }})// 组合式写法exportconstuseUserStoredefineStore(user,(){constuserInforef({})return{userInfo}},{persist:true})2. Store 模块化拆分按业务模块拆分 Store如user.ts、cart.ts、setting.ts通过目录结构管理src/stores/ ├── index.ts # 导出所有Store ├── user.ts # 用户模块 ├── cart.ts # 购物车模块 └── setting.ts # 设置模块index.ts统一导出export*from./userexport*from./cartexport*from./setting3. Pinia 插件开发自定义插件扩展 Store 功能比如添加日志、全局状态监听// src/plugins/pinia-logger.tsexportconstpiniaLogger({store}){store.$subscribe((mutation,state){console.log([Pinia Logger]${mutation.storeId}状态变化:,mutation.payload,state)})store.$onAction(({name,args,after,onError}){console.log([Pinia Logger] 调用动作:${name}, 参数:,args)after((result){console.log([Pinia Logger] 动作完成:${name}, 返回值:,result)})onError((error){console.error([Pinia Logger] 动作失败:${name}, 错误:,error)})})}// main.ts 注册插件pinia.use(piniaLogger)五、注意事项1. 响应式处理禁止直接解构 Store直接解构会丢失响应式必须用storeToRefs修改状态的推荐方式优先用actions其次用$patch不推荐直接修改store.count 10虽然语法允许但不利于调试和维护组合式写法中的响应式用ref/reactive定义状态确保响应式。2. TypeScript 支持状态类型自动推断选项式写法中 Pinia 会自动推断state的类型组合式写法需手动定义类型复杂对象建议用接口定义interfaceUserInfo{name:string;age:number;}constuserInforefUserInfo({name:,age:0})Actions 参数类型明确参数类型避免隐式 any。3. 性能优化Getters 缓存合理利用 getters 的缓存特性避免重复计算批量修改状态用$patch批量修改减少响应式更新次数避免在 actions 中执行大量同步计算复杂计算建议放到 getters 或单独的工具函数中。六、开发中常见的坑1. 解构 Store 丢失响应式❌ 错误写法const{count}useCounterStore()// count 是普通值不会响应式更新✅ 正确写法import{storeToRefs}frompiniaconst{count}storeToRefs(useCounterStore())// count 是 ref保持响应式2. 组合式写法中无法使用$reset选项式写法的$reset是自动生成的组合式写法需手动实现exportconstuseCounterStoredefineStore(counter,(){constcountref(0)// 手动实现重置函数constreset(){count.value0}return{count,reset}})3. 持久化插件不生效确保插件已正确注册到 Pinia组合式写法中必须在defineStore的第三个参数中配置persist: true如果状态包含复杂对象如 Date、Map需配置serializer自定义序列化persist:{serializer:{serialize:(value)JSON.stringify(value,(key,val){if(valinstanceofDate)returnval.toISOString()returnval}),deserialize:(value)JSON.parse(value,(key,val){if(keycreateTime)returnnewDate(val)returnval})}}4. 在组件外使用 Store 实例❌ 错误写法组件外直接调用 Store可能导致 Pinia 未初始化// src/utils/api.tsimport{useUserStore}from/stores/userconstuserStoreuseUserStore()// 组件外调用可能报错asyncfunctionfetchData(){consttokenuserStore.token}✅ 正确写法在函数内部调用 StoreasyncfunctionfetchData(){constuserStoreuseUserStore()// 函数内部调用确保 Pinia 已初始化consttokenuserStore.token}5. Getters 中使用this丢失类型选项式写法中getters 用箭头函数会丢失this类型需用普通函数❌ 错误写法getters:{doubleCount:()this.count*2// this 类型为 any}✅ 正确写法getters:{doubleCount():number{// 必须指定返回值类型returnthis.count*2}}七、Pinia vs Vuex 对比特性PiniaVuex模块化每个 Store 都是独立模块无嵌套需嵌套 modules结构复杂Mutations无直接在 actions 中修改状态必须通过 mutations 修改状态TypeScript天生支持自动推断类型需手动定义大量类型繁琐体积轻量约 1KB相对笨重DevTools支持 Vue3 DevTools调试更友好对 Vue3 支持有限Pinia 完全替代 Vuex是 Vue3 状态管理的首选方案

相关文章:

Vue3 状态管理方案:Pinia 全指南

📦 Vue3 状态管理方案:Pinia 全指南 Pinia 是 Vue 官方推荐的下一代状态管理库,完全替代 Vuex,支持 Vue3 Composition API、TypeScript 友好、轻量灵活。本文从基础使用、核心 API、高级技巧、注意事项、常见坑五个维度全面讲解。…...

春联生成模型效果展示:‘健康‘、‘奋斗‘主题对联,意境优美接地气

春联生成模型效果展示:健康、奋斗主题对联,意境优美接地气 春节将至,家家户户都开始张罗贴春联。一副好春联不仅要对仗工整、平仄合规,更要能表达出对新年的美好祝愿。今天我要为大家展示一款基于达摩院PALM大模型的春联生成模型…...

OpenClaw语音交互扩展:百川2-13B-4bits量化模型+Whisper实时转录

OpenClaw语音交互扩展:百川2-13B-4bits量化模型Whisper实时转录 1. 为什么需要语音交互能力 上周整理项目文档时,我发现自己频繁在键盘操作和语音会议之间切换——右手握着鼠标整理文件,左手拿着手机听语音消息,效率低到令人崩溃…...

OpenClaw技能扩展:Kimi-VL-A3B-Thinking自动化内容审核方案

OpenClaw技能扩展:Kimi-VL-A3B-Thinking自动化内容审核方案 1. 为什么需要自动化内容审核 作为一个长期运营技术博客的自媒体人,我最近遇到了一个头疼的问题:随着内容积累越来越多,人工审核历史文章的合规性变得异常耗时。尤其是…...

春秋云境-CVE-2025-14989

Campcodes Complete Online Beauty Parlor Management System 1.0 存在一个漏洞,位于 /admin/search-invoices.php 文件的某些处理过程中。攻击者可通过对该文件的操控,实施 SQL 注入攻击。 方法一 登录到页面 对网站目录扫描 拿到一个WWW.sql的文件&am…...

STEP3-VL-10B从零开始:Ubuntu环境部署+Gradio启动+API服务验证全流程

STEP3-VL-10B从零开始:Ubuntu环境部署Gradio启动API服务验证全流程 你是不是对多模态AI模型很感兴趣,想自己动手部署一个既能看懂图片又能和你聊天的智能助手?今天,我们就来一起搞定STEP3-VL-10B这个“小巨人”模型。 别看它只有…...

上智院×魔搭×Datawhale:《AI4S实战派》教你用AI全面提升科研生产力

“论文代码下下来,环境配了两天,连import都报错。”“生成了个新材料结构,结果DFT一算——能量高得离谱,根本站不住!”“蛋白质对接得分贼高,湿实验一做,全军覆没……”“想自动读文献&#xff…...

Qwen3-14B-INT4-AWQ开发基础:GitHub使用教程与团队协作规范

Qwen3-14B-INT4-AWQ开发基础:GitHub使用教程与团队协作规范 1. 为什么AI开发者需要掌握GitHub 在AI项目开发中,代码管理往往是最容易被忽视的环节。想象一下这样的场景:你和团队花了三个月训练Qwen3-14B-INT4-AWQ模型,突然发现上…...

Stable Diffusion XL 1.0开源模型新实践:灵感画廊GitHub仓库结构导读

Stable Diffusion XL 1.0开源模型新实践:灵感画廊GitHub仓库结构导读 1. 项目概览:当AI艺术遇见诗意交互 灵感画廊(Atelier of Light and Shadow)是一个基于Stable Diffusion XL 1.0打造的沉浸式艺术创作工具。与常见的工业化AI…...

Phi-4-mini-reasoning人工智能伦理评估框架初探

Phi-4-mini-reasoning人工智能伦理评估框架初探 1. 引言:当AI开始监督AI 最近测试Phi-4-mini-reasoning模型时,发现一个有趣现象:这个擅长逻辑推理的小型模型,在分析其他AI生成内容时展现出惊人的"挑错"能力。它能准确…...

很多人对渗透测试工程师的认知停留在“模拟黑客攻击”,但实际工作内容远比这更全面。

在上一篇渗透测试入门指南发布后,很多粉丝私信我:“成为一名合格的渗透测试工程师,到底需要具备哪些硬实力?”“入行后该如何规划职业路径,避免原地踏步?”“企业招聘时更看重哪些技能和经验?”…...

OpenClaw模型热切换:Qwen3-14b_int4_awq与ChatGLM3动态路由实验

OpenClaw模型热切换:Qwen3-14b_int4_awq与ChatGLM3动态路由实验 1. 为什么需要模型热切换 上周我在处理一个自动化任务时遇到了典型困境:让OpenClaw帮我生成Python爬虫代码时,ChatGLM3给出的方案总是过于保守;而让它写产品文案时…...

Zephyr SMF轻量状态机实战与嵌入式开发优化

1. 项目概述"Zephyr SMF实战:几百行代码实现轻量状态机!"这个标题立刻让我想起了在嵌入式开发中经常遇到的状态管理难题。作为一名在RTOS领域摸爬滚打多年的开发者,我深知状态机在嵌入式系统中的重要性——它就像交通信号灯控制系统…...

泛微流程表单字段后面添加单位,且控制文本框长度确保单位显示不会换行

泛微流程表单字段后面添加单位 泛微流程表单可以在一个位置插入多个内容,这个时候就可以添加文本类型的单位上去。但是很多笔记本页面是会放大网页比例的,就会导致该单位会换行。所以可以通过控制单元格width的方式来避免文本框太长导致的换行 在模版中插…...

芒果文件编码转换工具 非常好用的代码转ANSI转UTF8格式小工具

群里的大佬 写的小工具 试了下很好用 下载链接...

优化开发流程:TensorFlow-v2.9镜像Docker化部署,比PyTorch传统安装更易维护

优化开发流程:TensorFlow-v2.9镜像Docker化部署,比PyTorch传统安装更易维护 1. 深度学习环境部署的痛点与解决方案 在深度学习项目开发中,环境配置往往是第一个拦路虎。想象一下这样的场景:你刚拿到一台全新的GPU服务器&#xf…...

ESPS USB MSC 调试全过程记录氏

背景 在软件开发的漫长旅途中,"构建"这个词往往让人又爱又恨。爱的是,一键点击,代码变成产品,那是程序员最迷人的时刻;恨的是,维护那一堆乱糟糟的构建脚本,简直是噩梦。 在很多项目中…...

Pixel Mind Decoder 创意应用展示:AI 驱动的情感化故事生成器

Pixel Mind Decoder 创意应用展示:AI 驱动的情感化故事生成器 1. 当AI学会感知情绪 你有没有想过,一个故事生成器不仅能理解文字,还能感知情绪?这就是我们最新开发的"情感化故事生成器"的核心能力。通过结合Pixel Min…...

开源大模型实战:StructBERT中文句子相似度工具在舆情监测中的关键词语义泛化应用

开源大模型实战:StructBERT中文句子相似度工具在舆情监测中的关键词语义泛化应用 1. 引言 你有没有遇到过这样的问题?在社交媒体上,用户对同一个产品功能,会用完全不同的词语来表达。比如,有人说“手机电池很耐用”&…...

Face Swap API 集成与使用指南

在当今数字化时代,图像处理技术越来越受到开发者的关注。Face Swap API 是一个强大的工具,它能够将目标图像中的人脸与源图像中的人脸进行交换。本文将详细介绍如何集成和使用 Face Swap API,帮助你快速上手这项技术。 简介 Face Swap API …...

工业水质快检试剂盒怎么选?这家国产品牌值得关注

在工业水处理与环境监测领域,快速、准确的水质检测是保障生产安全和环保合规的关键环节。传统实验室检测流程复杂、耗时长,难以满足现场快速筛查和应急决策需求。面对这一行业痛点,水质快检试剂盒凭借操作简便、响应迅速的特点,正…...

宝塔面板网站出现MySQL连接超时丢失怎么解决_合理增大max_allowed_packet和超时等待参数

MySQL连接超时丢失主因是max_allowed_packet过小或wait_timeout/interactive_timeout设置不当,需同步调大并重启MySQL验证生效。MySQL 连接超时丢失的典型表现页面报错 Lost connection to MySQL server during query 或 MySQL server has gone away,尤其…...

等离子处理机选型指南:从工艺需求到方案落地

在制造业转型升级的浪潮中,等离子表面处理技术正成为解决材料附着力难题的关键手段。面对市场上真空型、大气型、刻蚀型等多样化设备,企业该如何匹配自身需求?本文基于深圳市方瑞科技有限公司的实践案例,系统解析等离子处理机的选…...

TP8308内置 MOS 平均电流型 LED 降压恒流驱动器

概述 TP8308 是一款工作在固定关断时间控制模式的降压型LED 恒流驱动器,用于高效地驱动多颗 LED。TP8308 采用了平均电流型的闭环恒流方式,系统应用时输出电流对电感变化不敏感。这极大的提高了输出电流的恒流精度,特别适用于 5~100V 输入电压…...

Phi-4-mini-reasoning辅助软件测试:智能生成测试用例与缺陷推理

Phi-4-mini-reasoning辅助软件测试:智能生成测试用例与缺陷推理 1. 引言:当AI遇见软件测试 "昨天又加班到凌晨,就为了赶测试用例..."这是测试工程师小王的日常吐槽。在软件测试领域,编写全面的测试用例和发现潜在缺陷…...

Microsoft Agent Framework Skills 执行 Scripts(实战指南)珊

本文能帮你解决什么? 1. 搞懂FastAPI异步(async/await)到底在什么场景下能真正提升性能。 2. 掌握在FastAPI中正确使用多线程处理CPU密集型任务的方法。 3. 避开常见的坑(比如阻塞操作、数据库连接池耗尽、GIL限制)。 …...

行李包安检的设计(论文+CAD图纸+proe三维+SolidWorks三维图+ANSYS源文件+论文答辩PPT)

行李包安检系统是保障公共安全的关键环节,其设计需兼顾检测效率、结构稳定性与操作便捷性。通过系统整合CAD图纸、ProE三维模型、SolidWorks三维图及ANSYS源文件,可实现从二维布局到三维结构再到力学性能的全方位优化。CAD图纸用于精准规划设备整体轮廓与…...

GraphRAG 安装与使用教程

一、GraphRAG 简介 GraphRAG(Graph Retrieval-Augmented Generation)是由微软研究院开发的基于知识图谱的检索增强生成框架。它通过构建结构化的知识图谱来增强大语言模型(LLM)的推理能力,相比传统 RAG 方法在处理复杂…...

灵毓秀-牧神-造相Z-Turbo创作实战:如何写出高质量提示词生成精美图片

灵毓秀-牧神-造相Z-Turbo创作实战:如何写出高质量提示词生成精美图片 1. 认识灵毓秀-牧神-造相Z-Turbo模型 1.1 模型特点与优势 灵毓秀-牧神-造相Z-Turbo是一款专为《牧神记》IP定制的文生图AI模型,基于Z-Image-Turbo架构进行深度优化。与通用文生图模…...

用LiuJuan Z-Image做创意设计:生成概念艺术人像与角色设定图

用LiuJuan Z-Image做创意设计:生成概念艺术人像与角色设定图 你是否曾经为角色设计而苦恼?无论是游戏角色、小说人物还是品牌IP形象,传统设计流程往往需要反复修改草图、调整细节,耗费大量时间。现在,借助LiuJuan Z-I…...