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

零基础Vue入门7——状态管理Pinia

本节重点:

  • pinia是什么
  • pinia怎么用

pinia是什么

vue中组件间的数据传递:

  • app.config.globalProperties:能够被应用内所有组件实例访问到的全局属性的对象
  • props:父传子用
  • provide:父传后代用

想象下有咩有哪些数据存储是上述没法存的吗?一般随着项目越来越复杂,一个项目都是有多个菜单组成的,例如一个收费系统可以包含入网、客户资料管理、客户收费、组织机构管理、权限角色管理等模块。模块和模块之间(或者有的菜单和菜单之间)有些数据是共享的,例如用户信息、登录用户的权限信息等。这些内容是无法使用上述3块内容的。

Pinia 是Vue的专属状态管理库允许跨组件或页面共享状态。优点:

  • 简单易用:API 设计简洁直观,学习成本低。
  • 类型安全:在 TypeScript 项目中能提供良好的类型支持。
  • 模块化设计:方便代码的组织和维护。

使用

安装和初始化

pnpm install pinia
// main.js
import { createApp } from 'vue';
import { createPinia } from 'pinia';
import App from './App.vue';const app = createApp(App);
const pinia = createPinia();app.use(pinia);

创建和使用

在项目的 src 目录下创建一个 stores 文件夹,用于存放所有的 Store 文件。在 stores 文件夹中创建一个 counter.ts文件。

这个文件结构优点想vue2 的选项式api的模式,定义好几个模块,什么内容放在什么下面即可。

// src/stores/counter.js
import { defineStore } from 'pinia';export const useCounterStore = defineStore('counter', {// 定义状态state: () => ({count: 0}),// 定义 getters,类似于计算属性getters: {doubleCount: (state) => state.count * 2},// 定义 actions,用于修改状态actions: {increment() {this.count++;}}
});

上述代码中:

  • defineStore 是 Pinia 提供的一个函数,用于定义一个 Store,命名要求都以use开头store结尾。
  • 'counter' 是 Store 的唯一 id,用于区分不同的 Store。
  • state 是一个函数,返回一个对象,包含了 Store 的初始状态。
  • getters 是一个对象,包含了一些计算属性,用于获取状态的派生值。
  • actions 是一个对象,包含了一些方法,用于修改状态。

使用

<template><div><!--模板中就可以使用了 --><p>Count: {{ counterStore.count }}</p><p>Double Count: {{ counterStore.doubleCount }}</p><button @click="counterStore.increment">Increment</button></div>
</template><script setup>
// 引入了 useCounterStore 函数
import { useCounterStore } from '../stores/counter';// 调用 useCounterStore 函数获取 counter Store 的实例
const counterStore = useCounterStore();
</script>

访问其他store

// src/stores/counter.js
import { defineStore } from 'pinia';
import { useAuthStore } from './auth-store'export const useCounterStore = defineStore('counter', {// 定义状态state: () => ({count: 0,preferences: null,}),// 定义 getters,类似于计算属性getters: {doubleCount: (state) => state.count * 2},// 定义 actions,用于修改状态actions: {increment() {this.count++;},async fetchUserPreferences() {const auth = useAuthStore()if (auth.isAuthenticated) {this.preferences = await fetchPreferences()} else {throw new Error('User must be authenticated')}},}
});

响应式解构

从 Store 中解构出状态时,默认情况下会失去响应式。为了保持响应式,可以使用 storeToRefs 函数

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

项目中的最佳实践

模块化设计

将不同业务模块的状态分别存放在不同的 Store 文件中,例如用户信息存放在 user.js 中,商品信息存放在 product.js 中,这样可以提高代码的可维护性。

合理使用 getters 和 actions

getters:用于获取状态的派生值,避免在组件中重复计算。

actions:用于修改状态,将复杂的业务逻辑封装在 actions 中,使组件的代码更加简洁。

状态持久化

在实际项目中,有些状态需要持久化,比如用户的登录状态。可以使用 pinia-plugin-persistedstate 插件来实现状态的持久化

pnpm install pinia-plugin-persistedstate

// main.js
import { createApp } from 'vue';
import { createPinia } from 'pinia';
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';
import App from './App.vue';const app = createApp(App);
const pinia = createPinia();
pinia.use(piniaPluginPersistedstate);app.use(pinia);
app.mount('#app');

然后在 Store 中配置持久化:

// src/stores/counter.js
import { defineStore } from 'pinia';
import { useAuthStore } from './auth-store'export const useCounterStore = defineStore('counter', {// 定义状态state: () => ({count: 0,preferences: null,}),// 定义 getters,类似于计算属性getters: {doubleCount: (state) => state.count * 2},// 定义 actions,用于修改状态actions: {increment() {this.count++;},async fetchUserPreferences() {const auth = useAuthStore()if (auth.isAuthenticated) {this.preferences = await fetchPreferences()} else {throw new Error('User must be authenticated')}},},// 配置持久化persist: true
});


继续下一节:零基础Vue入门7——状态管理Pinia-CSDN博客


若碰到其他的问题 可以私信我 一起探讨学习
如果对你有所帮助还请 点赞 收藏 谢谢~!
关注收藏博客 持续更新中,欢迎订阅专栏

相关文章:

零基础Vue入门7——状态管理Pinia

本节重点&#xff1a; pinia是什么pinia怎么用 pinia是什么 vue中组件间的数据传递&#xff1a; app.config.globalProperties&#xff1a;能够被应用内所有组件实例访问到的全局属性的对象props&#xff1a;父传子用provide&#xff1a;父传后代用 想象下有咩有哪些数据存储…...

Bash (Bourne-Again Shell)、Zsh (Z Shell)

文章目录 1. 历史背景2. 主要区别3. 功能对比自动补全插件和主题路径扩展提示符定制 4. 性能5. 使用场景6. 如何切换 Shell7. 总结 以下是 Bash 和 Zsh 之间的主要区别&#xff0c;列成表格方便对比&#xff1a; 特性BashZsh默认Shell大多数Linux发行版默认ShellmacOS默认She…...

Android studio 创建aar包给Unity使用

1、aar 是什么&#xff1f; 和 Jar有什么区别 aar 和 jar包 都是压缩包&#xff0c;可以使用压缩软件打开 jar包 用于封装 Java 类及其相关资源 aar 文件是专门为 Android 平台设计的 &#xff0c;可以包含Android的专有内容&#xff0c;比如AndroidManifest.xml 文件 &#…...

DeepSeek R1 简单指南:架构、训练、本地部署和硬件要求

DeepSeek 的 LLM 推理新方法 DeepSeek 推出了一种创新方法&#xff0c;通过强化学习 (RL) 来提高大型语言模型 (LLM) 的推理能力&#xff0c;其最新论文 DeepSeek-R1 对此进行了详细介绍。这项研究代表了我们如何通过纯强化学习来增强 LLM 解决复杂问题的能力&#xff0c;而无…...

图论常见算法

图论常见算法 算法prim算法Dijkstra算法 用途最小生成树&#xff08;MST&#xff09;&#xff1a;最短路径&#xff1a;拓扑排序&#xff1a;关键路径&#xff1a; 算法用途适用条件时间复杂度Kruskal最小生成树无向图&#xff08;稀疏图&#xff09;O(E log E)Prim最小生成树无…...

MySQL三大日志详解

在MySQL数据库的运行过程中&#xff0c;三大关键日志——binlog、redo log和undo log&#xff0c;起着至关重要的作用。理解这三大日志&#xff0c;对于深入掌握MySQL的工作原理、数据恢复以及主从复制等操作有着极大的帮助。本文将详细剖析这三大日志的作用和工作机制。 Binl…...

【SQL 中的分组查询与联合查询详解】

文章目录 SQL 中的分组查询与联合查询详解 1. GROUP BY分组查询 1.1 语句格式1.2 示例说明 1.2.1 分别查询哥哥组和弟弟组的英语成绩总和1.2.2 查询哥哥组的所有成绩总和 2. 联合查询 2.1 内连接 2.1.1 语法格式2.1.2 执行过程 2.2 外连接 2.2.1 左外连接2.2.2 右外连接 2.3 …...

【实战篇】用 Cursor 独立开发并上线电商类 Android APP 全攻略

一、为啥要用 Cursor 开发电商类 Android APP 家人们,如今电商类 APP 随处可见,不管是买衣服、食品,还是电子产品,都能通过这些 APP 轻松搞定。要是能自己开发一款电商类 Android APP,那可太酷啦!但开发 APP 可不是一件容易的事,涉及到很多技术,像写代码、设计界面、处…...

quartus24.1版本子模块因时钟问题无法综合通过,FPGA过OOC问题复盘

因为只负责一个子模块&#xff0c;所以需要单独对该子模块进行综合和过OOC&#xff0c;这时候已经有一些加虚拟pin文件&#xff0c;敲命令让子模块能过OOC的方法。但这个方法的前提是先过综合&#xff0c;然后再敲命令让虚拟管脚命令成功&#xff0c;最终可以过OOC。 今天负责…...

零基础Vue入门6——Vue router

本节重点&#xff1a; 路由定义路由跳转 前面几节学习的都是单页面的功能&#xff08;都在专栏里面https://blog.csdn.net/zhanggongzichu/category_12883540.html&#xff09;&#xff0c;涉及到项目研发都是有很多页面的&#xff0c;这里就需要用到路由&#xff08;vue route…...

使用 Let‘s Encrypt 和 OpenResty 实现域名转发与 SSL 配置

在搭建网站或服务时&#xff0c;确保域名的安全性和正确的流量转发是非常重要的。本文将介绍如何使用 Let’s Encrypt 获取免费的 SSL 证书&#xff0c;并将其配置到 OpenResty 中&#xff0c;同时实现特定的域名转发规则。这不仅可以提升网站的安全性&#xff0c;还能优化流量…...

Lambda 表达式

一、Lambda 表达式简介 Lambda 表达式是一种简洁的函数式编程方式&#xff0c;用于实现只有一个方法的接口&#xff08;例如函数式接口&#xff09;。 基本语法 (parameters) -> expression (parameters) -> { statements; } 参数&#xff1a;可以有零个或多个参数。…...

TCN时间卷积神经网络多变量多步光伏功率预测(Matlab)

代码下载&#xff1a;TCN时间卷积神经网络多变量多步光伏功率预测&#xff08;Matlab&#xff09; TCN时间卷积神经网络多变量多步光伏功率预测 一、引言 1.1、研究背景和意义 随着全球能源危机的加剧和环保意识的提升&#xff0c;可再生能源&#xff0c;尤其是太阳能&…...

【Elasticsearch】 Composite Aggregation 详解

1.什么是 Composite Aggregation&#xff1f; Composite Aggregation 是 Elasticsearch 中的一种特殊聚合方式&#xff0c;适用于需要分页展示的聚合结果。它与传统的聚合方式不同&#xff0c;采用了基于游标的分页模型。这种聚合方式可以高效地处理多级聚合中的所有桶&#x…...

如何通过 Logstash 将数据采集到 Elasticsearch

作者&#xff1a;来自 Elastic Andre Luiz 将 Logstash 与 Elasticsearch 集成以实现高效的数据提取、索引和搜索的分步指南。 什么是 Logstash&#xff1f; Logstash 是一种广泛使用的 Elastic Stack 工具&#xff0c;用于实时处理大量日志数据。它充当高效的数据管道&#x…...

mysql的cpu使用率100%问题排查

背景 线上mysql服务器经常性出现cpu使用率100%的告警&#xff0c; 因此整理一下排查该问题的常规流程。 1. 确认CPU占用来源 检查系统进程 使用 top 或 htop 命令&#xff0c;确认是否是 mysqld 进程导致CPU满载&#xff1a;top -c -p $(pgrep mysqld)2. 实时分析MySQL活动 …...

centos虚拟机迁移没有ip的问题

故事背景&#xff0c;我们的centos虚拟机本来是好好的&#xff0c;但是拷贝到其他电脑上就不能分配ip&#xff0c;我个人觉得这个vmware他们软件应该搞定这个啊&#xff0c;因为这个问题是每次都会出现的。 网络选桥接 网络启动失败 service network restart Restarting netw…...

接入 deepseek 实现AI智能问诊

1. 准备工作 注册 DeepSeek 账号 前往 DeepSeek 官网 注册账号并获取 API Key。 创建 UniApp 项目 使用 HBuilderX 创建一个新的 UniApp 项目&#xff08;选择 Vue3 或 Vue2 模板&#xff09;。 安装依赖 如果需要在 UniApp 中使用 HTTP 请求&#xff0c;推荐使用 uni.requ…...

用AVFrame + AVPacket 完成accede编码和直接用ffmpeg命令行实现acc编码的对比

在使用 FFmpeg 进行 AAC 音频编码时,可以选择两种方式:通过编程接口(如 AVFrame 和 AVPacket)实现 AAC 编码,或者直接使用 FFmpeg 命令行工具。这两种方式各有特点,适用于不同的场景。以下是对两种方法的详细分析,包括它们的区别、优缺点以及适用场景。 一、通过 AVFram…...

计算机网络笔记再战——理解几个经典的协议6——TCP与UDP

目录 先说端口号 TCP 使用序号保证顺序性和应答来保证有效性 超时重传机制 TCP窗口机制 UDP 路由协议 协议分类&#xff1a;IGP和EGP 几个经典的路由算法 RIP OSPF 链路状态数据库&#xff08;LSDB&#xff09; LSA&#xff08;Link State Advertisement&#xff0…...

OpenClaw跨平台控制:ollama-QwQ-32B同步操作多台设备的配置

OpenClaw跨平台控制&#xff1a;ollama-QwQ-32B同步操作多台设备的配置 1. 为什么需要跨设备自动化控制 上个月我家里添置了三台不同用途的设备&#xff1a;一台用于媒体处理的Mac mini、一台跑深度学习模型的Linux服务器&#xff0c;还有一台Windows主机专门处理文档。每次需…...

【2026年最新600套毕设项目分享】springboot柒月仓库管理系统(14280)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告/任务书&#xff09;远程调试控屏包运行一键启动项目&…...

OpenClaw性能调优:GLM-4.7-Flash响应速度提升30%实战

OpenClaw性能调优&#xff1a;GLM-4.7-Flash响应速度提升30%实战 1. 为什么需要性能调优 上周我在本地部署了OpenClaw对接GLM-4.7-Flash模型&#xff0c;准备用它自动处理日常的邮件分类和会议纪要整理。但很快发现一个问题&#xff1a;每次任务响应时间都在8-12秒徘徊&#…...

3D打印螺纹设计革新:CustomThreads项目突破传统加工限制

3D打印螺纹设计革新&#xff1a;CustomThreads项目突破传统加工限制 【免费下载链接】CustomThreads Fusion 360 Thread Profiles for 3D-Printed Threads 项目地址: https://gitcode.com/gh_mirrors/cu/CustomThreads 你是否曾遇到3D打印螺纹时的挫败感&#xff1f;精心…...

保姆级教程:用Clawdbot将私有化Qwen3-VL接入飞书,打造企业智能助手

保姆级教程&#xff1a;用Clawdbot将私有化Qwen3-VL接入飞书&#xff0c;打造企业智能助手 1. 准备工作与环境确认 1.1 硬件环境检查 在开始前&#xff0c;请确保您的星图云实例满足以下最低配置要求&#xff1a; 组件最低要求推荐配置GPU显存24GB48GBCPU核心8核20核系统内…...

提示内容用户体验优化框架:提示工程架构师的实战指南

提示内容用户体验优化框架&#xff1a;提示工程架构师的实战指南 一、引言&#xff1a;为什么“提示内容”是AI产品的“用户体验咽喉”&#xff1f; 1. 一个真实的痛点&#xff1a;用户与AI的“对话困境” 上周&#xff0c;我在某知名AI写作平台上看到一条用户评论&#xff1a;…...

MyBatisPlus SQL解析踩坑记:JSqlParser版本升级的那些事儿

MyBatisPlus SQL解析踩坑记&#xff1a;JSqlParser版本升级的那些事儿 当你在深夜被生产环境的报警短信惊醒&#xff0c;发现原本运行良好的SQL查询突然报出Encountered unexpected token错误时&#xff0c;很可能正遭遇JSqlParser版本升级带来的"惊喜"。作为MyBatis…...

微信好友关系检测工具:如何识别单向好友并优化通讯录管理

微信好友关系检测工具&#xff1a;如何识别单向好友并优化通讯录管理 【免费下载链接】WechatRealFriends 微信好友关系一键检测&#xff0c;基于微信ipad协议&#xff0c;看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/we/WechatRealFriends …...

HDLC(高级数据链路控制):从帧结构解析到C语言模拟实现

1. HDLC协议基础&#xff1a;从比特流到可靠传输 第一次接触HDLC协议时&#xff0c;我盯着那串01111110的标志位发了半天呆——这不就是个简单的比特序列吗&#xff1f;怎么就能成为整个协议的基础&#xff1f;后来在调试卫星通信模块时才发现&#xff0c;正是这个看似简单的设…...

基于双向DC - DC变换器(DAB)的储能系统控制仿真

Matlab/Simulink仿真模型&#xff0c;基于双向DC-DC变换器&#xff08;双有源桥变换器DAB&#xff09;的储能系统控制仿真模型&#xff0c;采用电压电流双PI闭环控制策略&#xff0c;单移相控制&#xff0c;在母线电压受到外界干扰的情况下&#xff0c;通过控制电池的充电和放电…...