Vue3 —— Pinia 的学习指南以及案例分享

news2025/2/27 5:52:00

文章目录

  • 前言
  • 一、什么是pinia?
  • 二、为什么要使用Pinia?
  • 三、Pinia对比Vuex
  • 具体使用方法
    • 1.安装
    • 2.创建一个store
  • state
    • 1.访问state
    • 2.重置状态
    • 3.修改state
    • 4.批量修改state
    • 5.替换state
  • getters
    • 1.访问getters
    • 2.getters传参
    • 3.写为普通函数可调用this
    • 4.访问其他的store中的getters
  • actions
    • 1.访问actions
    • 2.调用其他store中的actions
  • 八、小彩蛋—— 购物车案例分享
  • 总结


前言

学习过Vue2的小伙伴一定用过 Vuex,我们知道Vuex是vue中的一个集中式管理状态的插件,那么Vue3中管理状态用的什么呢?如何使用呢?本文就来阐述这个问题。

在本文末尾我将使用  Vue3+Pinia 实现的一个简易购物车案例分享了出来,“纸上得来终觉浅,绝知此事要躬行”,知识点还是要和实际操作相结合才能够实际掌握,感兴趣的小伙伴可以尝试完成,相信对你关于Vue3和pinia的掌握会有很大的提升!!!


一、什么是Pinia?

Pinia 最初是在 2019 年 11 月左右重新设计使用 Composition API 。从那时起,最初的原则仍然相同,但 Pinia 对 Vue 2 和 Vue 3 都有效,并且不需要您使用组合 API。

二、为什么要使用Pinia?

Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态。 如果您熟悉 Composition API,您可能会认为您已经可以通过一个简单的 export const state = reactive({}). 这对于单页应用程序来说是正确的,但如果它是服务器端呈现的,会使您的应用程序暴露于安全漏洞。 但即使在小型单页应用程序中,您也可以从使用 Pinia 中获得很多好处:

  • dev-tools 支持
    • 跟踪动作、突变的时间线
    • Store 出现在使用它们的组件中
    • time travel 和 更容易的调试
  • 热模块更换
    • 在不重新加载页面的情况下修改您的 Store
    • 在开发时保持任何现有状态
  • 插件:使用插件扩展 Pinia 功能
  • 为 JS 用户提供适当的 TypeScript 支持或 autocompletion
  • 服务器端渲染支持

三、Pinia对比Vuex

 

  • mutations 不再存在。他们经常被认为是 非常 冗长。他们最初带来了 devtools 集成,但这不再是问题。
  • 无需创建自定义复杂包装器来支持 TypeScript,所有内容都是类型化的,并且 API 的设计方式尽可能利用 TS 类型推断。
  • 不再需要注入、导入函数、调用函数、享受自动完成功能!
  • 无需动态添加 Store,默认情况下它们都是动态的,您甚至都不会注意到。请注意,您仍然可以随时手动使用 Store 进行注册,但因为它是自动的,您无需担心。
  • 不再有 modules 的嵌套结构。您仍然可以通过在另一个 Store 中导入和 使用 来隐式嵌套 Store,但 Pinia 通过设计提供平面结构,同时仍然支持 Store 之间的交叉组合方式。 您甚至可以拥有 Store 的循环依赖关系
  • 没有 命名空间模块。鉴于 Store 的扁平架构,“命名空间” Store 是其定义方式所固有的,您可以说所有 Store 都是命名空间的。

四、具体使用方法

1.安装

用你最喜欢的包管理器安装 pinia

yarn add pinia
# 或者使用 npm
npm install pinia

 在main.js中引入store

import { createApp } from 'vue'
import App from './App.vue'
// 引入pinia
import { createPinia } from 'pinia'
// createApp(App).mount('#app')
// import { createPinia } from 'pinia'

// app.use(createPinia())
const app = createApp(App);

app.use(createPinia())
app.mount('#app');

2.创建一个Store

在项目根目录的   src文件夹 —— 创建store文件夹 —— 创建 index.js 文件

index.js中

main 的解释—— 这里的"main"相当于stroe中的唯一标识

// 定义一个store
import {defineStore} from 'pinia';

export const  useStore = defineStore('main',{
  
})

在页面中的使用 —— 在相应的页面进行引入,下面以main.vue为例

// 使用store
import { useStore } from "../store/index";

五、state

大多数时候,state 是 store 的核心部分。 我们通常从定义应用程序的状态开始。 在 Pinia 中,状态被定义为返回初始状态的函数。 Pinia 在服务器端和客户端都可以工作。

index.js中state中的数据

// 定义一个store
import {defineStore} from 'pinia';

export const  useStore = defineStore('main',{
    // 定义一个state
    state:( )=>{
        return {
              // 声明一个数组,用来存储每条具体的购物记录
           goodsList : [
            { id: 1, title: "手机", price: 100, num: 1, checked: false },
            { id: 2, title: "平板", price: 500, num: 1, checked: false },
            { id: 3, title: "耳机", price: 200, num: 1, checked: false },
          ]
        }
    },
})

1.访问state

以在main.vue中的使用为例

使用store

// 使用store
import { useStore } from "../store/index";

使用store中的数据

哪里此时的  store   都有哪些数据呢?

 2.重置状态

将state中的数据重置到初始值

使用 —— store.$reset( )

重置状态的按钮事件

//  重置按钮的点击事件
const reset = ( )=>{
	store.$reset()
}
	

如下图案例所示:

 3.改变state

使用 —— store.$patch( )

改变姓名的按钮事件

const changeName = ( )=>{
	store.$patch({
		name: store.name = 'hhhh'
	}
	)
}

4.批量修改state

const changeName = ( )=>{
	store.$patch((state)=>{
		state.name = 'hhhh'
	})
}

5.替换state

使用 store.$state   = {  name:“Tom",age:20}


六、getters

Getter 完全等同于 Store 状态的 计算值。 它们可以用 defineStore() 中的 getters 属性定义。 他们接收“状态”作为第一个参数以鼓励箭头函数的使用:

1.访问getters

 

 // getters 依赖state中的状态
    getters:{
        changeName(state){
            return state.name = 'Taylor Swift'
        },
        
    }

在页面中访问getters

onMounted(()=>{
	store.changeName
})

我们在gettes中修改了getters中的值,在onMounted钩子中调用了getters中的属性,可以看到在页面加载时就已经更改了state中的属性。

 2.getters传参

Getters 只是幕后的 computed 属性,因此无法向它们传递任何参数。 但是,您可以从 getter 返回一个函数以接受任何参数:

在页面中调用并传递参数:

<span>{{store.changeName(1)}}</span>
export const useStore = defineStore('main', {
  getters: {
    getUserById: (state) => {
      return (userId) => state.users.find((user) => user.id === userId)
    },
  },
})

3.写为普通函数可调用this

大多数时候,getter 只会依赖状态,但是,他们可能需要使用其他 getter。 正因为如此,我们可以在定义常规函数时通过 this 访问到 整个 store 的实例, 但是需要定义返回类型(在 TypeScript 中)。 这是由于 TypeScript 中的一个已知限制,并且不会影响使用箭头函数定义的 getter,也不会影响不使用 this 的 getter

4.访问其他的store中的getters

  • 在当前store中引入其他的store
  • // 引入其他的模块
    import {useOtherStore} from './other'
  • 在当前store中即可调用其他模块中的store,其实pinia并无需再像vuex中进行模块化,你所建立的每一个.js文件都是一个单独的模块,你只需要在需要使用时在页面进行引入即可。
  •  // 访问其他的store中的getter
            otherGetter(state){
                const otherStore = useOtherStore();
                return state.name + otherStore.changeHoppy;
            }

七、actions

Actions 相当于组件中的 methods。 它们可以使用 defineStore() 中的 actions 属性定义,并且它们非常适合定义业务逻辑

1.访问actions

例如,我在 页面中调用actions中的方法改变state中的值:

const changeHeight = ( )=>{
	store.changeHeight()
}
 actions:{
        changeHeight(){
           this.height ++
        }
    }
    

2.调用其他store中的actions

关于调用的方法与上面getters中的方法相同,在这里就不做赘述!

八、小彩蛋——购物车案例分享

今天我学会了使用  gitee ,这样我就可以把我的代码托管在上面,也方便感兴趣的小伙伴进行查阅!地址在这儿:

    vue3: 利用vue3+pinia 实现购物车功能

总结

以上就是今日所要分享的内容,写到这里我也正好再一次的把pinia的使用复习了一遍,希望我写下的东西能够帮助到你。最后依旧祝福屏幕前的你健康快乐、平安幸福!

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

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

相关文章

可见光热红外图像融合算法设计

本设计方式中对于多源图像融合算法采用以下三个步骤进行&#xff1a; 多源图像目标特征提取&#xff1b;多源图像配准&#xff1b;多源图像融合。 1&#xff0e;多源图像目标特征提取 多源图像的目标特征提取中&#xff0c;优先对目标图像进行预处理&#xff0c;对于可见光图像…

品牌势能铸就非凡经典,凯里亚德与郁锦香酒店亮相品牌沙龙会烟台站

近日&#xff0c;汇聚国内众多投资人的锦江酒店(中国区)品牌沙龙会烟台站顺利举行。本次沙龙活动以“齐风鲁韵 锦绘未来”为主题&#xff0c;锦江酒店(中国区)旗下众多优秀品牌共同亮相。凯里亚德酒店与郁锦香酒店在本次活动中向投资人展示了在如今复杂多变的酒店市场中如何以强…

Java面向对象:继承

面向对象三大特征之二&#xff1a;继承 目录 面向对象三大特征之二&#xff1a;继承 1.继承是什么&#xff1a; 2.继承的好处 继承概述的总结 1.什么是继承&#xff1f;继承有什么好处&#xff1f; 2.继承的格式是什么样的&#xff1f; 3.继承后子类的特点是什么&#x…

Docker介绍及项目部署

安装Docker 关闭SELINUX服务 SELINUX是CentOS系统捆绑的安全服务程序&#xff0c;因为安全策略过于严格&#xff0c;所以建议搭建关闭这项服务 修改/etc/selinux/config文件&#xff0c;设置SELINUXdisabled vim /etc/selinux/config # 设置SELINUXdisabled# 设置完成后重启…

[附源码]计算机毕业设计姜太公渔具销售系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Crane如何做到利用率提升3倍稳定性还不受损?

作为云平台用户&#xff0c;我们都希望购买的服务器物尽其用&#xff0c;能够达到最大利用率。然而要达到理论上的节点负载目标是很的&#xff0c;计算节点总是存在一些装箱碎片和低负载导致的闲置资源。下图展示了某个生产系统的CPU资源现状&#xff0c;从图中可以看出&#x…

编译器设计(十二)——指令选择

文章目录一、简介二、代码生成三、扩展简单的树遍历方案四、通过树模式匹配进行指令选择4.1 重写规则4.2 找到平铺方案五、通过窥孔优化进行指令选择5.1 窥孔优化5.2 窥孔变换程序六、高级主题6.1 学习窥孔模式6.2 生成指令序列七、小结和展望一、简介 指令选择&#xff08;in…

java面试题-并发

1. 并行和并发有什么区别&#xff1f; 并行&#xff1a;多个处理器或多核处理器同时处理多个任务。并发&#xff1a;多个任务在同一个 CPU 核上&#xff0c;按细分的时间片轮流(交替)执行&#xff0c;从逻辑上来看那些任务是同时执行。 如下图&#xff1a; 并发 两个队列和一…

从功能测试到自动化测试,待遇翻倍,我整理的超有用工作经验分享~

我想应该有很多测试人员应该有这样的疑虑&#xff0c;自动化测试要怎么去做&#xff0c;现在我把自己的一些学习经验分享给大家&#xff0c;希望对你们有帮助&#xff0c;有说的不好的地方&#xff0c;还请多多指教&#xff01; 对于测试人员来说&#xff0c;不管进行功能测试还…

从股票市场选择配对的股票:理论联系实际

我们有了计算距离的方法&#xff0c;即共同因子相关系数的绝对值就是衡量协整性的一个好方法。现在看一些实际应用中会遇到的问题。 整合的特定回报的平稳性&#xff08;Stationarity of Integration Specific Returns) 两个时间序列协整的必要条件是整合的特定回报时序是平稳…

k8s安装3节点集群Fate v1.7.2

采用k8s&#xff0c;而非minikube, 在3个centos系统的节点上安装fate集群。 集群配置信息 3节点配置信息如下图&#xff1a; 当时kubefate最新版是1.9.0&#xff0c;依赖的k8s和ingress-ngnix版本如下&#xff1a; Recommended version of dependent software: Kubernetes:…

Java编码的坑你知多少?

货币计算坑&#xff1a; 这段代码你认为结果是多少&#xff1f; 我们期望的结果是0.4&#xff0c;也应该是这个数字&#xff0c;但是打印出来的却是0.40000000000000036&#xff0c;这是为什么呢&#xff1f; 这是因为在计算机中浮点数有可能&#xff08;注意是可能&#xff0…

Flask从入门到放弃(介绍、模版语法案例、配置文件、路由本质、CBV整体流程)

文章目录一、Flask介绍二、Flask快速使用三、Flask展示用户信息案例四、Flask配置文件五、路由系统1&#xff09;路由系统2&#xff09;路由本质3&#xff09;Add_url_rule的参数六、Flask的CBV1&#xff09;CBV的写法2&#xff09;CBV添加装饰器3&#xff09;as_view的执行流程…

排名前十的仓库管理系统大盘点(真实测评)!

通过本篇文章&#xff0c;您将了解以下问题&#xff1a;1、国内适合企业的仓库管理系统软件有哪些&#xff0c;排名怎么样&#xff1f;2、企业在选择仓库管理系统时应考虑哪些因素&#xff1f; 目前市场上有多种仓库管理系统&#xff0c;不同的仓库管理系统由于目标市场的不同…

dumi 如何使用?一文教你使用,高效写出你的博客、组件库文档

文章目录一、dumi介绍二、使用 dumi 的两种方式&#xff08;着重在已成型项目中使用dumi&#xff09;2.1、基于 dumi 官网带有的脚手架去进行开发2.2、在已成型的项目中引用 dumi 插件&#xff0c;运行项目2.3、dumi中使用scss2.4、如何在组件内写 tsx | md 文档2.4.1、button/…

DataX 二次开发支持 Oracle 更新数据

文章目录1、原理2、源码修改2.1 OracleWriter注释对writeMode的限制2.2 WriterUtil&#xff0c;增加oracle逻辑2.3 CommonRdbmsWriter.Task修改2.4 测试前文回顾&#xff1a; 《DataX 及 DataX-Web 安装使用详解》 《DataX 源码调试及打包》 《DataX-Web 源码调试及打包》 目前…

2022年四川建筑八大员(土建施工员)考试试题及答案

百分百题库提供建筑八大员&#xff08;土建&#xff09;考试试题、建筑八大员&#xff08;土建&#xff09;考试预测题、建筑八大员&#xff08;土建&#xff09;考试真题、建筑八大员&#xff08;土建&#xff09;证考试题库等,提供在线做题刷题&#xff0c;在线模拟考试&…

RabbitMQ基础概念

文章目录RabbitMQ介绍AMQPErlang架构模型PublisherConnectionChannelVirtual HostExchangeBindingConsumerRabbitMQ介绍 RabbitMQ是实现了高级消息队列协议&#xff08;AMQP&#xff09;的开源消息代理软件&#xff08;亦称面向消息的中间件&#xff09;。RabbitMQ服务器是用Er…

Qt-数据库开发-事务提交(3)

Qt-数据库开发-通过QSqlTableModel显示和修改数据&#xff0c;开启事务 文章目录Qt-数据库开发-通过QSqlTableModel显示和修改数据&#xff0c;开启事务1、概述2、实现效果3、主要代码4、完整源代码更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;数据库…

毕设选题推荐基于python的django框架的疫苗预约接种管理系统

&#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设老哥&#x1f525; &#x1f496; 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; Java实战项目专栏 Python实…