简记Vue3(五)—— Pinia

个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展
📃个人状态: 研发工程师,现效力于中国工业软件事业
🚀人生格言: 积跬步至千里,积小流成江海
🥇推荐学习:🍍前端面试宝典 🎨100个小功能 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js实战 🍒Three.js

🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧

文章目录

    • 前言
    • pinia

前言

重拾 Vue3,查缺补漏、巩固基础。

pinia

pinia 是一个状态管理库,类似于 Vue2 对应的状态管理库 Vuex。

先安装几个插件,便于后续编码。

// 发请求
yarn add axios
// 生成唯一id
yarn add nanoid
// pinia状态管理库
yarn add pinia

使用 pinia 时,我们通常把用于状态管理的文件放入 ./store 文件夹中,如下图所示。

在这里插入图片描述

main.ts 中使用 pinia。

import { createApp } from "vue";
import App from "./App.vue";
import { createPinia } from "pinia";const app = createApp(App);const pinia = createPinia();
app.use(pinia);
app.mount("#app");

我们在 App.vue 组件中引入 Count.vueLoveTalk.vue 组件并使用。

<template><Count></Count><hr /><LoveTalk></LoveTalk>
</template><script setup lang="ts">
import Count from "./components/Count.vue";
import LoveTalk from "./components/LoveTalk.vue";
</script>

Count.vue 组件中进行数字的运算操作。

  • 使用 store 里的东西需要先引入一下,如下面代码的 useCountStore()
  • 使用解构的方式从 countStore 里面取东西时需要使用 storeToRefs,用于 state 中的数据不丢失响应式
  • 使用 $patch 可以实现批量修改数据,此时只会重新渲染一次 DOM (性能比较好)
<template><div><h2>当前求和为:{{ sum }}</h2><h2>放大十倍:{{ bigSum }}</h2><h2>缩小十倍:{{ smallSum }}</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">
import { ref } from "vue";
import { useCountStore } from "../store/count";
import { storeToRefs } from "pinia";const countStore = useCountStore();// storeToRefs 只会关注 state 中的数据,不会对方法进行 ref 包裹
const { sum, bigSum, smallSum } = storeToRefs(countStore);let n = ref(1); // 用户选择的数学function add() {// 第一种修改方式// countStore.sum += n.value;// 第二种修改方式,可以批量修改数据//   countStore.$patch({//     sum: countStore.sum + n.value,//   });// 第三种修改方式,调用 actions 中的函数countStore.increment(n.value);
}function minus() {countStore.sum -= n.value;
}
</script>

我们在 ./store/count.ts 文件中对 count.vue 组件需要使用的数据进行存储管理。

  • 首先要从 pinia 中引入 defineStore,用于定义
  • defineStore 接收两个参数,第一个参数用来标识 store,第二个参数是一个对象,用于存储和管理数据
  • state 存储数据相当于 data
  • actions 中编写方法相当于 methods
  • getters 中处理和计算 state 中的属性相当于 computed
import { defineStore } from "pinia";export const useCountStore = defineStore("count", {actions: {increment(value: number) {this.sum += value;},},// 存储数据的地方state() {return {sum: 6,};},getters: {// 通过 this 获取 sumbigSum(): number {return this.sum * 10;},// 通过 state 传参获取 sumsmallSum: (state) => {return state.sum / 10;},},
});

同样的,我们在 LoveTalk.vue 中来两句土味情话。

  • 通过 storeToRefs 响应式的接收 talkList 数据
  • 使用 $subscribe 进行订阅,它主要用于监听状态的变化,并在状态发生变化时触发相应的回调函数(用途:登录后存储用户信息、数据持久化‌等)
<template><div><button @click="getLoveTalk">获得一句话</button><ul><li v-for="talk in talkList" :key="talk.id">{{ talk.title }}</li></ul></div>
</template><script setup lang="ts">
import { reactive } from "vue";
import { storeToRefs } from "pinia";
import { useLoveTalkStore } from "../store/loveTalk";const loveTalkStore = useLoveTalkStore();
const { talkList } = storeToRefs(loveTalkStore);// 订阅 => 在此可以进行一些浏览器存储数据的操作
loveTalkStore.$subscribe((mutate, state) => {console.log("loveTalkStore里面的数据发生了变换", loveTalkStore);
});function getLoveTalk() {loveTalkStore.getATalk();
}
</script>

./store/loveTalk.ts 文件中进行相关数据的存储和操作

  • 注释部分是选项时写法,非注释部分为组合式写法(推荐,但记得 return 出去)
import { defineStore } from "pinia";
import axois from "axios";
import { nanoid } from "nanoid";// 选项式写法
// export const useLoveTalkStore = defineStore("talk", {
//   actions: {
//     async getATalk() {
//       // 解构赋值 + 重命名
//       let {
//         data: { content: title },
//       } = await axois.get("https://api.uomg.com/api/rand.qinghua?format=json");//       let obj = { id: nanoid(), title };//       this.talkList.unshift(obj);
//     },
//   },
//   state() {
//     return {
//       talkList: [
//         { id: "1", title: "张三" },
//         { id: "2", title: "法外狂徒" },
//         { id: "3", title: "罗老师" },
//       ],
//     };
//   },
// });// 组合式写法
import { reactive } from "vue";
export const useLoveTalkStore = defineStore("talk", () => {const talkList = reactive([{ id: "1", title: "你好" },{ id: "2", title: "我..." },{ id: "3", title: "你懂的" },]);async function getATalk() {// 解构赋值 + 重命名let {data: { content: title },} = await axois.get("https://api.uomg.com/api/rand.qinghua?format=json");let obj = { id: nanoid(), title };talkList.unshift(obj);}// 记得 returnreturn { talkList, getATalk };
});

在这里插入图片描述

以上是 pinia 的基本使用,对于详情内容请参阅 Pinia中文文档


参考资料:
https://www.bilibili.com/video/BV1Za4y1r7KE?spm_id_from=333.788.videopod.episodes&vd_source=f839085517d2b7548b2939bfe214d466&p=51

在这里插入图片描述


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

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

相关文章

C++11语法介绍(1) -- 列表初始化{},左值和右值,右值引用和移动语义,引用折叠,完美转发

目录 1.C11的发展时间线 2.列表初始化 2.1C98传统的{} 2.2C11中的{} 2.3C11中的std::initializer_list 2.3.1vector中initializer list构造的模拟实现 2.3.2以vector为例演示initializer_list版本的构造 3.右值引用和移动语义 3.1左值和右值 3.2左值引用和右值引用 3.3…

C++编程:利用环形缓冲区优化 TCP 发送流程,避免 Short Write 问题

文章目录 1. 什么是 Short Write 问题&#xff1f;2. 如何解决 Short Write 问题&#xff1f;2.1 方法 1&#xff1a;将 Socket 设置为阻塞模式2.2 方法 2&#xff1a;用户态维护发送缓冲区 3. 用户态维护发送缓冲区实现3.1 核心要点3.2 代码实现3.3 测试程序 参考文档 1. 什么…

第十三届交通运输研究(上海)论坛┆智能网联汽车技术现状与研究实践

0.简介 交通运输研究&#xff08;上海&#xff09;论坛&#xff08;简称为TRF&#xff09;是按照国际会议的组织原则&#xff0c;为综合交通运输领域学者们构建的良好合作交流平台。交通运输研究&#xff08;上海&#xff09;论坛已经成功举办了十二届&#xff0c;凝聚了全国百…

中仕公考:大三大四考公备考时间线

大三大四想要考公务员的可以借鉴以下时间线&#xff1a; 大三下学期&#xff1a; 基础看课阶段&#xff0c;刚开始先打好基础很重要&#xff0c;根据课程和教材理解知识点&#xff0c;按照模块学习&#xff0c;对考试科目的题型有深入的认识和掌握。 大四初&#xff1a; 强…

Android Studio 将项目打包成apk文件

第一步&#xff1a;选择Build -> Generate Signed APK 会出现&#xff1a; 我们选择 Create new… 然后选择你要存放密钥的地方 点击ok之后&#xff0c;则选择好了文件&#xff0c;并生成了jks文件了。 点击ok之后&#xff0c; 会出现&#xff1a; 选择release&#xf…

FFmpeg存放压缩后的音视频数据的结构体:AVPacket简介,结构体,函数

如下图的解码流程&#xff0c;AVPacket中的位置 FFmpeg源码中通过AVPacket存储压缩后的音视频数据。它通常由解复用器&#xff08;demuxers&#xff09;输出&#xff0c;然后作为输入传递给解码器。 或者从编码器作为输出接收&#xff0c;然后传递给多路复用器&#xff08;mux…

纺织品缺陷检测

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

SSM房屋销售管理系统-计算机毕业设计源码49529

摘 要 随着国民生活水平的提高&#xff0c;人们日益重视休闲旅游&#xff0c;而互联网的普及也为房屋销售管理带来了新的机遇。将房屋租赁产业与互联网相结合&#xff0c;利用 SSM 框架建设房屋销售管理系统&#xff0c;实现房屋销售管理的网络化&#xff0c;对提高国民经济发展…

【PLC一体机】触摸屏上一直显示ERR警示灯的原因和解决方法

博主之前买了一个PLC一体机&#xff0c;在触摸屏上有ERR、RUN和SYS三个显示灯&#xff08;如下图&#xff09; 其中触摸屏工作时&#xff0c;RUN显示灯会显示为绿色&#xff0c;证明触摸屏正常工作。 SYS是触摸屏上刷写PLC程序和触摸屏程序时&#xff0c;会显示为橙色&#xf…

(十四)JavaWeb后端开发——MyBatis

目录 1.MyBatis概述 2.MyBatis简单入门 3.JDBC&#xff08;了解即可&#xff09; 4.数据库连接池​ 5.lombok 6.MyBatis基本操作 7.XML映射文件 8.动态SQL 8.1 if标签 8.2 foreach标签 8.3 sql/include标签​ 1.MyBatis概述 MyBatis是一款优秀的持久层&#xff08…

Elasticsearch可视化工具Elasticvue插件用法

目录 1.打开浏览器扩展程序(示例Edge浏览器) ​2.搜索elasticvue并安装 3.打开elasticvue ​4.连接Es 5.有些浏览器无法下载安装扩展&#xff0c;例如谷歌。可以打包扩展给别的浏览器使用。 5.1打开浏览器扩展&#xff0c;打开开发人员模式&#xff0c;记住扩展程序id 5…

数据结构之排序补充

1. 非比较排序 上一篇文章我们罗列了数据结构中排序的八种方法。这八种方法都是需要比较才能实现的&#xff0c;那怎么样才可以通过非比较的方法来实现数组的排序呢&#xff1f;这里就提供一种非比较排序的方法。 具体的操作思路如下&#xff1a; 1. 先统计待比较数组arr中重…

1.62亿元!812个项目立项!上海市2024年度“科技创新行动计划”自然科学基金项目立项

本期精选SCI&EI ●IEEE 1区TOP 计算机类&#xff08;含CCF&#xff09;&#xff1b; ●EI快刊&#xff1a;最快1周录用&#xff01; 知网(CNKI)、谷歌学术期刊 ●7天录用-检索&#xff08;100%录用&#xff09;&#xff0c;1周上线&#xff1b; 免费稿件评估 免费匹配期…

危!这些高危端口再不知道问题就大了

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 端口作为网络通信的基本单元&#xff0c;用于标识网络服务和应用程序。 但某些端口由于其开放性和易受攻击的…

Excel中截取中文地址转换为省、市、区

使用方法/步骤 首先我们在网页打上方方格子&#xff0c;进入官网&#xff0c;下载方方格子。 解压后进行安装&#xff0c;打开OFFIE中的EXCEL&#xff0c;可以发现新新添加一个DIY工具箱&#xff0c;其中的提取地址功能可以将字符串地址解析为省、市、区 如下图所示

引入 axios,根据 api 文档生成调用接口

起步 | Axios Docs 安装 axios npm install axios 生成 api 调用接口【可选】 https://github.com/ferdikoomen/openapi-typescript-codegen 安装 npm install openapi-typescript-codegen --save-dev 然后执行生成代码 # http://localhost:8805/api/user/v3/api-docs&a…

2款使用.NET开发的数据库系统

今天大姚给大家分享2款使用.NET开发且开源的数据库系统。 Garnet Garnet是一款由微软研究院基于.NET开源的高性能、跨平台的分布式缓存存储数据库&#xff0c;该项目提供强大的性能&#xff08;吞吐量和延迟&#xff09;、可扩展性、存储、恢复、集群分片、密钥迁移和复制功能…

ARM-8 定位发布版本 pstree 程序的 main 地址

逆向时如何找到main&#xff0c;如下&#xff1a; 1.readelf -h pstree ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2s complement, little endian Versi…

13.UE5流星火雨,引导施法技能制作

2-15 流星火雨&#xff0c;引导施法技能制作、随机数_哔哩哔哩_bilibili 目录 1.为流星火雨添加按键映射 2.创建流星火雨的动画蒙太奇 3.实现播放动画蒙太奇的逻辑 ​编辑 4.定义发射一波流星火雨的发射物 5.使用动画通知释放流星火雨 1.为流星火雨添加按键映射 创建名为流…

Web大型网站的性能测试要求和工具方法

Web大型网站的性能测试要求和工具方法涉及多个层面的考量&#xff0c;旨在确保网站在高并发访问、大数据量处理、复杂交互场景下仍能保持良好的用户体验和系统稳定性。以下是针对大型网站性能测试的主要要求和相应的工具与方法&#xff1a; 性能测试要求 1. 高并发处理能力&…