《Pinia 从入门到精通》Vue 3 官方状态管理 -- 基础入门篇

news2025/4/25 18:09:07

《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.tsmain.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 是围绕三个核心概念构建的:StateGetterAction,这三者构成了所有 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.name
      this.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 中
Statereactive存储响应式数据data
Gettercomputed派生属性、自动缓存computed
Action普通函数/方法封装业务逻辑,支持异步、状态更新等methods

理解这三者后,你就掌握了 Pinia 的全部运行机制。它不再区分 mutation 与 action,让状态管理更加直观、自由。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2342612.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java技术体系的主要产品线详解

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

‌机器学习快速入门--0算力起步实践篇

在学习人工智能的过程中&#xff0c;显卡是必不可少的工具&#xff0c;但它的成本较高且更新换代速度很快。那么&#xff0c;没有GPU的情况下如何学习人工智能呢&#xff1f;以下是针对普通电脑与有算力环境分离的学习规划方案&#xff0c;尤其适合前期无GPU/云计算资源的学习者…

源码篇 剖析 Vue2 双向绑定原理

前置操作 源码代码仓地址&#xff1a;https://github.com/vuejs/vue/tree/main 1.查看源码当前版本 当前版本为 v2.7.16 2.Clone 代码 在【Code】位置点击&#xff0c;复制 URL 用于 Clone 代码 3.执行 npm install 4.执行 npm run dev 前言 在 Vue 中最经典的问题就是双…

单例模式与消费者生产者模型,以及线程池的基本认识与模拟实现

前言 今天我们就来讲讲什么是单例模式与线程池的相关知识&#xff0c;这两个内容也是我们多线程中比较重要的内容。其次单例模式也是我们常见设计模式。 单例模式 那么什么是单例模式呢&#xff1f;上面说到的设计模式又是什么&#xff1f; 其实单例模式就是设计模式的一种。…

STM32配置系统时钟

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

React 与 Vue:两大前端框架的深度对比

在前端开发领域&#xff0c;React 和 Vue 无疑是当下最受欢迎的两大框架。它们各自拥有独特的优势和特点&#xff0c;吸引了大量开发者。无论是初学者还是经验丰富的工程师&#xff0c;选择 React 还是 Vue 都是一个常见的问题。本文将从多个角度对 React 和 Vue 进行对比&…

Java24新增特性

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

Sentinel源码—6.熔断降级和数据统计的实现一

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

Volcano 实战快速入门 (一)

一、技术背景 随着大型语言模型&#xff08;LLM&#xff09;的蓬勃发展&#xff0c;其在 Kubernetes (K8s) 环境下的训练和推理对资源调度与管理提出了前所未有的挑战。这些挑战主要源于 LLM 对计算资源&#xff08;尤其是 GPU&#xff09;的巨大需求、分布式任务固有的复杂依…

用交换机连接两台电脑,电脑A读取/写电脑B的数据

1、第一步&#xff0c;打开控制面板中的网络和共享中心&#xff0c;如下图配置&#xff0c;电脑A和电脑B均要配置&#xff1b; 注意&#xff1a;要保证电脑A和电脑B在同一子网掩码下&#xff0c;不同的IP地址&#xff1b; 2、在电脑上同时按‘CommandR’&#xff0c;在弹出的输…

问道数码兽 怀旧剧情回合手游源码搭建教程(反查重优化版)

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

WLAN共享给以太网后以太网IP为169.254.xx.xx以及uboot无法使用nfs下载命令的的解决方案

WLAN共享网络给以太网&#xff0c;实际上是把以太网口当作一个路由器&#xff0c;这个路由器的IP是由WLAN给他分配的&#xff0c;169.254.xx.xx是windows设定的ip&#xff0c;当网络接口无法从上一级网络接口获得ip时&#xff0c;该网络接口的ip被设置为169.254 &#xff0c;所…

ROS 快速入门教程03

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

在 macOS 上合并 IntelliJ IDEA 的项目窗口

在使用 IntelliJ IDEA 开发时&#xff0c;可能会打开多个项目窗口&#xff0c;这可能会导致界面变得混乱。为了提高工作效率&#xff0c;可以通过合并项目窗口来简化界面。本文将介绍如何在 macOS 上合并 IntelliJ IDEA 的项目窗口。 操作步骤 打开 IntelliJ IDEA: 启动你的 I…

基于多用户商城系统的行业资源整合模式与商业价值探究

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

Three.js + React 实战系列 : 从零搭建 3D 个人主页

可能你对tailiwindcss毫不了解&#xff0c;别紧张&#xff0c;记住我们只是在学习&#xff0c;学习的是作者的思想和技巧&#xff0c;并不是某一行代码。 在之前的几篇文章中&#xff0c;我们已经熟悉了 Three.js 的基本用法&#xff0c;并通过 react-three-fiber 快速构建了一…

如何用大模型技术重塑物流供应链

摘要 在数字化转型加速的背景下&#xff0c;大模型技术凭借其强大的数据分析、逻辑推理和决策优化能力&#xff0c;正成为物流供应链领域的核心驱动力。本文深入探讨大模型如何通过需求预测、智能调度、供应链协同、风险管控等关键环节&#xff0c;推动物流行业从 "经验驱…

【银河麒麟高级服务器操作系统】磁盘只读问题分析

系统环境及配置 系统环境 物理机/虚拟机/云/容器 虚拟机 网络环境 外网/私有网络/无网络 私有网络 硬件环境 机型 KVM Virtual Machine 处理器 Kunpeng-920 内存 32 GiB 整机类型/架构 arm64 固件版本 EFI Development Kit II / OVMF 软件环境 具体操作系统版…

机器视觉的智能手机屏贴合应用

在智能手机制造领域&#xff0c;屏幕贴合工艺堪称"微米级的指尖芭蕾"。作为影响触控灵敏度、显示效果和产品可靠性的关键工序&#xff0c;屏幕贴合精度直接决定了用户体验。传统人工对位方式已无法满足全面屏时代对极窄边框和超高屏占比的严苛要求&#xff0c;而Mast…

AIM Robotics电动胶枪:智能分配,让机器人点胶涂胶精准无误

在现代工业自动化和智能制造领域&#xff0c;精确的液体分配技术正成为提升生产效率和产品质量的重要因素。AIM Robotics作为这一领域的创新者&#xff0c;提供了多种高效、灵活的点胶涂胶分配解决方案。本文将带您了解AIM Robotics的核心技术、产品系列以及在各行业的成功应用…