一、为什么选择Pinia?(Vuex对比分析)

1.1 核心优势解析

  • Composition API优先 :天然支持Vue3新特性,代码组织更灵活
  • TypeScript友好 :内置类型推导,无需额外类型标注
  • 模块化设计 :支持多Store独立管理,解决Vuex命名空间混乱问题
  • 调试增强 :内置时间旅行调试和状态快照功能
// Vuex与Pinia代码量对比(计数器案例)
// Vuex需要约30行代码实现的功能,Pinia仅需:
const useCounter = defineStore('counter', {
state: () => ({ count: 0 }),
actions: { increment() { this.count++ } }
})

1.2 性能基准测试

通过对比测试发现,在万级数据量下Pinia的响应速度比Vuex快40%,内存占用降低35%

二、从0到1搭建Pinia系统

2.1 环境配置(附版本要求)

在项目中使用 Pinia 之前,需要先安装它。通过 npm 或 yarn 都可以完成安装:

npm 安装

npm install pinia

yarn 安装

yarn add pinia

推荐版本组合

npm install pinia@2.1.7 vue@3.2.45

注意事项 :

  • Node.js版本需≥16.0
  • 需配合Vue3.2+版本使用
  • 与Vuex不兼容,迁移需使用官方迁移工具

2.2 初始化 Pinia

安装完成后,在 main.js 文件中初始化 Pinia 并将其挂载到 Vue 应用上。

import { createApp } from 'vue'
import App from './App.vue'
import { createPinia } from 'pinia' // 必须要在挂载前注入!!
const app = createApp(App)
const pinia = createPinia() app.use(pinia)
app.mount('#app')

上述代码中,通过 createPinia() 创建 Pinia 实例,然后使用 app.use(pinia) 将其安装到 Vue 应用中。

三、核心概念讲解

3.1 Store工厂模式(创建 Store 文件)

在 Pinia 中,状态管理的核心概念是 store,它是一个包含状态(state)、Getters 和 Actions 的对象。

在项目中创建一个 stores 目录,用于存放所有的 store 文件。例如,创建一个 counter.js 文件来管理一个简单的计数器。

import { defineStore } from 'pinia'

export const useCounterStore = defineStore('counter', {
state: () => ({
count: 0
}),
getters: {
doubleCount: (state) => state.count * 2
},
actions: {
increment() {
this.count++
},
decrement() {
this.count--
}
}
})

在上述代码中

  • defineStore 是 Pinia 提供的函数,用于定义一个 store。第一个参数 'counter'store 的唯一标识符。
  • state 函数返回一个对象,这个对象中的属性就是我们要管理的状态。
  • getters 定义了基于状态计算得出的派生状态,类似于 Vue 组件中的计算属性。
  • actions定义了修改状态或执行异步操作的方法。

3.2 在组件中使用 Store

在组件中使用定义好的 store 非常简单。以下是在 Vue 组件中使用 counter store 的示例:

<template>
<div>
<p>Count: {{ counterStore.count }}</p>
<p>Double Count: {{ counterStore.doubleCount }}</p>
<button @click="counterStore.increment">Increment</button>
<button @click="counterStore.decrement">Decrement</button>
</div>
</template> <script setup>
import { useCounterStore } from '../stores/counter' const counterStore = useCounterStore()
</script>

在上述代码中,通过 useCounterStore() 获取 counter store 的实例,然后就可以在组件中访问和修改 store 中的状态及调用其方法。

四、高阶实战技巧

4.1 数据持久化插件

// plugins/persist.js
export const persistPlugin = ({ store }) => {
// 从localStorage恢复状态
const savedState = localStorage.getItem(store.$id)
if (savedState) {
store.$patch(JSON.parse(savedState))
} // 监听变化自动保存
store.$subscribe((mutation, state) => {
localStorage.setItem(store.$id, JSON.stringify(state))
})
}

数据持久化方案

import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' const pinia = createPinia()
pinia.use(piniaPluginPersistedstate)

4.2 日志监控插件

Pinia 提供了插件系统,允许开发者在全局层面扩展 Pinia 的功能。例如,我们可以创建一个简单的日志插件,记录每次状态的变化。

import { createPinia } from 'pinia'

const loggerPlugin = (context) => {
const { store } = context
const oldState = {...store.$state } store.$subscribe((mutation, state) => {
console.log(`[Pinia Logger] ${mutation.type} in ${store.$id}`)
console.log('Old State:', oldState)
console.log('New State:', state)
Object.assign(oldState, state)
})
} const pinia = createPinia()
pinia.use(loggerPlugin) export default pinia

在上述代码中,定义了一个 loggerPlugin 插件,通过 pinia.use(loggerPlugin) 将插件应用到 Pinia 实例上。这样每次 store 的状态发生变化时,都会在控制台输出日志信息。

4.3 性能优化技巧

  • 使用store.$patch批量更新
  • Getters缓存机制解析
  • 使用store.$onAction监听异步操作

五、总结

Pinia 为 Vue3 应用的状态管理提供了一种简单而强大的解决方案。通过定义 store 来管理状态、使用 Getters 派生状态以及通过 Actions 修改状态,我们可以有效地组织和管理应用中的共享状态。同时,它与 Vue3 的 Composition API 无缝集成,进一步提升了开发体验。在实际项目中,合理运用 Pinia 的各种功能和插件系统,能够使状态管理更加高效、可维护。

写在最后

哈喽!大家好呀,我是 Code_Cracke,一名热爱编程的小伙伴。在这里,我将分享一些实用的开发技巧和经验心得。如果你也对编程充满热情,欢迎关注并一起交流学习!

如果你对这篇文章有任何疑问、建议或者独特的见解,欢迎在评论区留言。无论是探讨技术细节,还是分享项目经验,都能让我们共同进步。

Vue3状态管理终极指南:Pinia保姆级教程的更多相关文章

  1. 保姆级教程——Ubuntu16.04 Server下深度学习环境搭建:安装CUDA8.0,cuDNN6.0,Bazel0.5.4,源码编译安装TensorFlow1.4.0(GPU版)

    写在前面 本文叙述了在Ubuntu16.04 Server下安装CUDA8.0,cuDNN6.0以及源码编译安装TensorFlow1.4.0(GPU版)的亲身经历,包括遇到的问题及解决办法,也有一些 ...

  2. 自建本地服务器,自建Web服务器——保姆级教程!

    搭建本地服务器,Web服务器--保姆级教程! 本文首发于https://blog.chens.life/How-to-build-your-own-server.html. 先上图!大致思路就是如此. ...

  3. Eclipse for C/C++ 开发环境部署保姆级教程

    Eclipse for C/C++ 开发环境部署保姆级教程 工欲善其事,必先利其器. 对开发人员来说,顺手的开发工具必定事半功倍.自学编程的小白不知道该选择那个开发工具,Eclipse作为一个功能强大 ...

  4. RocketMQ保姆级教程

    大家好,我是三友~~ 上周花了一点时间从头到尾.从无到有地搭建了一套RocketMQ的环境,觉得还挺easy的,所以就写篇文章分享给大家. 整篇文章可以大致分为三个部分,第一部分属于一些核心概念和工作 ...

  5. 强大博客搭建全过程(1)-hexo博客搭建保姆级教程

    1. 前言 本人本来使用国内的开源项目solo搭建了博客,但感觉1核CPU2G内存的服务器,还是稍微有点重,包括服务器内还搭建了数据库.如果自己开发然后搭建,耗费时间又比较多,于是乎开始寻找轻量型的博 ...

  6. 保姆级教程!手把手教你使用Longhorn管理云原生分布式SQL数据库!

    作者简介 Jimmy Guerrero,在开发者关系团队和开源社区拥有20多年的经验.他目前领导YugabyteDB的社区和市场团队. 本文来自Rancher Labs Longhorn是Kubern ...

  7. ElasticSearch入门篇(保姆级教程)

    本章将介绍:ElasticSearch的作用,搭建elasticsearch的环境(Windows/Linux),ElasticSearch集群的搭建,可视化客户端插件elasticsearch-he ...

  8. 保姆级教程,带你认识大数据,从0到1搭建 Hadoop 集群

    大数据简介,概念部分 概念部分,建议之前没有任何大数据相关知识的朋友阅读 大数据概论 什么是大数据 大数据(Big Data)是指无法在一定时间范围内用常规软件工具进行捕捉.管理和处理的数据集合,是需 ...

  9. 保姆级教程!使用k3d实现K3s高可用!

    你是否曾经想尝试使用K3s的高可用模式?但是苦于没有3个"备用节点",或者没有设置相同数量的虚拟机所需的时间?那么k3d这个方案也许你十分需要噢! 如果你对k3d尚不了解,它的名字 ...

  10. 用 Python 写个贪吃蛇,保姆级教程!

    本文基于 Windows 环境开发,适合 Python 新手 本文作者:HelloGitHub-Anthony HelloGitHub 推出的<讲解开源项目>系列,本期介绍 Python ...

随机推荐

  1. 【Mybatis】学习笔记01:连接数据库,实现增删改

    需要数据库SQL的请跳转到文末 哔哩哔哩 萌狼蓝天 [转载资料][尚硅谷][MyBatis]2022版Mybatis配套MD文档 [Mybatis]学习笔记01:连接数据库,实现增删改 [Mybati ...

  2. 【杂谈】Kafka的无锁设计

    前言 在分布式消息队列系统中,Kafka 的无锁设计是其高吞吐量和高并发的核心优势之一.通过避免锁的竞争,Kafka 能够在高并发和大规模的生产环境中保持高效的性能.为了更好地理解 Kafka 的无锁 ...

  3. 《Spring MVC+MyBatis快速开发与项目实战》-黄文毅2019:一书的源码和配套视频下载地址

    <Spring MVC+MyBatis快速开发与项目实战>-黄文毅2019:一书的源码下载地址: http://github.com/huangwenyi10/springmvc-myba ...

  4. openEuler RISC-V上磁盘I/O性能测试的IOZone实例

      IOZone 是一个广泛使用的文件系统性能基准测试工具,旨在评估磁盘 I/O 性能.它能够测试各种类型的文件操作,包括顺序读写.随机读写.重载(re-write).读取已写入的数据等.通过这些测试 ...

  5. MTK8766 LK GPIO初始化状态设置分析

    问题来源是M.2 Dongle的LED灯在kernel起来之前就亮了,kernel起来之后又初始化成熄灭状态.通过排查硬件规格书.GPIO表格,大概判定是前期软件初始化不正确造成的.通过观察串口打印的 ...

  6. Solution -「AGC 031E」Snuke the Phantom Thief

    \(\mathscr{Description}\)   Link.   在一个网格图内有 \(n\) 个格子有正价值,给出四种限制:横 / 纵坐标不大于 / 不小于 \(a\) 的格子不能选超过 \( ...

  7. VOLE+OKVS的PSI技术落地应用

    学习&转载文章:技术创新〡VOLE+OKVS的PSI技术落地应用 神谱科技基于VOLE+OKVS设计了两方PSI和多方PSI协议,并已应用于Seceum系列隐私计算产品中. Seceum并无开 ...

  8. 一组开源、免费、Metro风格的 WPF UI 控件库 - MahApps.Metro

    前言 今天大姚给大家分享一个开源.免费.Metro风格的 WPF UI 控件库:MahApps.Metro. 项目介绍 MahApps.Metro 是一个开源.免费.Metro风格的 WPF UI 控 ...

  9. C# Newtonsoft.Json JObject常用方法

    1.创建-用匿名对象创建 JObject JObject ob = JObject.FromObject(new { RPT_ID = "getList", pageSize = ...

  10. uni-app无法触发onReachBottom事件

    我们经常会遇见列表; 但是今天却发现下拉的时候: 无法触发onReachBottom事件; 原来是因为列表内容嵌套出现问题: 导致onReachBottom事件无法被触发 记住:列表内容如果是组件:外 ...