Vue - pinia

server/2025/1/31 15:06:28/

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>


http://www.ppmy.cn/server/163819.html

相关文章

vue相关的页面和js编写

vue和后端调用 1 前端vue的查询接口&#xff08;在src下的api中的对应目录编写调用后端的请求方法&#xff09; dispord.js文件 import request from /utils/request //封装了ajaxconst api_name /pms/dispord //对应后端controller上面的公共的请求路径 -- 到nginx中了…

【长期更新】RN+expo 错误解决方案

Warning: Internal React error: Expected static flag was missing. Please notify the React team 复现的代码 import { useEffect, useRef } from react import React from react;const ModalShop ({ isVisible, onClose }) > {if (!isVisible) return null;const han…

使用 Intersection Observer 实现高效懒加载和滚动监听

在前端开发中&#xff0c;性能优化是提升用户体验的核心之一。随着网页内容的日益增多&#xff0c;如何高效地加载图片、视频等资源&#xff0c;以及如何监听用户的滚动行为&#xff0c;成为了前端开发者需要解决的难题。传统的滚动事件监听往往会带来性能瓶颈&#xff0c;尤其…

未来无线技术的发展方向

未来无线技术的发展趋势呈现出多样化、融合化的特点&#xff0c;涵盖速度、覆盖范围、应用领域、频段利用、安全性等多个方面。这些趋势将深刻改变人们的生活和社会的运行方式。 传输速度提升&#xff1a;Wi-Fi 技术迭代加快&#xff0c;如 Wi-Fi7 理论峰值速率达 46Gbps&#…

Python新春烟花

系列专栏 《Python趣味编程》《C/C趣味编程》《HTML趣味编程》《Java趣味编程》 系列文章 序号直达链接爱心系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4Python李峋同款可写字版跳动的爱心5Python流星雨代码6Python漂浮爱心代…

qt内部的特殊技巧【QT】

下面的代码实现一个进度条的功能&#xff1a; 代码一&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTimer> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJ…

大数据k-means聚类算法:基于k-means聚类算法+NLP微博舆情数据爬虫可视化分析推荐系统

文章目录 一、项目概述二、项目说明三、研究意义四、系统总体架构设计总体框架技术架构 五、K-means聚类算法部分模块六、 snownlp情感分析功能模块七、数据采集模块数据采集模块功能实现 八、数据管理模块九、项目截图十、结语 一、项目概述 当代社会&#xff0c;微博等社交媒…

three.js用粒子使用canvas生成的中文字符位图材质

three.js用粒子使用canvas生成中文字符材质 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Three.…