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

目录

  • 前言
  • 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 Storeconst 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('');// 定义一个 Getterconst 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('');// 异步设置 Tokenconst 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.xdnf.cn/news/20676.html

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

相关文章

springBoot插件打包部署

打包插件spring-boot-maven-plugin 不使用插件&#xff0c;运行时&#xff0c;异常信息为“没有主清单属性” 本地部署 杀进程

python使用poetry作为包管理

一、pip的弊端 由于Python使用pip安装时不会自动解决冲突&#xff0c;不会自动删除相关联的包&#xff0c;例如安装flask时&#xff0c;pip install flask会额外安装一些包&#xff0c;但是pip uninstall是不会删除相关的包&#xff0c;只会删除flask本身的包。 二、推荐使用…

神经网络中常用的激活函数(公式 + 函数图像)

激活函数是人工神经网络中的一个关键组件&#xff0c;负责引入非线性&#xff0c;从而使神经网络能够学习和表示复杂的非线性关系。没有激活函数&#xff0c;神经网络中的所有计算都是线性变换&#xff0c;而线性模型的表达能力有限&#xff0c;无法处理复杂的任务。 激活函数…

mysql复习题(实验7-8)

建立一个学生入学信息管理&#xff08;x_y&#xff09;数据库&#xff0c;设计其数据库模式为&#xff1a; 学生表&#xff08;学号&#xff0c;姓名&#xff0c;性别&#xff0c;入学成绩&#xff0c;籍贯&#xff0c;院系编号&#xff09; 院系表&#xff08;院系编号&…

n个整数后移m个位置

题目描述 有n个整数&#xff0c;使前面各数顺序向后移m个位置&#xff0c;最后m个数变成前面m个数&#xff0c;见图。写一函数&#xff1a;实现以上功能&#xff0c;在主函数中输入n个数和输出调整后的n个数。 输入描述 输入数据的个数n n个整数 移动的位置m 输出描述 移动后的…

Python——面向过程和面向对象

一.两大编程思想 面向过程&#xff1a;事情比较简单&#xff0c;可以用线性的思维去解决问题。例&#xff1a;c语言。 面向对象&#xff1a;事情比较复杂&#xff0c;使用简单的线性思维无法解决。例&#xff1a;python。 二.面向对象 1.类和对象 类和对象&#xff1a;由无…

【机器学习】---神经架构搜索(NAS)

这里写目录标题 引言1. 什么是神经架构搜索&#xff08;NAS&#xff09;1.1 为什么需要NAS&#xff1f; 2. NAS的三大组件2.1 搜索空间搜索空间设计的考虑因素&#xff1a; 2.2 搜索策略2.3 性能估计 3. NAS的主要方法3.1 基于强化学习的NAS3.2 基于进化算法的NAS3.3 基于梯度的…

图像上显示中文文本 - python 实现

该示例是在图像上显示中文文本&#xff0c;并用opencv的显示方式显示。 注意&#xff1a;SimHei.ttf&#xff08;黑体字体&#xff09;为字体文件&#xff0c;Windows 默认字体路径&#xff1a;C:/Windows/Fonts/SimHei.ttf 具体实现代码如下&#xff1a; # -*-coding:utf-8…

dotnet:依赖注入

依赖注入的基本概念 依赖&#xff1a;一个类依赖于另一个类或接口来完成其功能。注入&#xff1a;依赖项由外部提供给类&#xff0c;而不是由类自己创建。 builder.Services.AddScoped<IMyDependency, MyDependency>(); 这行代码使用 AddScoped 方法将 IMyDependency 接…

JAVA题目笔记(十七)TreeSet对象排序+Map集合练习

一、TreeSet对象排序&#xff1a; 需求&#xff1a; public class Student implements Comparable<Student>{private String name;private int age;private int grade_Yu;private int grade_Shu;private int grade_Yin;private int sumthis.grade_Yinthis.grade_Shuthis…

w046基于web的古典舞在线交流平台的设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

【迅为】瑞芯微-RK3568开发板Linux+HAL启动测试

迅为iTOP&#xff0d;RK3568开发板AMP AMP SDK支持Rockchip平台异构多系统AMP&#xff08;非对称多核架构&#xff09;的开发软件包&#xff0c;支持Linux(Kernel)、Standalone(Hal)、RTOS(RT-Thread)组合AMP构建形式。可以满足一些特定行业应用&#xff0c;如电力物联网、电…

渗透测试--Windows系统下的文件传输手段

很多情况下&#xff0c;我们渗透测试都面临需要上传和下载文件的文件传输需求。本文专门探讨Windows服务器或主机上实施文件传输的各种方案。该专题比较敏感&#xff0c;该文章仅供学习使用&#xff0c;不要用于非法用途。 编码方法 Linux检查文件MD5 md5sum id_rsa Linux编…

视觉常用Backbone大全:VisionTransformer(ViT)

视觉常用Backbone大全 今天介绍的主干网络模型叫VisionTransformer&#xff0c;是一种将 Transformer 架构应用于计算机视觉任务的模型&#xff0c;通过将图像进行切块&#xff0c;将图片转变为self-attention认识的token输入到Transformer模块中&#xff0c;实现了Transformer…

星海智算:Stable Diffusion3.5镜像教程

Stable Diffusion3.5 模型介绍 Stable Diffusion 3.5是由Stability AI推出的最新图像生成模型&#xff0c;它是Stable Diffusion系列中的一个重大升级。这个模型家族包括三个版本&#xff0c;分别是Stable Diffusion 3.5 Large、Stable Diffusion 3.5 Large Turbo和Stable Dif…

[JavaWeb] 尚硅谷JavaWeb课程笔记

1 Tomcat服务器 Tomcat目录结构 bin&#xff1a;该目录下存放的是二进制可执行文件&#xff0c;如果是安装版&#xff0c;那么这个目录下会有两个exe文件&#xff1a;tomcat10.exe、tomcat10w.exe&#xff0c;前者是在控制台下启动Tomcat&#xff0c;后者是弹出GUI窗口启动To…

【Unity基础】认识Unity中的包

Unity中的包是一个核心概念&#xff0c;像Unity本身的功能的扩展&#xff0c;或者项目中资源的管理&#xff0c;都是通过包的形式来实现的。 一、什么是包&#xff1f; 一个包包含满足您项目各种需求的功能。这可以包括编辑器安装过程中附带的任何核心Unity功能&#xff0c;也…

elment-ui的折叠tree表单实现纯前端搜索,展开收起功能

好久没更新博客了~ 记录一下本次做的一个很扯的需求 纯前端去实现这个查询的功能,后台返回的是个数组对象,前端要给他包装成树结构先展示 之后参考代码路径src\views\goods\category\index.vue 需求描述: 搜索输入任何一个关键字,都会展开他的父级,两个栏目都包含了,那么两个父…

linux先创建文件夹后指定创建文件夹用户

1、创建文件夹&#xff0c;然后创建用户并指定用户目录&#xff0c;然后修改目录所有权给该目录 # 创建 /home/test 目录 mkdir /home/test # 设置权限&#xff08;确保有适当的读写权限&#xff09; chown root:root /home/test chmod 700 /home/test # 创建 xl 用户并指定家…

大模型(LLM)全参数微调有哪些技巧,常用的轻量级微调有哪些,微调策略应该如何选择?

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下大模型(LLM)全参数微调有哪些技巧&#xff0c;常用的轻量级微调有哪些&#xff0c;微调策略应该如何选择&#xff1f;本文将从大模型(LLM)全参数微调技巧&#xff0c;常用的轻量级微调方法&#xff0c;微调策略应该…