《Pinia 从入门到精通》Vue 3 官方状态管理 -- 基础入门篇
《Pinia 从入门到精通》Vue 3 官方状态管理 – 基础入门篇
《Pinia 从入门到精通》Vue 3 官方状态管理 – 进阶使用篇
《Pinia 从入门到精通》Vue 3 官方状态管理 – 插件扩展篇
📖 教程目录
- 为什么选择 Pinia?
- 1.1 背景介绍
- 1.2 Vuex 的痛点(对比说明)
- 1.3 Pinia 的优势
- 1.4 使用场景
- 安装与快速上手
- 2.1 安装 Pinia
- 2.2 在项目中注册 Pinia
- 2.3 创建第一个 Store
- 2.4 在组件中使用 Store
- 2.5 使用 DevTools 调试
- 2.6 快速回顾
- ✅ 小结
- 核心概念解析 —— State、Getter、Action 深入理解
- 3.1 State —— 响应式数据源
- ✅ 定义方式
- ✅ 特点
- 📌 使用建议
- 3.2 Getter —— 派生计算属性
- ✅ 定义方式
- ✅ 特点
- 📌 使用建议
- 3.3 Action —— 方法逻辑封装
- ✅ 定义方式
- ✅ 特点
- 📌 使用建议
- 3.4 示例整合
- ✅ 小结
为什么选择 Pinia?
1.1 背景介绍
Vuex 是 Vue 2 时代的官方状态管理库,但到了 Vue 3,Pinia 成为了 Vue 官方推荐的新一代状态管理解决方案。Pinia 的设计理念更贴近 Vue 3 的 Composition API,同时解决了 Vuex 中的一些设计痛点。
1.2 Vuex 的痛点(对比说明)
问题 | Vuex 表现 | Pinia 改进 |
---|---|---|
API 复杂 | 四个概念:state, mutation, action, getter | 仅需 state, getter, action,简洁直观 |
类型支持差 | TypeScript 体验差,类型推导复杂 | TS 完善支持,store 类型自动推导 |
严格模式限制 | mutation 强制同步,异步处理不直观 | action 中自由处理异步逻辑 |
模块嵌套繁琐 | 多模块配置臃肿、调试困难 | 每个 store 独立定义、组合灵活 |
1.3 Pinia 的优势
- 📦 极简 API:你甚至可以用纯 JavaScript 写出 Vuex 的一半代码量
- ⚙️ 完美支持 TypeScript:无须手动类型推导
- 🚀 原生支持 Devtools,调试体验极佳
- 🧩 插件机制灵活,生态成熟
- 🌱 无需注册、按需使用,天然模块化设计
1.4 使用场景
Pinia 适用于所有 Vue 3 项目,尤其推荐在以下场景中使用:
- 中大型项目,状态多、模块复杂
- 需要 SSR 或 Nuxt 支持
- 强类型开发团队,希望完善 TS 体验
- 希望未来迁移方便,避免被 Vuex 设计束缚
好的,接下来我们将从安装 Pinia 开始,快速构建第一个 Store,并在 Vue 组件中使用它。
安装与快速上手
将带你完成以下目标:
- 安装并配置 Pinia
- 创建第一个 Store
- 在组件中使用 State、Getter、Action
- 初识 DevTools 与响应式调试
2.1 安装 Pinia
在 Vue 3 项目中安装 Pinia 非常简单:
npm install pinia
# 或
yarn add pinia
# 或
pnpm add pinia
2.2 在项目中注册 Pinia
以 Vite + Vue 3 项目为例,在 main.ts
或 main.js
中注册 Pinia:
// main.ts
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'const app = createApp(App)
app.use(createPinia()) // 注册 Pinia
app.mount('#app')
2.3 创建第一个 Store
Pinia 中的 Store 是一个函数,通常我们放在 stores
文件夹下,每个 Store 文件代表一个独立模块。
// stores/counter.ts
import { defineStore } from 'pinia'export const useCounterStore = defineStore('counter', {state: () => ({count: 0,name: 'Pinia Demo'}),getters: {doubleCount: (state) => state.count * 2},actions: {increment() {this.count++},async fetchCountFromServer() {const result = await fetch('/api/count').then(res => res.json())this.count = result.count}}
})
2.4 在组件中使用 Store
我们在组件中使用 Store 的方式如下,注意 useCounterStore()
是一个函数,必须在 setup()
中调用:
<script setup lang="ts">
import { useCounterStore } from '@/stores/counter'const counter = useCounterStore()function handleClick() {counter.increment()
}
</script><template><div><p>当前计数:{{ counter.count }}</p><p>计数翻倍:{{ counter.doubleCount }}</p><button @click="handleClick">+1</button></div>
</template>
2.5 使用 DevTools 调试
Pinia 默认集成了 Vue DevTools。打开浏览器的开发者工具,切换到 “Pinia” 标签页:
- 可实时查看 Store 中的
state
- 支持时间旅行(Time-travel Debugging)
- 可跟踪每一次
action
的调用和参数
2.6 快速回顾
名称 | 说明 |
---|---|
state | 存储响应式状态 |
getter | 计算属性,依赖 state,具缓存能力 |
action | 可执行逻辑(同步/异步),可以修改 state |
defineStore | 定义一个 Store 函数 |
useXXXStore | 在组件中访问 Store,命名建议以 use 开头 |
✅ 小结
通过本章,你已经完成了从安装、配置、到创建并使用第一个 Pinia Store 的全过程。你应该已经能够在项目中灵活使用 state、getter 与 action,并通过 DevTools 进行调试。
好的,以下是第三章:核心概念解析的完整内容。我们将深入理解 Pinia 的核心组成部分,并结合实用示例与图示进行讲解,为后续进阶打下坚实基础。
核心概念解析 —— State、Getter、Action 深入理解
Pinia 是围绕三个核心概念构建的:State、Getter 和 Action,这三者构成了所有 Store 的基石。
3.1 State —— 响应式数据源
✅ 定义方式
在 defineStore
中通过 state: () => ({})
返回一个对象,即为该 Store 的状态树。
state: () => ({count: 0,userInfo: { name: 'Alice', age: 25 }
})
✅ 特点
- 是响应式的(由
reactive
封装) - 可直接在组件中解构使用
- 会被持久化插件等作为数据源操作
📌 使用建议
- 状态初始值应明确,不使用
undefined
- 尽量避免嵌套过深(会增加调试成本)
3.2 Getter —— 派生计算属性
✅ 定义方式
类似 Vue 的 computed 属性,依赖 State 自动更新,具备缓存能力。
getters: {doubleCount: (state) => state.count * 2,userSummary: (state) => `${state.userInfo.name} (${state.userInfo.age})`
}
✅ 特点
- Getter 本质是
computed
- 可以使用
this
访问其他 getter 和 state
getters: {doubleCount: (state) => state.count * 2,tripleCount() {return this.doubleCount + this.count}
}
📌 使用建议
- 用于展示层逻辑,避免副作用(不要在 getter 中修改 state)
- 可以将复杂的 UI 显示逻辑移入 getter,保持组件简洁
3.3 Action —— 方法逻辑封装
✅ 定义方式
类似 Vue 的 methods,用于封装业务逻辑。支持异步、可直接修改 state。
actions: {increment() {this.count++},async loadUser() {const data = await fetch('/api/user').then(res => res.json())this.userInfo = data}
}
✅ 特点
- 可以包含异步逻辑(使用 async/await)
- 可组合调用其他 actions
- 可接收参数
actions: {updateUserName(name: string) {this.userInfo.name = name}
}
📌 使用建议
- 所有数据修改逻辑应封装到 Action 中,保持一致性
- 异步请求、表单提交、事件处理等建议全部写在 Action 中
3.4 示例整合
// stores/user.ts
import { defineStore } from 'pinia'export const useUserStore = defineStore('user', {state: () => ({name: 'Alice',age: 25}),getters: {summary: (state) => `${state.name}, 年龄 ${state.age}`},actions: {setName(newName: string) {this.name = newName},async fetchUser() {const data = await fetch('/api/user').then(res => res.json())this.name = data.namethis.age = data.age}}
})
组件中使用:
<script setup lang="ts">
import { useUserStore } from '@/stores/user'const userStore = useUserStore()function changeName() {userStore.setName('Bob')
}
</script><template><div><p>{{ userStore.summary }}</p><button @click="changeName">修改名字</button></div>
</template>
✅ 小结
概念 | 本质 | 功能 | 类比 Vue 中 |
---|---|---|---|
State | reactive | 存储响应式数据 | data |
Getter | computed | 派生属性、自动缓存 | computed |
Action | 普通函数/方法 | 封装业务逻辑,支持异步、状态更新等 | methods |
理解这三者后,你就掌握了 Pinia 的全部运行机制。它不再区分 mutation 与 action,让状态管理更加直观、自由。
相关文章:
《Pinia 从入门到精通》Vue 3 官方状态管理 -- 基础入门篇
《Pinia 从入门到精通》Vue 3 官方状态管理 – 基础入门篇 《Pinia 从入门到精通》Vue 3 官方状态管理 – 进阶使用篇 《Pinia 从入门到精通》Vue 3 官方状态管理 – 插件扩展篇 📖 教程目录 为什么选择 Pinia?1.1 背景介绍1.2 Vuex 的痛点(对…...

Java技术体系的主要产品线详解
Java技术体系的主要产品线详解 Java Card:支持Java小程序(Applets)运行在小内存设备(如智能卡)上的平台。 Java ME(Micro Edition):支持Java程序运行在移动终端(手机、P…...

机器学习快速入门--0算力起步实践篇
在学习人工智能的过程中,显卡是必不可少的工具,但它的成本较高且更新换代速度很快。那么,没有GPU的情况下如何学习人工智能呢?以下是针对普通电脑与有算力环境分离的学习规划方案,尤其适合前期无GPU/云计算资源的学习者…...
MySQL 详解之索引:提升查询效率的秘密武器
在数据库的世界里,数据量通常是巨大的。想象一下,一个拥有数百万甚至数十亿条记录的表格,如果你需要从中查找符合特定条件的几条甚至一条记录,数据库是如何快速找到它们的呢?如果没有高效的机制,数据库不得不一条条地遍历整个表格,这无疑会非常缓慢和耗费资源。这时,索…...
中通 Redis 集群从 VM 迁移至 PVE:技术差异、PVE 优劣势及应用场景深度解析
在数字化转型浪潮下,企业对服务器资源的高效利用与成本控制愈发重视。近期,中通快递将服务器上的 Redis 集群服务从 VM(VMware 虚拟化技术)迁移至 PVE(Proxmox VE),这一技术举措引发了行业广泛关…...

源码篇 剖析 Vue2 双向绑定原理
前置操作 源码代码仓地址:https://github.com/vuejs/vue/tree/main 1.查看源码当前版本 当前版本为 v2.7.16 2.Clone 代码 在【Code】位置点击,复制 URL 用于 Clone 代码 3.执行 npm install 4.执行 npm run dev 前言 在 Vue 中最经典的问题就是双…...
Restful接口学习
一、为什么RESTful接口是数据开发的核心枢纽? 在数据驱动的时代,RESTful接口如同数据高速公路上的收费站,承担着数据交换的核心职责。数据工程师每天需要面对: 异构系统间的数据交互(Hadoop集群 ↔ 业务系统…...
C++ round 函数笔记 (适用于算法竞赛)
在算法竞赛中,处理浮点数并将其转换为整数是常见的需求,round 函数是标准库提供的用于执行“四舍五入”到最近整数的工具。理解其工作方式和潜在问题对于避免错误至关重要。 1. 基本用法 头文件 要使用 round 函数,需要包含 <cmath>…...
1.5软考系统架构设计师:架构师的角色与能力要求 - 超简记忆要点、知识体系全解、考点深度解析、真题训练附答案及解析
超简记忆要点 角色职责 需求规划→架构设计→质量保障 能力要求 技术(架构模式/性能优化) 业务(模型抽象→技术方案) 管理(团队协作/风险控制) 知识体系 基础:CAP/设计模式/网络协议案例&am…...

单例模式与消费者生产者模型,以及线程池的基本认识与模拟实现
前言 今天我们就来讲讲什么是单例模式与线程池的相关知识,这两个内容也是我们多线程中比较重要的内容。其次单例模式也是我们常见设计模式。 单例模式 那么什么是单例模式呢?上面说到的设计模式又是什么? 其实单例模式就是设计模式的一种。…...
JAVA程序获取SVN提交记录
1.获取文件提交记录 private String userName "userName "; //svn账号 private String password "password "; //svn密码 private String urlString "urlString "; //svnurl 换成自己对应的svn信息 package com.tengzhi.common.dao;import…...

STM32配置系统时钟
1、STM32配置系统时钟的步骤 1、系统时钟配置步骤 先配置系统时钟,后面的总线才能使用时钟频率 2、外设时钟使能和失能 STM32为了低功耗,一开始是关闭了所有的外设的时钟,所以外设想要工作,首先就要打开时钟,所以后面…...

React 与 Vue:两大前端框架的深度对比
在前端开发领域,React 和 Vue 无疑是当下最受欢迎的两大框架。它们各自拥有独特的优势和特点,吸引了大量开发者。无论是初学者还是经验丰富的工程师,选择 React 还是 Vue 都是一个常见的问题。本文将从多个角度对 React 和 Vue 进行对比&…...
Node.js 学习入门指南
Node.js 学习入门指南 Node.js 是一种流行的开源、跨平台的 JavaScript 运行时环境,它使开发者能够在服务器端运行JavaScript代码。本篇文章旨在帮助初学者快速入门并掌握Node.js的基础知识和常用技巧。 一、什么是Node.js? 定义 Node.js 是一个基于…...

Java24新增特性
Java 24(Oracle JDK 24)作为Java生态的重要更新,聚焦AI开发支持、后量子安全、性能优化及开发者效率提升,带来20余项新特性和数千项改进。以下是核心特性的分类解析: 一、语言特性增强:简化代码与模式匹配 …...

Sentinel源码—6.熔断降级和数据统计的实现一
大纲 1.DegradeSlot实现熔断降级的原理与源码 2.Sentinel数据指标统计的滑动窗口算法 1.DegradeSlot实现熔断降级的原理与源码 (1)熔断降级规则DegradeRule的配置Demo (2)注册熔断降级监听器和加载熔断降级规则 (3)DegradeSlot根据熔断降级规则对请求进行验证 (1)熔断降级…...

Volcano 实战快速入门 (一)
一、技术背景 随着大型语言模型(LLM)的蓬勃发展,其在 Kubernetes (K8s) 环境下的训练和推理对资源调度与管理提出了前所未有的挑战。这些挑战主要源于 LLM 对计算资源(尤其是 GPU)的巨大需求、分布式任务固有的复杂依…...
快速体验tftp文件传输(嵌入式设备)
一、参考资料 Linux tftp 命令 | 菜鸟教程 Ubuntu最新版本(Ubuntu22.04LTS)安装Tftp服务及其使用教程-CSDN博客 Windows下的Tftpd32(Tftpd64)软件下载和使用教程-集成了Tftp服务器、客户端-CSDN博客 tftpd32 tftpd64文件传输安装和使用教程【图文并茂】-CSDN博客 二、快速…...

用交换机连接两台电脑,电脑A读取/写电脑B的数据
1、第一步,打开控制面板中的网络和共享中心,如下图配置,电脑A和电脑B均要配置; 注意:要保证电脑A和电脑B在同一子网掩码下,不同的IP地址; 2、在电脑上同时按‘CommandR’,在弹出的输…...

问道数码兽 怀旧剧情回合手游源码搭建教程(反查重优化版)
本文将对"问道数码兽"这一经典卡通风格回合制手游的服务端部署与客户端调整流程进行详细拆解,适用于具备基础 Windows 运维和手游源码调试经验的开发者参考使用。教程以实战为导向,基于原始说明内容重构优化,具备较高的内容查重避重…...

WLAN共享给以太网后以太网IP为169.254.xx.xx以及uboot无法使用nfs下载命令的的解决方案
WLAN共享网络给以太网,实际上是把以太网口当作一个路由器,这个路由器的IP是由WLAN给他分配的,169.254.xx.xx是windows设定的ip,当网络接口无法从上一级网络接口获得ip时,该网络接口的ip被设置为169.254 ,所…...
Gazebo 仿真环境系列教程(一):环境安装与基础使用
文章目录 一、版本说明与技术背景1.1 Gazebo 版本分支1.2 版本选择建议 二、系统环境准备2.1 硬件要求2.2 软件依赖 三、Gazebo Garden 安装流程3.1 添加官方软件源3.2 执行安装命令3.3 环境验证 四、Gazebo Classic 安装方法4.1 添加软件仓库4.2 安装核心组件4.3 验证安装 五、…...

ROS 快速入门教程03
8.编写Subscriber订阅者节点 8.1 创建订阅者节点 cd catkin_ws/src/ catkin_create_pkg atr_pkg rospy roscpp std_msgs ros::Subscriber sub nh.subscribe(话题名, 缓存队列长度, 回调函数) 回调函数通常在你创建订阅者时定义。一个订阅者会监听一个话题,并在有…...

在 macOS 上合并 IntelliJ IDEA 的项目窗口
在使用 IntelliJ IDEA 开发时,可能会打开多个项目窗口,这可能会导致界面变得混乱。为了提高工作效率,可以通过合并项目窗口来简化界面。本文将介绍如何在 macOS 上合并 IntelliJ IDEA 的项目窗口。 操作步骤 打开 IntelliJ IDEA: 启动你的 I…...
SEO(Search Engine Optimization,搜索引擎优化)相关知识点
SEO(Search Engine Optimization)是指搜索引擎优化,是计算机领域中通过技术手段和内容策略,提升网站在搜索引擎(如Google、Bing、百度)中自然(非付费)排名的系统性方法。是一种通过优…...
C#森林中的兔子(力扣题目)
C#森林中的兔子(力扣题目) 题目介绍 森林中有未知数量的兔子。提问其中若干只兔子 “还有多少只兔子与你(指被提问的兔子)颜色相同?” ,将答案收集到一个整数数组 answers 中,其中 answers[i] 是第 i 只兔子的回答。 给你数组…...

基于多用户商城系统的行业资源整合模式与商业价值探究
随着电子商务的蓬勃发展,传统的单一商家电商模式逐渐显现出一定的局限性。为了解决商家成本过高、市场竞争激烈等问题,多用户商城系统应运而生,成为一种新型的电商平台模式。通过整合行业资源,这种模式不仅极大地提升了平台和商家…...

Three.js + React 实战系列 : 从零搭建 3D 个人主页
可能你对tailiwindcss毫不了解,别紧张,记住我们只是在学习,学习的是作者的思想和技巧,并不是某一行代码。 在之前的几篇文章中,我们已经熟悉了 Three.js 的基本用法,并通过 react-three-fiber 快速构建了一…...

如何用大模型技术重塑物流供应链
摘要 在数字化转型加速的背景下,大模型技术凭借其强大的数据分析、逻辑推理和决策优化能力,正成为物流供应链领域的核心驱动力。本文深入探讨大模型如何通过需求预测、智能调度、供应链协同、风险管控等关键环节,推动物流行业从 "经验驱…...
敏捷开发管理流程
以下是敏捷开发管理流程的详细说明,包含流程框架、关键步骤及案例示例: 敏捷开发管理流程 1. 敏捷核心原则 迭代交付:分小周期(Sprint)交付可工作的软件,通常2~4周为一个迭代。用户需求驱动:以…...