Vue - pinia
Pinia 是 Vue 3 的官方状态管理库,旨在替代 Vuex,提供更简单的 API 和更好的 TypeScript 支持。Pinia 的设计遵循了组合式 API 的理念,能够很好地与 Vue 3 的功能结合使用。
Pinia 的基本概念
- Store: Pinia 中的核心概念,类似于 Vuex 中的 Store。它是一个用于管理状态的中心地点。
- State: 存储的数据,可以在多个组件之间共享。
- Getters: 类似于计算属性,用于从状态派生出新的信息。
- Actions: 用于包含逻辑的方法,可以用于修改状态或处理异步操作。
步骤一:下载 pinia :
npm install pinia
// 或者
pnpm install pinia
步骤二:设置 pinia :

步骤三:创建 store 文件夹
// person.ts 船舰一个新的 storeimport { defineStore } from "pinia";export const usePersonStore = defineStore('person', {// 真正存储数据的地方state() {return {sum:20}}
})
import axios from "axios";
import { nanoid } from "nanoid";
import { defineStore } from "pinia";export const useTalkStore = defineStore('talk', {actions: {async getATalk() {// 发送请求const res = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json')// 把请求回来的字符串,包装成一个对象// pnpm i nanoid 自动生成idconst obj = { id: nanoid(), title: res.data.content }// 放入数组当中this.talkList.unshift(obj);} },// 真正存储数据的地方state() {return {talkList: [{ id: '001', title: '星期一' },{ id: '002', title: '星期二' },{ id: '003', title: '星期三' },]}}
})

步骤四:使用 store (存储和读取数据)
// Person.vue 使用 pinia 前<template><div class="person"><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="changeSum1">加</button><button @click="changeSum2">减</button></div></template><script setup lang='ts' >
import { ref } from 'vue'const sum = ref(1);
// 选择的数字
const n = ref(1);const changeSum1 = ()=>{sum.value += n.value;
}
const changeSum2 = ()=>{sum.value -= n.value;
}</script>
<style scoped></style>
// Person.vue 使用 pinia 后
<template><div class="person"><h2>当前求和为:{{personStore.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="changeSum1">加</button><button @click="changeSum2">减</button></div></template><script setup lang='ts' >
import { ref } from 'vue'
import { usePersonStore } from '../store/person'const personStore = usePersonStore();
// 以下两种方式都可以拿到state中的数据
// console.log('@',personStore.sum);
// console.log('@@@',personStore.$state.sum);// 选择的数字
const n = ref(1);// const changeSum1 = ()=>{
// }
// const changeSum2 = ()=>{
// }</script>
<style scoped></style>
// Talk.vue 使用 pinia 前
<template><div class="talk"><button @click="getTalk">获取一句话</button><ul><li v-for="talk in talkList" :key="talk.id">{{talk.title}}</li></ul></div>
</template><script setup lang='ts'>
import axios from 'axios';
import { nanoid } from 'nanoid';
import { reactive } from 'vue';const talkList = reactive([{ id: '001', title: '星期一' },{ id: '002', title: '星期二' },{ id: '003', title: '星期三' },]);
const getTalk = async () => {// 简单写法:连续解构赋值 + 重命名// const {data:{content:title}} = await axios.get('https://api.uomg.com/api/rand/qinghua?format=json')// const obj = { id: nanoid(), title };// 发送请求const res = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json')// 把请求回来的字符串,包装成一个对象// pnpm i nanoid 自动生成idconst obj = { id: nanoid(), title: res.data.content }// 放入数组当中talkList.unshift(obj);
}
</script><style></style>
<template><div class="talk"><button @click="getTalk">获取一句话</button><ul><li v-for="talk in talkStore.talkList" :key="talk.id">{{talk.title}}</li></ul></div>
</template><script setup lang='ts'>import { useTalkStore } from '../store/talk';
// import { storeToRefs } from 'pinia';const talkStore = useTalkStore();// const { talkList } = storeToRefs(talkStore)// 与 watch 类似
talkStore.$subscribe((mutate,state) => {console.log('talkStore 里面保存的数据发生了变化',mutate,state);})
const getTalk=() => {talkStore.getATalk();
}</script><style></style>
步骤五:修改数据(三种方式)
// person.tsimport { defineStore } from "pinia";export const usePersonStore = defineStore('person', {// 真正存储数据的地方state() {return {sum: 20,name: '8520',age:20}},// actions 里面放的是一个个方法,用于响应组件中的“动作”actions:{increment(value){console.log('increment 被调用了', value);// 修改数据(this 是当前的 store)this.sum += value;}},getters: {// 可以对数据进行加工bigSum(state) {return state.sum * 10;},// 也可以被解构 调用}
})
<template><div class="person"><h2>当前求和为:{{personStore.sum}}</h2><h2>姓名:{{personStore.name}},年龄:{{personStore.age}}</h2><select v-model.number="n"><option value="1">1</option><option value="2">2</option><option value="3">3</option></select><button @click="changeSum1">加</button><button @click="changeSum2">减</button></div></template><script setup lang='ts' >
import { ref } from 'vue'
// 引入 usePersonStore
import { usePersonStore } from '../store/person'
import { storeToRefs } from 'pinia';// 使用 usePersonStore ,得到一个专门保存 person 相关的 store
const personStore = usePersonStore();// storeToRefs 只会关注 store 中的数据,不会对方法进行 ref 包裹
const { sum, name, age, bigSum } = storeToRefs(personStore)// 选择的数字
const n = ref(1);// 加
const changeSum1 = () => {// 第一种修改方式// personStore.sum += n.value;// 第二种修改方式 批量修改// personStore.$patch({// sum: 858,// name: '5632',// age:55// })// 第三种修改方式 利用 actionspersonStore.increment(n.value)}
// 减
const changeSum2 = () => {personStore.sum -= n.value;
}
</script>
相关文章:
Vue - pinia
Pinia 是 Vue 3 的官方状态管理库,旨在替代 Vuex,提供更简单的 API 和更好的 TypeScript 支持。Pinia 的设计遵循了组合式 API 的理念,能够很好地与 Vue 3 的功能结合使用。 Pinia 的基本概念 Store: Pinia 中的核心概念,类似于…...
JxBrowser 7.41.7 版本发布啦!
JxBrowser 7.41.7 版本发布啦! • 已更新 #Chromium 至更新版本 • 实施了多项质量改进 🔗 点击此处了解更多详情。 🆓 获取 30 天免费试用。...
亚博microros小车-原生ubuntu支持系列:17 gmapping
前置依赖 先看下亚博官网的介绍 Gmapping简介 gmapping只适用于单帧二维激光点数小于1440的点,如果单帧激光点数大于1440,那么就会出【[mapping-4] process has died】 这样的问题。 Gmapping是基于滤波SLAM框架的常用开源SLAM算法。 Gmapping基于RBp…...
Python 变量和简单数据类型思维导图_2025-01-30
变量和简单数据类型思维导图 下载链接腾讯云盘: https://share.weiyun.com/15A8hrTs...
小麦重测序-文献精读107
Whole-genome sequencing of diverse wheat accessions uncovers genetic changes during modern breeding in China and the United States 中国和美国现代育种过程中小麦不同种质的全基因组测序揭示遗传变化 大豆重测序-文献精读53_gmsw17-CSDN博客 大豆重测序二ÿ…...
Django基础之ORM
一.前言 上一节简单的讲了一下orm,主要还是做个了解,这一节将和大家介绍更加细致的orm,以及他们的用法,到最后再和大家说一下cookie和session,就结束了全部的django基础部分 二.orm的基本操作 1.settings.py&#x…...
大模型知识蒸馏技术(2)——蒸馏技术发展简史
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl2006年模型压缩研究 知识蒸馏的早期思想可以追溯到2006年,当时Geoffrey Hinton等人在模型压缩领域进行了开创性研究。尽管当时深度学习尚未像今天这样广泛普及,但Hinton的研究已经为知识迁移和模…...
android获取EditText内容,TextWatcher按条件触发
android获取EditText内容,TextWatcher按条件触发 背景:解决方案:效果: 背景: 最近在尝试用原生安卓实现仿element-ui表单校验功能,其中涉及到EditText组件内容的动态校验,初步实现功能后&#…...
毕业设计--具有车流量检测功能的智能交通灯设计
摘要: 随着21世纪机动车保有量的持续增加,城市交通拥堵已成为一个日益严重的问题。传统的固定绿灯时长方案导致了大量的时间浪费和交通拥堵。为解决这一问题,本文设计了一款智能交通灯系统,利用车流量检测功能和先进的算法实现了…...
[权限提升] 操作系统权限介绍
关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-CSDN博客 权限提升简称提权,顾名思义就是提升自己在目标系统中的权限。现在的操作系统都是多用户操作系统,用户之间都有权限控制,我们通过 Web 漏洞拿到的 Web 进程的…...
Qt Designer and Python: Build Your GUI
1.install pyside6 2.pyside6-designer.exe 发送到桌面快捷方式 在Python安装的所在 Scripts 文件夹下找到此文件。如C:\Program Files\Python312\Scripts 3. 打开pyside6-designer 设计UI 4.保存为simple.ui 文件,再转成py文件 用代码执行 pyside6-uic.exe simpl…...
数据结构与算法之栈: LeetCode LCR 152. 验证二叉搜索树的后序遍历序列 (Ts版)
验证二叉搜索树的后序遍历序列 https://leetcode.cn/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof/description/ 描述 请实现一个函数来判断整数数组 postorder 是否为二叉搜索树的后序遍历结果 示例 1 输入: postorder [4,9,6,5,8] 输出: false解释&#…...
蓝桥备赛指南(5)
这篇文章相对简单,主要是让大家简单了解下stack函数。 stack的定义和结构 stack是一种先进后出的数据结构,使用前也需要包含头文件<stack>。stack提供了一组函数来操作和访问元素,但它的功能相对简单。 stack的常用函数 1.push&…...
[STM32 - 野火] - - - 固件库学习笔记 - - -十三.高级定时器
一、高级定时器简介 高级定时器的简介在前面一章已经介绍过,可以点击下面链接了解,在这里进行一些补充。 [STM32 - 野火] - - - 固件库学习笔记 - - -十二.基本定时器 1.1 功能简介 1、高级定时器可以向上/向下/两边计数,还独有一个重复计…...
【面试题】 Java 三年工作经验(2025)
问题列表 为什么选择 spring boot 框架,它与 Spring 有什么区别?spring mvc 的执行流程是什么?如何实现 spring 的 IOC 过程,会用到什么技术?spring boot 的自动化配置的原理是什么?如何理解 spring boot 中…...
【信息系统项目管理师-选择真题】2006下半年综合知识答案和详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第…...
easyexcel-导入(读取)(read)-示例及核心部件
文章目录 导入(读取)(read)-示例及核心部件导入(读取)(read)-核心部件EasyExcel(EasyExcelFactory) # 入口read() # read()方法用于构建workbook(工作簿)对象,new ExcelReaderBuilder()doReadAll()这里选XlsxSaxAnalyser这个实现类吧然后到这个类XlsxRowHandler&…...
IPhone13 Pro Max设备详情
目录 产品宣传图内部图——后设备详细信息 产品宣传图 内部图——后 设备详细信息 信息收集于HubWeb.cn...
K8S中高级存储之PV和PVC
高级存储 PV和PVC 由于kubernetes支持的存储系统有很多,要求客户全都掌握,显然不现实。为了能够屏蔽底层存储实现的细节,方便用户使用, kubernetes引入PV和PVC两种资源对象。 PV(Persistent Volume) PV是…...
SVG 矩形:深入理解与实际应用
SVG 矩形:深入理解与实际应用 引言 SVG(可缩放矢量图形)是一种基于可扩展标记语言的图形矢量格式,用于在网页上创建矢量图形。SVG矩形是SVG图形中的一种基本形状,它允许用户在网页上绘制不同大小和颜色的矩形。本文将…...
高效学习方法分享
高效学习方法分享 引言 在信息高速发展的今天,学习已经成为每个人不可或缺的一部分。你是否曾感到学习的疲惫,信息的爆炸让你无从下手?今天,我们将探讨几种高效的学习方法,帮助你从中找到适合自己的学习之道。关于学…...
Linux---架构概览
一、Linux 架构分层的深度解析 1. 用户空间(User Space) 用户空间是应用程序运行的环境,与内核空间隔离,确保系统稳定性。 应用程序层: 用户程序:如 edge、vim,通过调用标准库(如 …...
2501,20个窗口常用操作
窗口是屏幕上的一个矩形区域.窗口分为3种:覆盖窗口,弹窗和子窗口.每个窗口都有由系统绘画的"非客户区"和应用绘画的"客户区". 在MFC中,CWnd类为各种窗口提供了基类. 1,通过窗柄取得CWnd指针 可调用Cwnd::FromHandle函数,通过窗柄取得Cwnd指针. void CD…...
[论文总结] 深度学习在农业领域应用论文笔记14
当下,深度学习在农业领域的研究热度持续攀升,相关论文发表量呈现出迅猛增长的态势。但繁荣背后,质量却不尽人意。相当一部分论文内容空洞无物,缺乏能够落地转化的实际价值,“凑数” 的痕迹十分明显。在农业信息化领域的…...
蓝桥杯例题一
不管遇到多大的困难,我们都要坚持下去。每一次挫折都是我们成长的机会,每一次失败都是我们前进的动力。路漫漫其修远兮,吾将上下而求索。只有不断努力奋斗,才能追逐到自己的梦想。不要害怕失败,害怕的是不敢去尝试。只…...
WPF基础 | 深入 WPF 事件机制:路由事件与自定义事件处理
WPF基础 | 深入 WPF 事件机制:路由事件与自定义事件处理 一、前言二、WPF 事件基础概念2.1 事件的定义与本质2.2 常见的 WPF 事件类型 三、路由事件3.1 路由事件的概念与原理3.2 路由事件的三个阶段3.3 路由事件的标识与注册3.4 常见的路由事件示例 四、自定义事件处…...
C++封装红黑树实现mymap和myset和模拟实现详解
文章目录 map和set的封装map和set的底层 map和set的模拟实现insertiterator实现的思路operatoroperator- -operator[ ] map和set的封装 介绍map和set的底层实现 map和set的底层 一份模版实例化出key的rb_tree和pair<k,v>的rb_tree rb_tree的Key和Value不是我们之前传统意…...
洛谷P11464 支配剧场
支配剧场 题目背景 May all the beauty be blessed. 题目描述 布洛妮娅和符华在寻找琪亚娜的途中,被支配之律者困在了支配剧场的高塔回廊之中。布洛妮娅敏锐地发现,虚无回廊是由一些支配之律者生成的积木构成的,只要击碎其中一些积木&#…...
自动化数据备份与恢复:让数据安全无忧
友友们好! 我的新专栏《Python进阶》正式启动啦!这是一个专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会找到: ● 深入解析:每一篇文章都将…...
如何用matlab画一条蛇
文章目录 源代码运行结果代码说明结果 源代码 % 画蛇的代码 % 2025-01-28/Ver1 % 清空环境 clc; clear; close all;% 定义蛇的身体坐标 t linspace(0, 4*pi, 100); % 参数化变量 x t; % x坐标 y sin(t) 0.5 * sin(3*t); % y坐标,形成更复…...
