Vue 专属状态管理库Pinia的使用与实践

news2024/11/20 13:42:56

目录

  • 前言
  • 1. 什么是 Pinia?
  • 2. Pinia 的安装与基本配置
    • 2.1 安装 Pinia
    • 2.2 在 Vue 应用中配置 Pinia
  • 3. 使用 Pinia 创建和管理状态
    • 3.1 定义一个简单的 Store
    • 3.2 在组件中使用 Store
  • 4. Pinia 的高级功能
    • 4.1 使用 Getter 简化数据处理
    • 4.2 支持异步操作
    • 4.3 在服务端渲染中使用 Pinia
  • 5. Pinia 与 Vuex 的比较
  • 6. 结语

前言

在 Vue 的开发中,状态管理是一个不可或缺的部分,尤其是在复杂的应用中,组件之间的状态共享和管理变得至关重要。Pinia 作为 Vue 的专属状态管理库,凭借其简洁的 API 和出色的性能表现,逐渐成为开发者的首选。本文将深入介绍 Pinia 的基础知识、核心功能以及实际使用场景,帮助你更高效地管理 Vue 应用中的状态。

1. 什么是 Pinia?

Pinia 是 Vue 官方团队推荐的状态管理库,专为 Vue 设计,作为 Vuex 的现代替代品。它支持响应式的数据存储,可以轻松实现跨组件或页面的状态共享。同时,Pinia 提供了更直观的 API,降低了学习成本,是 Vue 3 环境下的理想选择。

Pinia 的核心特点包括:

  • 轻量简洁:易于学习和使用,API 清晰直观。
  • 与 Vue3 深度集成:利用 Vue 3 的 Composition API 和 Proxy 实现。
  • 模块化设计:支持按需定义和加载状态,灵活高效。
  • 支持 TypeScript:内置强类型支持,更适合现代开发。
    在这里插入图片描述

2. Pinia 的安装与基本配置

2.1 安装 Pinia

在项目中安装 Pinia 非常简单,只需运行以下命令:

npm install pinia

或者使用 Yarn:

yarn add pinia

安装完成后,就可以在项目中引入并配置 Pinia。

2.2 在 Vue 应用中配置 Pinia

首先,在项目的主入口文件(如 main.jsmain.ts)中引入 Pinia,并将其作为插件安装到 Vue 应用实例中:

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

const app = createApp(App);

// 创建 Pinia 实例
const pinia = createPinia();

// 将 Pinia 注入到 Vue 应用
app.use(pinia);

app.mount('#app');

配置完成后,Pinia 已经准备就绪,可以在项目中使用。

在这里插入图片描述

3. 使用 Pinia 创建和管理状态

3.1 定义一个简单的 Store

在 Pinia 中,每个 Store 就像一个模块化的状态管理单元,通常定义在 src/stores 文件夹下。例如,我们可以创建一个管理 Token 的 Store:

// src/stores/token.js
import { defineStore } from 'pinia';
import { ref } from 'vue';

// 定义一个名为 "token" 的 Store
export const useTokenStore = defineStore('token', () => {
  // 1. 定义响应式状态
  const token = ref('');

  // 2. 定义一个函数,设置新的 Token 值
  const setToken = (newToken) => {
    token.value = newToken;
  };

  // 3. 定义一个函数,清空 Token 值
  const removeToken = () => {
    token.value = '';
  };

  // 返回状态和函数
  return {
    token,
    setToken,
    removeToken,
  };
});

在这个示例中,我们通过 defineStore 函数定义了一个名为 token 的 Store,并在其中管理了 token 的状态及其相关操作函数。

3.2 在组件中使用 Store

在组件中使用 Store 十分直观,只需导入定义好的 Store,并调用其方法即可。例如:

<template>
  <div>
    <p>当前 Token: {{ tokenStore.token }}</p>
    <button @click="updateToken">设置 Token</button>
    <button @click="clearToken">清空 Token</button>
  </div>
</template>

<script>
import { useTokenStore } from '@/stores/token';

export default {
  setup() {
    // 使用 Token Store
    const tokenStore = useTokenStore();

    // 更新 Token 的方法
    const updateToken = () => {
      tokenStore.setToken('new-token-value');
    };

    // 清空 Token 的方法
    const clearToken = () => {
      tokenStore.removeToken();
    };

    return { tokenStore, updateToken, clearToken };
  },
};
</script>

此处展示了如何在模板中显示 Store 的状态,以及调用 Store 的方法更新或清空状态。

4. Pinia 的高级功能

4.1 使用 Getter 简化数据处理

Getter 是一种类似 Vuex 中计算属性的功能,可以基于状态派生出新数据。例如:

export const useTokenStore = defineStore('token', () => {
  const token = ref('');

  // 定义一个 Getter
  const isTokenAvailable = computed(() => !!token.value);

  return {
    token,
    isTokenAvailable,
  };
});

在组件中使用 Getter 和状态一样简单:

const tokenStore = useTokenStore();
console.log(tokenStore.isTokenAvailable); // true 或 false

4.2 支持异步操作

Pinia 支持在 Store 中直接使用异步函数。例如,在进行 API 调用时:

export const useTokenStore = defineStore('token', () => {
  const token = ref('');

  // 异步设置 Token
  const fetchToken = async () => {
    const response = await fetch('/api/get-token');
    const data = await response.json();
    token.value = data.token;
  };

  return { token, fetchToken };
});

4.3 在服务端渲染中使用 Pinia

Pinia 也支持服务端渲染(SSR),可以在服务端和客户端之间共享状态数据。具体实现需要结合 Vue 的 SSR 配置,可以参考 Pinia 官方文档。

5. Pinia 与 Vuex 的比较

在这里插入图片描述

虽然 Pinia 和 Vuex 都是 Vue 的状态管理工具,但它们在设计上有明显的区别:

  • API 简洁性:Pinia 更加轻量,API 更简洁直观,学习成本更低。
  • 模块化支持:Pinia 默认支持模块化,而 Vuex 则需要手动拆分模块。
  • 性能:Pinia 基于 Vue 3 的 Proxy 实现,性能更优。
  • 代码风格:Pinia 更贴近 Composition API 的风格,更符合现代 Vue 开发习惯。

如果你正在开发一个 Vue 3 项目,Pinia 是更推荐的选择。

6. 结语

Pinia 是一个强大且易用的状态管理工具,它为 Vue 开发者提供了简洁高效的状态管理解决方案。从简单的状态共享到复杂的异步操作,Pinia 都能轻松应对。如果你正在寻找一个现代化的 Vue 状态管理工具,不妨试试 Pinia,感受它带来的开发体验提升。

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

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

相关文章

如何基于Netty手写简单的Tomcat?

如何基于Netty手写简单的Tomcat&#xff1f; 我们最常用的服务器是tomcat &#xff0c;我们使用tomcat 也主要作为http服务器 。 http协议是基于TCP 协议&#xff0c;换句话说使用socket 或者 NIO编程&#xff0c;只要能正确的解析http报文&#xff0c;然后将结果按照 http 报…

RabbitMQ教程:发布/订阅模式(Publish/Subscribe)(三)

文章目录 RabbitMQ教程&#xff1a;发布/订阅模式&#xff08;Publish/Subscribe&#xff09;&#xff08;三&#xff09;一、引言二、简介三、准备工作3.1 说明3.2 生成项目 四、实战4.1 交换机&#xff08;Exchanges&#xff09;4.2 临时队列&#xff08;Temporary Queues&am…

金山云Q3调整后EBITDA率提升至9.8% 经营效率和盈利能力强劲增长

11月19日&#xff0c;金山云公布了2024年第三季度业绩。 季度内&#xff0c;公司在收入规模、盈利能力、经营现金流方面都取得了扎实的进展。财报显示&#xff0c;金山云Q3营收18.9亿元&#xff0c;同比回归两位数快速增长&#xff0c;达16.0%&#xff1b;公有云实现收入11.8亿…

Python轴承故障诊断 (19)基于Transformer-BiLSTM的创新诊断模型

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客 Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客 Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客 三十多个开源…

Linux 安装 jdk8

将原有的 JDK 卸载干净&#xff08;可选&#xff09; # 查找并显示出系统所有已安装的与 JDK 相关的 rpm 软件包名称 rpm -qa | grep jdk # 删除 jdk rpm -e --nodeps 要卸载的JDK 安装 一、方法一&#xff1a;yum 包管理器安装 1&#xff09;检索可用包 yum search java |…

ESLint的简单使用(js,ts,vue)

一、ESLint介绍 1.为什么要用ESLint 统一团队编码规范&#xff08;命名&#xff0c;格式等&#xff09; 统一语法 减少git不必要的提交 减少低级错误 在编译时检查语法&#xff0c;而不是等js引擎运行时才检查 2.eslint用法 可以手动下载配置 可以通过vue脚手架创建项…

11.19机器学习_逻辑回归

十二 逻辑回归 1.概念 逻辑回归(Logistic Regression)是机器学习中的一种分类模型&#xff0c;逻辑回归是一种分类算法&#xff0c;虽然名字中带有回归&#xff0c;但是它与回归之间有一定的联系。由于算法的简单和高效&#xff0c;在实际中应用非常广泛。 逻辑回归一般用于…

数据结构-树状数组专题(2)

一、前言 接上回树状数组专题&#xff08;1&#xff09;&#xff0c;这次主要介绍差分跟树状数组联动实现区间更新 二、我的模板 重新放了一遍&#xff0c;还是提一嘴&#xff0c;注意下标从0开始&#xff0c;区间左闭右开 template <typename T> struct Fenwick {in…

SAM-Med2D 训练完成后boxes_prompt没有生成mask的问题

之前对着这这篇文章去微调SAM_Med2D(windows环境),发现boxes_prompt空空如也。查找了好长时间问题SAM-Med2D 大模型学习笔记&#xff08;续&#xff09;&#xff1a;训练自己数据集_sam训练自己数据集-CSDN博客 今天在看label2image_test.json文件的时候发现了一些端倪: 官方…

从源头保障电力安全:输电线路动态增容与温度监测技术详解

在电力系统中&#xff0c;输电线路是电能传输的关键环节。然而&#xff0c;当导线温度过高时&#xff0c;会加速导线老化&#xff0c;降低绝缘性能&#xff0c;甚至引发短路、火灾等严重事故&#xff0c;对电网安全运行构成巨大威胁。近日&#xff0c;某地区因持续高温和用电负…

第02章 CentOS基本操作

2.文件基本操作【文件操作&#xff08;一&#xff09;】 目标 理解Linux下路径的表示方法能够使用命令(mkdir和touch)在指定位置创建目录和文件能够使用命令(rm)删除指定的目录和文件能够使用命令(ls)列出目录里的文件能够使用命令(cat,head,tail,less,more)查看文件内容理解标…

leetcode400第N位数字

代码 class Solution {public int findNthDigit(int n) {int base 1;//位数int weight 9;//权重while(n>(long)base*weight){//300n-base*weight;base;weight*10;}//n111 base3 weight900;n--;int res (int)Math.pow(10,base-1)n/base;int index n%base;return String…

工业生产安全-安全帽第二篇-用java语言看看opencv实现的目标检测使用过程

一.背景 公司是非煤采矿业&#xff0c;核心业务是采选&#xff0c;大型设备多&#xff0c;安全风险因素多。当下政府重视安全&#xff0c;头部技术企业的安全解决方案先进但价格不低&#xff0c;作为民营企业对安全投入的成本很敏感。利用我本身所学&#xff0c;准备搭建公司的…

【AI人脸工具整合包及教程】Rope——重新定义你的数字形象!

引言 在这个数字时代&#xff0c;个人形象的重要性不言而喻。无论是社交媒体上的个人展示&#xff0c;还是商业活动中的品牌塑造&#xff0c;一个独特的形象都能让人眼前一亮。随着技术的发展&#xff0c;AI人脸技术逐渐从科幻走向现实&#xff0c;成为普通人也能轻松触及的技…

NLP论文速读(EMNLP 2024)|动态奖励与提示优化来帮助语言模型的进行自我对齐

论文速读|Dynamic Rewarding with Prompt Optimization Enables Tuning-free Self-Alignment of Language Models 论文信息&#xff1a; 简介: 本文讨论的背景是大型语言模型&#xff08;LLMs&#xff09;的自我对齐问题。传统的LLMs对齐方法依赖于昂贵的训练和人类偏好注释&am…

java CAS详解

java 中CAS是如何实现的&#xff1f; 在 Java 中&#xff0c;实现 CAS&#xff08;Compare-And-Swap, 比较并交换&#xff09;操作的一个关键类是Unsafe。 Unsafe类位于sun.misc包下&#xff0c;是一个提供低级别、不安全操作的类。由于其强大的功能和潜在的危险性&#xff0…

Gooxi受邀参加海通证券AI+应用生态大会,助力数智金融高质量发展

11月15日&#xff0c;由海通证券举办以”智算无界&#xff0c;共臻高远”为主题AI应用生态大会在上海圆满落幕。此次活动汇聚了众多人工智能领域的意见领袖、专家学者、优秀企业代表及资深投资人&#xff0c;共同探讨金融行业人工智能应用的前沿理论、最佳实践及发展趋势&#…

Python数据分析与可视化实验案例,所需数据已经绑定上传

大数据技术专业技能竞赛试卷 一、项目名称 农业肥料登记数据分析赛题 二、竞赛内容 赛项以大数据技术为核心内容&#xff0c;重点考查参赛选手数据清洗和数据分析的能力&#xff0c;结合Pandas和matplotlib图表展示数据。所有参赛学生在现场根据给定的项目任务&#xff0c;…

【竞技宝】LOL-传奇杯:姿态飞机TP绕后一锤定音

北京时间2024年11月19日,英雄联盟第二届传奇杯正在如火如荼的进行之中。昨天迎来小组赛第四个比赛日,本日一共进行了七场小组赛的对决,那么在昨日上半场的四场比赛中,登场的各支队伍都取得了什么样的表现呢?接下来小宝为大家带来小组赛day4上半场的比赛战报。 OP(宁王队) 0-1 …

qt之telnet连接目标设备在线调试功能

一、前言 在QT下使用telnet连接目标设备&#xff0c;进行在线命令调试&#xff0c;也可配合ftp或ssh使用。 telnet某些库在qt5下不可用&#xff0c;无法获取登录信息&#xff0c;只能获取到连接信息&#xff0c;这里我用自己的方式判断是否成功登录 二、环境 window qt5.7…