Vue3+ts(day07:pinia)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes

觉得有帮助的同学,可以点心心支持一下哈(笔记是根据b站上学习的尚硅谷的前端视频【张天禹老师】,记录一下学习笔记,用于自己复盘,有需要学习的可以去b站学习原版视频)

一、准备一个效果

App组件:

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

Count组件:

<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 {padding: 10px;border-radius: 10px;box-shadow: 0 0 10px;background-color: skyblue;
}
select,
button {margin: 0px 5px;height: 25px;
}
</style>

LoveTalk组件:

<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'
import { title } from 'process'
// 数据
let talkList = reactive([{id: 'wad1',title: '莫文蔚的阴天,孙燕姿的雨天,周杰伦的晴天,都不如你和我聊天。'},{id: 'wad2',title: '“你为什么要害我?”“害你什么?”“害我那么喜欢你!”'},{id: 'wad3',title: '你知道你和星星有什么区别吗?星星在天上,你在我心里。'}
])
// 方法
async function getLoveTalk () {// 发请求let result = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json')// 把请求回来的字符串,包装成一个对象let obj = { id: nanoid(), title: result.data.content }talkList.unshift(obj)
}
</script>
<style scoped>
.talk {padding: 10px;border-radius: 10px;box-shadow: 0 0 10px;background-color: orange;
}
select,
button {margin: 0px 5px;height: 25px;
}
</style>

二、搭建 pinia 环境

第一步:npm install pinia

第二步:操作src/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')

此时开发者工具中已经有了pinia选项

三、存储+读取数据

  1. Store是一个保存:状态业务逻辑 的实体,每个组件都可以读取写入它。
  2. 它有三个概念:state、getter、action,相当于组件中的: data、 computed 和 methods。
  3. 具体编码:src/store/count.ts
import { defineStore } from "pinia";
export const useCountStore = defineStore("count", {// 真正存储数据的地方state() {return {sum: 6,};},
});
  1. 具体编码:src/store/talk.ts
// 引入defineStore用于创建store
import { defineStore } from "pinia";// 定义并暴露一个store
export const useTalkStore = defineStore("talk", {// 动作actions: {},// 状态state() {return {talkList: [{id: "wad1",title: "莫文蔚的阴天,孙燕姿的雨天,周杰伦的晴天,都不如你和我聊天。",},{id: "wad2",title: "“你为什么要害我?”“害你什么?”“害我那么喜欢你!”",},{id: "wad3",title: "你知道你和星星有什么区别吗?星星在天上,你在我心里。",},],};},
});
  1. 组件中使用state中的数据
<template><div class="count"><h2>当前求和为:{{ sumStore.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'
import { useCountStore } from '@/store/count'
// 数据
let sumStore = useCountStore()
let n = ref(1) //用户选择的数据
// 方法
function add () {sumStore.sum += n.value
}
function minus () {sumStore.sum -= n.value
}
</script>
<template><div class="talk"><button @click="getLoveTalk">获取一句土味情话</button><ul><li v-for="talk in talkStore.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'
import { useTalkStore } from '@/store/talk'
// 数据
let talkStore = useTalkStore()
// 方法
async function getLoveTalk () {// 发请求let result = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json')// 把请求回来的字符串,包装成一个对象let obj = { id: nanoid(), title: result.data.content }talkStore.talkList.unshift(obj)
}
</script>

四、修改数据(三种方式)

  1. 第一种修改方式,直接修改countStore.sum = 666
  2. 第二种修改方式:批量修改
countStore.$patch({sum:999,school:'atguigu'
})
  1. 第三种修改方式:借助action修改(action中可以编写一些业务逻辑)
import { defineStore } from 'pinia'export const useCountStore = defineStore('count', {/*************/actions: {//加increment(value:number) {if (this.sum < 10) {//操作countStore中的sumthis.sum += value}},//减decrement(value:number){if(this.sum > 1){this.sum -= value}}},/*************/
})
  1. 组件中调用action即可
// 使用countStore
const countStore = useCountStore()// 调用对应action
countStore.incrementOdd(n.value)

五、storeToRefs

  • 借助storeToRefs将store中的数据转为ref对象,方便在模板中使用。
  • 注意:pinia提供的storeToRefs只会将数据做转换,而Vue的toRefs会转换store中所有数据包括方法。
<template><div class="count"><h2>当前求和为:{{sum}}</h2></div>
</template><script setup lang="ts" name="Count">import { useCountStore } from '@/store/count'/* 引入storeToRefs */import { storeToRefs } from 'pinia'/* 得到countStore */const countStore = useCountStore()/* 使用storeToRefs转换countStore,随后解构 */const {sum} = storeToRefs(countStore)
</script>

六、getters

  1. 概念:当state中的数据,需要经过处理后再使用时,可以使用getters配置。
  2. 追加getters配置。
// 引入defineStore用于创建store
import {defineStore} from 'pinia'// 定义并暴露一个store
export const useCountStore = defineStore('count',{// 动作actions:{/************/},// 状态state(){return {sum:1,school:'atguigu'}},// 计算getters:{bigSum:(state):number => state.sum *10,upperSchool():string{return this. school.toUpperCase()}}
})
  1. 组件中读取数据:
const {increment,decrement} = countStore
let {sum,school,bigSum,upperSchool} = storeToRefs(countStore)

七、$subscribe(订阅)

通过 store 的 $subscribe() 方法侦听 state 及其变化,类似于watch

mutate:本次修改的信息

state:真正修改的数据

talkStore.$subscribe((mutate, state) => {localStorage.setItem('talkList', JSON.stringify(talkList.value))
})

八、store组合式写法

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 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);}return { talkList, getLoveTalk };
});

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

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

相关文章

ENVI光谱识别指导采矿管理者监测铜矿分布

圣地亚哥SRGIS的GIS专家Chile需要利用影像光谱信号勘察Chuquicamata的铜矿分布。 解决方案 Chuquicamata是世界上最大的斑岩铜矿分布区。SRGIS发现西部地区只有有限的矿物和贫瘠的岩石&#xff0c;但东部有铜矿分布。为了进一步测定矿藏的情况&#xff0c;他们开发出一套程序&a…

NoSQL Redis配置与优化

一、关系数据库与非关系型数据库 1. 关系型数据库&#xff1a; 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记录。 SQL 语句&#xff08;标准数据查询语言&#xff09;就是一种基于关系型…

redis核心面试题一(架构原理+RDB+AOF)

文章目录 0. redis与mysql区别1. redis是单线程架构还是多线程架构2. redis单线程为什么这么快3. redis过期key删除策略4. redis主从复制架构原理5. redis哨兵模式架构原理6. redis高可用集群架构原理7. redis持久化之RDB8. redis持久化之AOF9. redis持久化之混合持久化 0. red…

穷人如何翻身赚钱?不妨试试这5个冷门生意,干好了,收入相当不错

根据统计数据&#xff0c;我国月收入超过3000元的人口已超过4亿&#xff0c;这意味着仍有约10亿人的月收入低于3000元。正因为如此&#xff0c;网络上许多人都自嘲为“穷人”。 然而&#xff0c;穷人真的无法改变自己的命运吗&#xff1f;并非如此。对于渴望赚钱的穷人来说&am…

传统蓝牙模块BR/EDR与低功耗蓝牙模块有什么区别?

传统蓝牙模块BR/EDR与低功耗蓝牙模块有什么区别&#xff1f;下面跟随美迅物联网MesoonRF从多个维度来了解。   概述&#xff1a;低功耗蓝牙采用了高斯频移键控&#xff08;GFSK&#xff09;。这里我们先抛开蓝牙的协议&#xff0c;单纯从Radio的角度看收发通信&#xff0c;Ra…

【Crypto】Url编码

文章目录 Url编码解题感悟 Url编码 Url编码 搞定 小小flag&#xff0c;拿下&#xff01; 解题感悟 有点饿了…

图数据库助力供应链柔性升级

导读 当今市场环境受短视频等流媒体影响&#xff0c;任何风险事件在社交网络中传播速度极其迅速&#xff0c;留给企业的反应时间按分秒计&#xff0c;传统供应链的年度计划面对剧烈变化的市场环境已失去意义。此外&#xff0c;受近年局势动荡的影响&#xff0c;市场需求和供应…

APISIX-简单使用

APISIX-简单使用 这个工具还是很不错的&#xff0c;可视化的配置很清晰 &#xff0c; 想用NGINX的配置模式也是可以的&#xff0c;就是要去修改配置文件了。 APISIX&#xff0c;一个很不错的可视化工具&#xff0c;用来代替Nginx相当不错&#xff0c;可作为Nginx的平替方案&…

【Python进阶】主流电商平台数据分析||数据采集返回商品详情主题链接主图SKU数据

Python是一种高级编程语言&#xff0c;广泛应用于软件开发、数据分析、人工智能、科学计算等领域。在软件开发方面&#xff0c;Python在网站开发、网络编程、桌面软件开发等方面有着广泛的应用。在数据分析和人工智能领域&#xff0c;Python的各种库如NumPy、Pandas、Matplotli…

守护者:ThingsBoard物联网网关在温室环境监测中的应用

系统设计 智慧农业温室大棚系统由传感器及执行设备、数据传输网关、智慧农业温室大棚管理平台组成。 系统支持实时采集温室大棚内的空气温湿度、土壤温湿度、光照和二氧化碳等环境参数&#xff0c;根据农作物的生长需求自动控制温室中电器设备的启停&#xff0c;从而达到植物生…

【Linux】信号集及信号集操作函数

文章目录 一、信号集是什么&#xff1f;二、信号集操作函数1. sigemptyset2. sigfillset3. sigaddset4. sigdelset5. sigismember6. sigprocmask (仅用于读取或更改block表)7. sigpending (仅用于读取pending表) 一、信号集是什么&#xff1f; 对于每个进程, 都有三个信号集, …

k8s集群部署成功后某个节点突然出现notready状态解决办法

通过&#xff1a; kubectl get nodes 查看master1节点为not ready 通过查看日志&#xff1a; journalctl -f -u kubelet.service 看到这里 查看状态&#xff1a; systemctl status kubelet.service 重启一样会报错 执行&#xff1a; swapoff -a 执行后&#xff0c;重启…

pytorch深度学习-环境搭建

1.Anaconda下载&#xff08;首先安装Anaconda不需要先安装Python了&#xff01;&#xff09; 版本 3.11. Download Anaconda Distribution | Anaconda 1.2 跳过注册直接下载 2.安装 直接next, (Install for 可以选择All Users&#xff0c;我选择的是All Users) 点击默认选项…

Qt Designer 使用笔记

目录 qt designer安装 预览 Ctrl R 使用 Qt Designer 设计的ui文件可以通过以下命令转为.py文件 命令行脚本&#xff1a; pycharm工具栏配置&#xff1b; pyqt5也是可以的&#xff1a; 2.2 测试是否配置成功 设置背景颜色&#xff1a; ui收集 qt designer安装 pip ins…

JavaEE-网络初识

文章目录 一、网络背景1.1 起源1.2 国内网络的发展 二、关键概念2.1 网络2.2 设备2.3 ip地址与端口号 三、协议3.1 协议分层3.2 OSI七层模型3.3 TCP/IP五层模型3.4 数据传输过程的简单叙述 一、网络背景 1.1 起源 在国外大概时上世纪70年代左右&#xff0c;网络就出现了&…

U-Mail邮件系统取得多项适配认证,全面支持国产化信创环境

随着信息技术的发展&#xff0c;信息化建设越来越深入到社会各个领域&#xff0c;成为驱动经济社会发展的重要力量。在此背景下&#xff0c;我国正加快构建国家信息安全保障体系&#xff0c;实现自主可控&#xff0c;形成安全可靠的信息技术体系。这正是我们所说的“信创”&…

ssl证书价格一年多少钱?怎么申请?

随着各大平台下架了一年期免费证书&#xff0c;免费证书的有效期都为90天。更多企业选择付费证书。费用是众多用户关心的话题&#xff0c;一年期SSL证书价格在几十到几千元不等。 一年期SSL证书价格查看https://www.joyssl.com/certificate/select/0-1000.html?nid16 下面是…

如何官方查询论文分区,中科院及JCR

中科院分区 有一个小程序&#xff1a;中科院文献情报中心分区表 点2023升级版&#xff0c;输入期刊名 大类1区 JCR分区 进入官方网站 Journal Citation Reports 输入要查询的期刊名&#xff0c;点开 拼命往下拉 这就是根据影响因子的排名&#xff0c;在computer science&am…

农业场景下的slam论文汇总

文章目录 概述2020Ground-Level Mapping and Navigating for Agriculture Based on IoT and Computer VisionCanopy Density Estimation in Perennial Horticulture Crops Using 3D Spinning Lidar SLAM 2021Mobile 3D scan LiDAR: a literature reviewSLAM in the Field: An E…

flutter webview加载本地文件出现跨域解决方案

一直报错 [INFO:CONSOLE(17)] "Access to image at file:///android_asset/flutter_assets/assets/jump/box_bottom.png from origin null has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome…