【前端学习笔记】Pinia

1.介绍

Pinia 是 Vue 3 中的官方状态管理库,作为 Vuex 的继任者,它为 Vue 3 提供了一个更现代、更灵活、更易用的状态管理解决方案。Pinia 主要用于管理应用中的全局状态,并提供了一个清晰、简洁的 API 来处理复杂的状态逻辑、数据流和副作用。

Pinia 与 Vuex 相比,具有更简洁的 API、更好的 TypeScript 支持、更强的模块化和灵活性。下面是对 Pinia 的详细解读,包括其核心概念、如何使用以及它的一些优势。

  • 更简洁的 API:Pinia 的 API 更加简洁直观,避免了 Vuex 中的一些冗长代码(如 mutations、getters)。
  • TypeScript 原生支持:Pinia 提供了更好的 TypeScript 类型推导和支持,使得开发过程中可以享受更好的类型检查和自动完成功能。
  • 模块化设计:Pinia 支持模块化,每个 store 都可以独立于其他 store 使用,便于拆分和维护。
  • 兼容 Vue 3 和 Composition API:Pinia 与 Vue 3 的 Composition API 紧密集成,提供了一个现代化的、以函数式为核心的状态管理方式。

2.使用

Pinia 是 Vue 3 中的官方状态管理库,作为 Vuex 的继任者,它为 Vue 3 提供了一个更现代、更灵活、更易用的状态管理解决方案。Pinia 主要用于管理应用中的全局状态,并提供了一个清晰、简洁的 API 来处理复杂的状态逻辑、数据流和副作用。

Pinia 与 Vuex 相比,具有更简洁的 API、更好的 TypeScript 支持、更强的模块化和灵活性。下面是对 Pinia 的详细解读,包括其核心概念、如何使用以及它的一些优势。

1. 为什么使用 Pinia?

在 Vue 3 中,Pinia 是为了替代 Vuex 作为更现代、更轻量级的状态管理解决方案。其设计哲学是简洁、灵活、易用,适用于 Vue 3 的 Composition API。相较于 Vuex,Pinia 具有以下优势:

  • 更简洁的 API:Pinia 的 API 更加简洁直观,避免了 Vuex 中的一些冗长代码(如 mutations)。
  • TypeScript 原生支持:Pinia 提供了更好的 TypeScript 类型推导和支持,使得开发过程中可以享受更好的类型检查和自动完成功能。
  • 模块化设计:Pinia 支持模块化,每个 store 都可以独立于其他 store 使用,便于拆分和维护。
  • 兼容 Vue 3 和 Composition API:Pinia 与 Vue 3 的 Composition API 紧密集成,提供了一个现代化的、以函数式为核心的状态管理方式。

2. Pinia 核心概念

Pinia 主要有三个核心概念:

  1. Store

    • Pinia 的核心是 store,它是管理状态的容器,类似于 Vuex 中的 store。每个 store 都是一个包含状态、getter 和 actions 的对象。
    • Store 用来存储应用中的 全局状态,可以在应用中的任意组件之间共享这些状态。
  2. State

    • Pinia 的 store 包含 state,也就是我们管理的应用状态。它通常是一个普通的 JavaScript 对象或者数组,包含了你要在应用中共享的数据。
  3. Actions

    • Pinia 使用 actions 来更新 state 或执行副作用操作。与 Vuex 不同,Pinia 中的 actions 可以直接修改 state,而不需要通过 mutations。

3. 如何使用 Pinia?

首先,在你的 Vue 3 项目中创建一个 Pinia 实例,然后将其传递给 Vue 实例。一般来说,这个步骤会在 main.tsmain.js 中完成。

// main.ts
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'

const app = createApp(App)

// 创建并注册 Pinia 实例
const pinia = createPinia()

app.use(pinia)
app.mount('#app')

在 Pinia 中,每个 store 是通过 defineStore 函数定义的,它接收两个参数:

  • store 的名称。
  • 一个函数,返回 store 的state、getter 和 actions。
// stores/counter.js
import { defineStore } from 'pinia'

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

在上面的代码中,useCounterStore 是一个 store,它包含:

  • state:存储数据的地方。
  • actions:用来修改 state 的方法。
  • getters:计算派生状态的函数,类似于 Vuex 中的 getter。
3.4 使用 Store

在组件中,你可以使用 useCounterStore 来访问和修改 store 中的状态。

<template>
  <div>
    <p>Count: {{ counter.count }}</p>
    <p>Double Count: {{ counter.doubleCount }}</p>
    <button @click="counter.increment">Increment</button>
    <button @click="counter.decrement">Decrement</button>
  </div>
</template>

<script setup>
import { useCounterStore } from './stores/counter'

// 使用 Pinia store
const counter = useCounterStore()
</script>

通过 useCounterStore(),你可以访问 store 中的状态、actions 和 getters。在模板中,直接访问 counter.countcounter.doubleCount 就能显示当前的状态。

Store 的模块化

Pinia 支持将 store 划分为多个模块,每个模块可以包含不同的 state、actions 和 getters,类似于 Vuex 的模块化设计。你可以根据功能模块来组织 store。

例如,你可以在 stores 目录下创建多个文件,分别定义不同的 store。

// stores/user.js
import { defineStore } from 'pinia'

export const useUserStore = defineStore('user', {
  state: () => ({
    name: 'John Doe',
    age: 30
  }),
  actions: {
    updateName(newName) {
      this.name = newName
    }
  }
})

App.vue 中,你可以像使用其他 store 一样使用不同的 store。

import { useUserStore } from './stores/user'

const user = useUserStore()
console.log(user.name)  // 'John Doe'
user.updateName('Jane Doe')

4. Pinia 与 Vuex 的对比

特性PiniaVuex
支持 Vue 3原生支持,专为 Vue 3 设计也支持 Vue 3,但需要额外的配置和适配
API 简洁使用 defineStore 定义 store,简洁明了需要 statemutationsactionsgetters
TypeScript 支持原生支持 TypeScript,类型推导更好支持,但不如 Pinia 高效和简单
模块化本身支持模块化,每个 store 可以独立需要使用 modules 配置来实现模块化
响应式系统使用 Vue 3 的响应式系统,性能更高使用 Vue 2 的响应式系统,性能稍逊
插件生态由于是 Vue 官方推荐,插件逐步增多插件生态成熟,支持很多功能
存储方式store 通过 defineStore 生成,自动响应store 是通过 Vuex 实例创建,配置较多

5. Pinia 的优势

  • 简洁性:Pinia 的 API 简洁明了,没有 Vuex 中的繁琐配置,直接通过 defineStore 创建 store,减少了冗余代码。
  • 类型安全:Pinia 提供了更好的 TypeScript 支持,自动类型推导,使得开发体验更加流畅,尤其在大型项目中,Pinia 的类型检查非常重要。
  • Composition API 集成:Pinia 和 Vue 3 的 Composition API 完美集成,使用 setup() 时非常方便地管理状态。
  • 模块化:Pinia 支持 store 的模块化,可以根据功能进行拆分,易于维护。
  • 性能:Pinia 使用 Vue 3 的响应式系统,性能更优。

Vuex 的 mutations 与 Pinia 的设计差异

Vuex 中,mutations 是修改状态(state)的唯一方式。它被设计成 同步 的函数,负责直接修改 Vuex store 中的 state。这种做法有两个主要原因:

  1. 明确的状态修改轨迹:所有的状态变更都需要通过 mutations,这样就能更清晰地跟踪状态变更,帮助开发者理解状态是如何变化的。
  2. 调试和开发工具的支持:Vuex 提供了完善的开发工具支持,mutations 的存在使得工具能够记录每次状态变更,帮助进行历史追踪和时间旅行调试(Time Travel Debugging)。

Pinia 的设计没有 mutations,它允许直接在 actions 中修改状态,简化了代码结构并提升了灵活性。以下是两者的比较及其优缺点。

为什么 Vuex 需要 mutations

  1. 清晰的状态变更追踪

    • 在 Vuex 中,所有对状态的修改都必须通过 mutations,因此你可以很容易地追踪到哪个 mutation 引起了状态的变化。
    • 这有助于调试和跟踪问题,尤其是当应用规模庞大时。
  2. 同步操作

    • mutations 是同步执行的,这意味着它们是可以预测的(没有异步操作干扰)。这一点对于状态管理和调试来说是非常重要的。
  3. 开发者工具支持

    • Vuex 提供了强大的 Vue Devtools 支持,能够记录每次 mutation 触发的状态变更,并支持时间旅行调试,这使得开发和调试更加容易。

Pinia 为什么不需要 mutations

  1. 简化 API 设计

    • Pinia 摒弃了 mutations,采用了更简洁的 API,允许在 actions 中直接修改状态。
    • 这使得代码更直观,减少了冗余的层级,尤其对于中小型项目来说,能大幅度简化代码。
  2. 灵活的状态修改

    • 在 Pinia 中,actions 不仅可以处理异步逻辑,还能直接修改状态。你不需要再区分异步操作和同步操作,因为它们都可以在同一个地方处理。
    • 这种设计简化了状态管理,不需要显式地创建额外的 mutations 来处理同步操作。
  3. 更符合 Vue 3 Composition API

    • Pinia 作为 Vue 3 的状态管理库,与 Composition API 设计模式紧密结合。Pinia 的 API 与 Vue 3 的设计理念一致,它直接支持响应式数据管理,并让你能够更方便地通过 storestateactions 来操作数据。
    • Pinia 的 API 更符合 Vue 3 的函数式编程范式,使用起来更简洁和灵活。
    • Vuexmutations 提供了清晰的状态变更跟踪,适用于大型应用中对状态变化需要详细审计的情况。Vuex 的设计使得状态变更更加可预测和易于调试,特别是在复杂应用中,这一点非常重要。
    • Pinia 的简化设计摒弃了 mutations,让代码更加简洁和灵活。对于小型和中型应用来说,Pinia 提供了一个更轻量级的解决方案,避免了冗余代码。
    • Vuex:由于 mutations 的存在,Vuex 在设计上有一定的学习曲线,特别是当项目的状态变得复杂时,可能会导致多余的代码和样板代码(如重复的 mutationsactions)。但是,它的优势在于提供了明确的状态修改规范,适用于大型项目或需要严格控制状态的应用。
    • Pinia:通过移除 mutations,Pinia 的 API 更加简洁,减少了开发者需要编写的代码量,适用于更简单的状态管理场景。它使得开发者能够更轻松地使用 Vue 3 Composition API,特别是对于较小或中等规模的项目。
    • Vuex:在 Vuex 中,所有异步操作都必须在 actions 中进行,而 mutations 只能进行同步操作。这意味着你需要清楚区分异步和同步的操作,这可能增加一些复杂度。
    • Pinia:在 Pinia 中,actions 可以同时处理同步和异步操作,不需要区分 mutationsactions。这为开发者提供了更大的灵活性和便利性。
    • Vuex:Vuex 的设计本身会引入一些额外的性能开销,特别是在大规模项目中,mutationsgetters 的结构可能会导致性能下降,尤其是当 store 中的状态变得复杂时。
    • Pinia:Pinia 基于 Vue 3 的响应式系统,设计上更轻量,性能更优。它利用 Vue 3 Composition API 的响应式机制,性能开销较低。
    • Vuex:Vuex 也支持 TypeScript,但需要额外的配置,并且在大型项目中,使用 Vuex 可能会遇到一些类型推导不够智能或冗长的情况。
    • Pinia:Pinia 提供了更好的 TypeScript 支持,类型推导更加智能,适合现代 TypeScript 项目的开发需求。
  • Vuexmutations 适用于大型项目,它提供了更加严格和明确的状态管理方式,能清晰地跟踪和调试状态的变更,尤其在复杂应用中,提供了更加规范和安全的管理。
  • Pinia 的设计更加简洁,摒弃了 mutations,适合较小和中等规模的项目。它提供了更高的灵活性和易用性,尤其是在与 Vue 3 Composition API 配合使用时,简化了代码的书写。

如果你正在开发一个复杂的、需要严格控制状态管理的大型项目,Vuex 可能会更适合。如果你的项目相对较小,或者是使用 Vue 3 的 Composition API,Pinia 将是一个更轻量、更现代的选择。

持久化存储

正常情况下,不刷新浏览器时,store 中的状态和路由会保持不变:

  • 路由变化:在 前端路由(例如 Vue Router 或 React Router)中,路由的变化是由前端 JavaScript 控制的,不会引起页面的重新加载。所以,路由状态和应用的其他状态(如 store 中的数据)会在应用的生命周期内保持不变,直到你主动更改它们。
  • store 状态:在不刷新浏览器的情况下,Pinia 或 Vuex 中的状态会保持不变,组件之间可以共享这个状态,直到你显式地改变它。例如,用户的输入、请求返回的数据、选择的模板等状态都会保留。
    刷新浏览器时,store 中的状态会丢失:
  • 浏览器刷新:当你刷新浏览器时,浏览器会重新加载整个页面,这意味着 JavaScript 的运行环境也会被重新初始化。此时,所有的前端状态(如 store 中的数据)都会被重置,因为它们是保存在 内存 中的,而浏览器刷新时内存会被清空。
  • 路由变化:路由也会重置,因为路由是基于当前页面状态的。刷新页面相当于重新加载整个应用,浏览器会将 URL 设置为默认的路由(通常是首页),并根据这个 URL 初始化路由状态。

为了避免刷新浏览器后丢失状态,可以使用 持久化存储(如 localStorage 或 sessionStorage),将重要的状态保存到浏览器的存储中。这样,在刷新页面后,应用可以从持久化存储中恢复之前的状态。pinia-plugin-persistedstate

  1. 可以配置 persist: true 来启用持久化:
import { defineStore } from 'pinia';

export const useStore = defineStore('store', {
  state: () => ({
    count: 0
  }),
  persist: true  // 启用持久化

//或者
  persist: {
    storage: sessionStorage  // 默认是 localStorage
  }
});

  1. 在 main.js 或 main.ts 中启用插件:
import { createPinia } from 'pinia'
import persistedstate from 'pinia-plugin-persistedstate'

const pinia = createPinia()
pinia.use(persistedstate)  // 启用持久化插件

app.use(pinia)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VUE2.0+elementUI+腾讯云点播上传视频

“vue”: “^2.6.11”, TcVod&#xff1a; “vod-js-sdk-v6”: “^1.7.0”, “element-ui”: “^2.15.6”, 直接上代码 上传视频加上传封面 在这里插入代码片 <template><div><p>上传封面</p><el-uploadclass"avatar-uploader"actio…

LlamaFactory-webui:训练大语言模型的入门级教程

LlamaFactory是一个开源框架&#xff0c;支持多种流行的语言模型&#xff0c;及多种微调技术&#xff0c;同时&#xff0c;以友好的交互式界面&#xff0c;简化了大语言模型的学习。 本章内容&#xff0c;从如何拉取&#xff0c;我已经搭建好的Llamafactory镜像开始&#xff0…

音频进阶学习十六——LTI系统的差分方程与频域分析一(频率响应)

文章目录 前言一、差分方程的有理式1.差分方程的有理分式2.因果系统和ROC3.稳定性与ROC 二、频率响应1.定义2.幅频响应3.相频响应4.群延迟 总结 前言 本篇文章会先复习Z变换的有理分式&#xff0c;这是之前文章中提过的内容&#xff0c;这里会将差分方程和有理分式进行结合来看…

一周学会Flask3 Python Web开发-Jinja2模板访问对象

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 如果渲染模板传的是对象&#xff0c;如果如何来访问呢&#xff1f; 我们看下下面示例&#xff1a; 定义一个Student类 cla…

APISIX Dashboard上的配置操作

文章目录 登录配置路由配置消费者创建后端服务项目配置上游再创建一个路由测试 登录 http://192.168.10.101:9000/user/login?redirect%2Fdashboard 根据docker 容器里的指定端口&#xff1a; 配置路由 通过apisix 的API管理接口来创建&#xff08;此路由&#xff0c;直接…

【学习笔记】三维点云空洞修复介绍(二)Grids-based

1 研究领域内网格的定义 网格&#xff08;有研究也成格网&#xff09;指的是三维多边形网格模型&#xff0c;简称“网格”。简单的定义为&#xff1a;由多边形集合定义&#xff0c;用以表示三维模型表面轮廓的拓扑和空间结构&#xff0c;英文为polygon mesh或mesh。 其中&am…

助力DeepSeek私有化部署服务:让企业AI落地更简单、更安全

在数字化转型的浪潮中&#xff0c;越来越多的企业选择私有化部署AI技术&#xff0c;以保障数据安全、提升业务效率并实现自主可控。DeepSeek作为行业领先的AI开源技术&#xff0c;其技术可以支持企业私有化部署&#xff0c;企业需要一站式服务私有化部署&#xff0c;涵盖硬件采…

嵌入式开发:傅里叶变换(4):在 STM32上面实现FFT(基于STM32L071KZT6 HAL库+DSP库)

目录 步骤 1&#xff1a;准备工作 步骤 2&#xff1a;创建 Keil 项目&#xff0c;并配置工程 步骤 3&#xff1a;在MDK工程上添加 CMSIS-DSP 库 步骤 5&#xff1a;编写代码 步骤 6&#xff1a;配置时钟和优化 步骤 7&#xff1a;调试与验证 步骤 8&#xff1a;优化和调…

SQLark 数据迁移|断点续迁已上线(Oracle-达梦)

数据迁移是 SQLark 最受企业和个人用户欢迎的功能之一&#xff0c;截止目前已帮助政府、金融、能源、通信等 50 家单位完成从 Oracle、MySQL 到达梦的全量迁移&#xff0c;自动化迁移成功率达 96% 以上。 在 Oracle 到达梦数据库迁移过程中&#xff0c;SQLark V3.3 新增 断点续…

从哪里下载WinPrefetchView最安全?

WinPrefetchView 是一款用于读取和显示 Windows 系统中预读取文件&#xff08;Prefetch&#xff09;信息的工具&#xff0c;能够帮助用户了解系统启动时加载了哪些文件以及应用程序的运行情况。为了确保下载安全&#xff0c;建议从以下可信来源获取&#xff1a; 1. MajorGeeks…

计算机毕业设计SpringBoot+Vue.js智能物流管理系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

深度学习每周学习总结Y1(Yolov5 调用官方权重进行检测 )

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客Y1中的内容 &#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 ** 注意该训练营出现故意不退押金&#xff0c;恶意揣测偷懒用假的结果冒充真实打卡记录&#xff0c;在提出能够拿到视频录像…

内容中台是什么?内容管理平台解析

内容中台的核心价值 现代企业数字化转型进程中&#xff0c;内容中台作为中枢系统&#xff0c;通过构建统一化的内容管理平台实现数据资产的高效整合与智能调度。其核心价值体现在打破传统信息孤岛&#xff0c;将分散于CRM、ERP等系统的文档、知识库、产品资料进行标准化归集&a…

多模态人物视频驱动技术回顾与业务应用

一种新的商品表现形态&#xff0c;内容几乎存在于手淘用户动线全流程&#xff0c;例如信息流种草内容、搜索消费决策内容、详情页种草内容等。通过低成本、高时效的AIGC内容生成能力&#xff0c;能够从供给端缓解内容生产成本高的问题&#xff0c;通过源源不断的低成本供给倒推…

additional-spring-configuration-metadata.json实现springboot自定义提示

在配置additional-spring-configuration-metadata.json文件后&#xff0c;在开发人员的IDE工具使用个人编写的配置读取很有效的在application.properties或application.yml文件下完成提示。 配置元数据文件位于jar下面。 META-INF/spring-configuration-metadata.json它们使用简…

使用vscode导出Markdown的PDF无法显示数学公式的问题

我的硬件环境是M2的MacBook air&#xff0c;在vscode中使用了Markdown PDF来导出md文件对应的PDF。但不管导出html还是PDF文件&#xff0c;数学公式都是显示的源代码。 我看了许多教程&#xff0c;给的是这个方法&#xff1a;在md文件对应的html文件中加上以下代码&#xff1a…

SpringBoot3—快速入门

一、简介 &#xff08;1&#xff09;前置知识 Java17Spring、SpringMVC、MyBatisMaven、IDEA &#xff08;2&#xff09;环境要求 &#xff08;3&#xff09;SpringBoot3是什么 核心概念&#xff1a;Spring Boot 底层是 Spring&#xff0c;能简单、快速地创建一个独立的、生…

DeepSeek 15天指导手册——从入门到精通 PDF(附下载)

DeepSeek使用教程系列--DeepSeek 15天指导手册——从入门到精通pdf下载&#xff1a; https://pan.baidu.com/s/1PrIo0Xo0h5s6Plcc_smS8w?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/2e8de75027d3 《DeepSeek 15天指导手册——从入门到精通》以系统化学习路径为核心&…

AWS S3 如何设置公开访问权限?

1.让整个bucket都有公开访问权限 1.1关闭【阻止公共读】 1.2关闭ACL访问控制 1.3打开桶策略 这样桶内所有的图片就能访问了 2.只开放特定文件让其具有访问权限&#xff1f; 2.1关闭【阻止公共读】 如之前的图示 2.2打开ACL控制 2.3单个文件打开公共读

深入了解 Python 中的 MRO(方法解析顺序)

文章目录 深入了解 Python 中的 MRO&#xff08;方法解析顺序&#xff09;什么是 MRO&#xff1f;如何计算 MRO&#xff1f;C3 算法的合并规则C3 算法的合并步骤示例&#xff1a;合并过程解析 MRO 解析失败的场景使用 mro() 方法查看 MRO示例 1&#xff1a;基本用法 菱形继承与…