Vue3(四):Pinia

一、Pinia介绍

Pinia是一个专门为Vue.js设计的状态管理库,它提供了一种简单和直观的方式来管理应用程序的状态。在使用Pinia时,可以轻松地创建定义状态的存储,然后将其与Vue组件绑定,使它们能够使用该状态。和上一个博客提到的Vuex相比,Pinia 更加简单易用,体积更小,同时具有更好的 TypeScript 支持和插件系统。

在Vue.js的官网中,我们可以看到Pinia目前已经取代Vuex,成为Vue生态系统的一部分。

Vue2中我们用的是vuex,在Vue3中我们用Pinia.下面是vuex和pinia对比:

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

接下来我们准备实现这样一个效果:

二、搭建Pinia 环境

1.通过以下方式安装:

(建议先去看一下字节vue版本,如果是vue3.3以上的可以直接安装2.1版本(默认最新版本)的pinia,如果不是请安装更低版本,否则项目运行时将报错) 

npm install pinia@2.0.36

2.引入并创建使用pinia

//main.ts
import { createApp } from 'vue';
import App from './App.vue';/* 引入createPinia,用于创建pinia */
import { createPinia } from 'pinia';/* 创建pinia */
const pinia = createPinia();
const app = createApp(App);/* 使用插件 */ {
}
app.use(pinia);
app.mount('#app');

三、准备项目效果前期 

App.vue

<template><Count /><br><LoveTalk />
</template><script setup lang="ts" name="App">
import Count from './components/Count.vue'
import LoveTalk from './components/LoveTalk.vue'
</script>

components/Count.vue

<template><div class="count"><h2>当前求和为:{{ sum }}</h2><select v-model.number="n"><option value="1">1</option><option value="2">2</option><option value="3">3</option></select><button @click="add">加</button><button @click="minus">减</button></div>
</template><script setup lang="ts" name="Count">
import { ref } from "vue";
// 数据
let sum = ref(1) // 当前求和
let n = ref(1) // 用户选择的数字// 方法
function add() {sum.value += n.value
}
function minus() {sum.value -= n.value
}
</script><style scoped>
.count {background-color: skyblue;padding: 10px;border-radius: 10px;box-shadow: 0 0 10px;
}select,
button {margin: 0 5px;height: 25px;
}
</style>

components/LoveTalk.vue

(这里涉及到一个nanoid库的使用,直接npm i nanoid即可,主要用于生成唯一id)

<template><div class="talk"><button @click="getLoveTalk">获取一句土味情话</button><ul><li v-for="talk in talkList" :key="talk.id">{{ talk.title }}</li></ul></div>
</template><script setup lang="ts" name="LoveTalk">
import { reactive } from 'vue'
import axios from "axios";
import { nanoid } from 'nanoid'
// 数据
let talkList = reactive([{ id: 'ftrfasdf01', title: '今天你有点怪,哪里怪?怪好看的!' },{ id: 'ftrfasdf02', title: '草莓、蓝莓、蔓越莓,今天想我了没?' },{ id: 'ftrfasdf03', title: '心里给你留了一块地,我的死心塌地' }
])
// 方法
async function getLoveTalk() {// 发请求,下面这行的写法是:连续解构赋值+重命名let { data: { content: title } } = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json')// 把请求回来的字符串,包装成一个对象let obj = { id: nanoid(), title }// 放到数组中talkList.unshift(obj)
}
</script><style scoped>
.talk {background-color: orange;padding: 10px;border-radius: 10px;box-shadow: 0 0 10px;
}
</style>

这样我们可以看到初期效果 

 

 四、store和state/存储+读取数据

在src文件夹下新建store文件夹,在store文件夹下新建count.ts和loveTalk.ts。

1.store

Store是 Pinia 中管理状态的核心概念。它相当于一个 Vue 组件中的状态,但是 Store是一个独立的模块。

Store 是用 defineStore() 定义的,它的第一个参数要求是一个独一无二的名字,这个名字 ,也被用作 id ,是必须传入的, Pinia 将用它来连接 store 和 devtools。为了养成习惯性的用法,将返回的函数命名为 use… 是一个符合组合式函数风格的约定。

以useCountStore为例创建一个store:

// 引入defineStore用于创建store
import { defineStore } from 'pinia';// 定义并暴露一个store
export const useCountStore = defineStore('count', {
...
})

2.State

State 是 store 中存储数据的地方。可以把之前存储在vue文件中的数据拿过来存储在state里面。通过定义 State,可以在 store 的任何位置访问和修改数据。

在 Pinia 中,state 被定义为一个返回初始状态的函数。这使得 Pinia 可以同时支持服务端和客户端。

用法:

count.ts和Count.vue中

同理,loveTalk.ts和LoveTalk.vue中

截至到这里就完成了存储和读取数据,但是还没有完成修改的功能,点击按钮是无效的。 

五、修改数据的三种方法

第一种:countStore.

以Count.vue为例,修改sum为例 

function add() {// 第一种修改数据的方法countStore.sum += 1
}

第一种修改方式就是修改几次mutation几次 

第二种:$patch

通过$patch 批量修改

<h2>当前求和为:{{ countStore.sum }}</h2><h2>学校名称是{{ countStore.school }},坐落于{{ countStore.address }}</h2>
function add() {// 第二种 批量修改countStore.$patch({sum:888,school:'尚硅谷',address:'郑州'})
}

第二种通过$patch批量修改,点一次修改一组,提示修改patch一次 

第三种:actions 

适用于大量相同的修改,可以复用 

同理,loveTalk.ts和LoveTalk.vue中

六、storeToRefs 

解释:借助`storeToRefs`将`store`中的数据转为`ref`对象,方便在模板中使用。

注意:`pinia`提供的`storeToRefs`只会将数据做转换,而`Vue`的`toRefs`会转换`store`中数据。

用法:

(1)引入

import { storeToRefs } from "pinia";

(2)使用

// 只会关注数据,不会对方法进行ref包括
const {sum,school,address} = storeToRefs(countStore)

 (3)例如:之前这样写就很冗杂,怎么把countStore去掉呢?

如果直接使用const  {sum,school,address} = countStore.肯定是不行的,会丢失响应式。我们会想到用torefs,但是这里假如用torefs包括的话就会很危险,因为torefs是把所有的数据方法都变成响应式的了。但是我们这里不需要把方法变成响应式,所以就引入了storeToRefs

同理LoveTalk.vue中 

七、getters

1. 概念

当`state`中的数据,需要经过处理后再使用时,可以使用`getters`配置。

2.使用 

有两种方法:

第一种是使用箭头函数 

getters: {// 第一种// bigSum(state){//   return state.sum*10// },bigSum: (state) => state.sum * 10,
}

第二种是用this 

getters: {
// 第二种 thisupperSchool():string{return this.school.toUpperCase()//变成大写,this相当于store}},

 这两种方法都要在count.vue中引入,并使用插值语法引用

const {sum,school,address,bigSum,upperSchool} = storeToRefs(countStore)

八、$subscribe()

通过 store 的 `$subscribe()` 方法侦听 `state` 及其变化

在lovetalk.vue中 

talkStore.$subscribe((mutate, state) => {console.log('LoveTalk', mutate, state)//把数据存储在本地存储防止丢失,localStorage.setItem('talk', JSON.stringify(talkList.value))
}),

用stringify是为了把数据转化为字符串存储,否则显示object

如下所示,在本地存储存储成功

 这样我们可以实现刷新不丢失:

在lovetalk.ts中,不要写那些原来的数据,换成以下内容

但是这样还会有一个问题,就是初始的时候没有数据存在, 会报错

可以使用空数组来存初始的

state() {return {talkList:JSON.parse(localStorage.getItem('talkList') as string) ||[]};},

 九、store组合写法

以前是这样写的,里面包的actions,state 

组合写法就可以用类似于setup的写法,比较正常,不过最后记得return用到的方法 


import { defineStore } from 'pinia';
import axios from 'axios';
import { nanoid } from 'nanoid';
import { reactive } from 'vue';export const useTalkStore = defineStore('talk', () => {// talkList就是stateconst talkList = reactive(JSON.parse(localStorage.getItem('talkList') as string) || []);// getATalk函数相当于actionasync function getATalk() {// 发请求,下面这行的写法是:连续解构赋值+重命名let {data: { content: title },} = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json');// 把请求回来的字符串,包装成一个对象let obj = { id: nanoid(), title };// 放到数组中talkList.unshift(obj);}return { talkList, getATalk };
});

 以上仅为个人学习笔记,如有错误请指正

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

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

相关文章

【小程序】生成短信中可点击的链接

文章目录 前言一、如何生成链接二、仔细拜读小程序开发文档文档说明1文档说明2 总结 前言 由于线上运营需求&#xff0c;需要给用户发送炮轰短信&#xff0c;用户通过短信点击链接直接跳转进入小程序 一、如何生成链接 先是找了一些三方的&#xff0c;生成的倒是快速&#xf…

TVS参数、选型、对比

https://www.kdocs.cn/l/cpz6hHr7GRlh VRWM &#xff08;Reverse working voltage&#xff09; TVS 的最高工作电压&#xff0c;可连续施加不引起 TVS 劣化或损坏的最高工作峰值电压或直流峰值电压。 对于交流电压&#xff0c;用最高工作电压有效值表示&#xff0c;在VRWM 下&a…

科技助力上亿用户隐私安全保护,合合信息两款产品再获CCIA PIA星级标识

随着互联网技术的飞速发展&#xff0c;个人信息的收集、存储、使用和传输变得日益频繁&#xff0c;其泄露和滥用的风险也随之增加&#xff0c;个人信息保护已成为社会共同关注的热点议题。近期&#xff0c;“中国网络安全产业联盟&#xff08;CCIA&#xff09;数据安全工作委员…

【Windows】SecureCRT v9.2.3永久使用教程亲测可用

​ 软件介绍 SecureCRT 是一款常用的 SSH&#xff08;安全外壳协议&#xff09;和 Telnet 客户端软件&#xff0c;主要用于远程服务器管理和网络设备配置。它具有以下主要功能&#xff1a; 1.安全连接&#xff1a;SecureCRT 提供了强大的加密算法&#xff0c;保障用户与服务…

建立时间/保持时间为负是什么情况

目录 建立时间为负保持时间为负参考 在说明建立时间和保持时间为何为负的情况下&#xff0c;首先可以看看建立时间Tsu和保持时间Th的由来&#xff0c;可参考如下两篇文章&#xff1a; 建立时间和保持时间理解_为什么要满足建立时间和保持时间-CSDN博客 ic基础|时序篇&#xff…

GPT的使用

个人笔记&#xff08;整理不易&#xff0c;有帮助点个赞&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔&#xff1a;工作总结随笔_8、以前工作中都接触过哪些类型的测试文档-CSDN博客 网站sms-activate.or…

Linux知识点(3)

文章目录 11. 进程间通信11.1 管道11.1.0 |11.1.1 匿名管道11.1.2 命名管道11.1.3 用匿名管道形成进程池 11.2 system V共享内存11.2.1 system V函数11.2.2 system 命令 11.3 system V消息队列11.4 system V 信号量 12. 进程信号12.1 前台进程和后台进程12.1.1 jobs12.1.2 fg &…

哈尔滨等保测评之什么是linux及快捷方式,看完这篇你还有什么不懂得嘛?

Linux 的学习对于一个程序员的重要性是不言而喻的。前端开发相比后端开发&#xff0c;接触 Linux 机会相对较少&#xff0c;因此往往容易忽视它。但是学好它却是程序员必备修养之一。 什么是Linux Linux 系统内核与 Linux 发行套件的区别 Linux 系统内核指的是由 Linus Torva…

计算机网络(五)传输层

传输层 从通信和信息处理的角度看&#xff0c;传输层向它上面的应用层提供通信服务&#xff0c;属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层 传输层功能&#xff1a; 传输层提供应用进程之间的逻辑通信(即端到端的通信)。与网络层的区别区别是&#xf…

SSH客户端工具输入目标地址端口远程失败故障原因和解决方案

问题表现&#xff1a;SSH客户端工具输入目标地址端口远程失败时&#xff0c;出现ssh client 报 algorithm negotiation failed的异常信息。 使用SSH Secure Shell Client连接Linux服务器的SSH的时候有时会出现错误提示信息&#xff1a;ssh algorithm negotiation failed。这是…

ts文件用什么播放器?带您了解TS文件播放器的选择

ts文件用什么播放器&#xff1f;在数字多媒体时代&#xff0c;各种视频文件格式层出不穷&#xff0c;其中TS文件作为一种常见的视频封装格式&#xff0c;广泛应用于高清视频的制作与传输。然而&#xff0c;对于许多用户来说&#xff0c;如何选择合适的播放器来播放TS文件却是一…

Windows电脑使用Everything+cpolar搭建在线资料库并实现无公网IP管理文件

文章目录 推荐前言1.软件安装完成后&#xff0c;打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家…

算法——马尔可夫与隐马尔可夫模型

HMM&#xff08;Hidden Markov Model&#xff09;是一种统计模型&#xff0c;用来描述一个隐含未知量的马尔可夫过程&#xff08;马尔可夫过程是一类随机过程&#xff0c;它的原始模型是马尔科夫链&#xff09;&#xff0c;它是结构最简单的动态贝叶斯网&#xff0c;是一种著名…

attention and tell论文【无标题】

这个公式使用LaTeX语法表示为&#xff1a; ( i t f t o t c t ) ( σ σ σ tanh ⁡ ) T D m n , n ( E y t − 1 h t − 1 x t ) \begin{pmatrix}i_t \\f_t \\o_t \\c_t\end{pmatrix} \begin{pmatrix}\sigma \\\sigma \\\sigma \\\tanh\end{pmatrix}T_{Dmn,n}\begin{pmatri…

内外网文件摆渡系统,如何贯通网络两侧被隔断的工作流?

随着业务范围不断扩大&#xff0c;产生的数据体量越来越多&#xff0c;企业会采取网络隔离&#xff0c;对核心数据进行保护。网络隔离主要目的是保护企业内部的敏感数据和系统不受外部网络攻击的风险&#xff0c;可以通过物理或逻辑方式实现&#xff0c;例如使用防火墙、网闸、…

Day13-Python基础学习之数据分析案例

数据分析案例 data_define.py # 数据定义的类 class Record:def __init__(self, date, order_id, money, province):self.date dateself.order_id order_idself.money moneyself.province province ​def __str__(self):return f"{self.date}, {self.order_id}, {se…

数学基础:深度学习的语言

数学基础&#xff1a;深度学习的语言 概述 在深度学习的世界里&#xff0c;数学不仅仅是一套工具&#xff0c;它是构建、理解和优化深度学习模型的基石。从向量空间的概念到复杂的优化算法&#xff0c;数学的每一个分支都在深度学习的发展中扮演着关键角色。本文的目标是通过深…

【前端面试3+1】17 伪类和伪元素的区别、CSS权重、图片显示优化、【二叉树最大深度】

一、伪类和伪元素的区别 1、伪类&#xff1a; 伪类是用来描述元素的特定状态的选择器&#xff0c;比如:hover、:active、:first-child等。伪类在选择器中以冒号&#xff08;:&#xff09;开头&#xff0c;用于匹配处于特定状态的元素。伪类可以用于选择DOM元素的特定状态&#…

zabbix解析以及安装

目录 目录 zabbix 是什么&#xff1f; 监控主要功能 zabbix 监控原理&#xff1a; zabbix运行机制 Zabbix的监控方式 Zabbix监控系统监控对象 Zabbix的优缺点 Zabbix的缺点 zabbix主要特点 zabbix 监控部署在系统中&#xff0c;包含常见的五个程序: 监控的架构 3.maste…

vscode和pycharm等idea编写protobuf文件格式化

想在pycharm或者goland等idea中开发protobuf文件的话&#xff0c;可以安装一个插件&#xff1a;protocol-buffers 安装之后&#xff0c;proto文件就会支持高亮和格式化了。 如果是vscode想要编写proto文件&#xff0c;可以安装另外一个插件&#xff1a;vscode-proto3 安装后&a…