vue-query的使用
vue-query,类似于vuex/pinia,以缓存为目的,但侧重的是对网络请求的缓存。
这是我预想的使用场景:假设在各个页面都需要发起相同的请求,去获取数据,而这种数据在一定时间内不会发生变化,那么这种请求数据是可以被缓存下来的。
pinia用于处理公共状态,vue-query用于处理服务端状态,准确的说是把原本需要在pinia中处理的服务端状态迁移到vue-query中。
本实例使用的vue版本是3.3.0
vue-query
github地址:DamianOsipiuk/vue-query: Hooks for fetching, caching and updating asynchronous data in Vue (github.com)
1、安装vue-query
npm i vue-query
2、在入口文件中引入
import { VueQueryPlugin } from 'vue-query'
import { createApp } from 'vue'import router from './router'import App from './App.vue'
const app = createApp(App)
app.use(router)
app.use(VueQueryPlugin);app.mount('#app')
3、使用
index.vue
<template><div>
首页
{{ isLoading }}
<showList/>
<button @click="goAbout">去about页面</button></div>
</template><script setup lang="ts">
import {ref} from 'vue'
import ajax from '@/common/ajax'
import {useQuery} from 'vue-query';
import {useRouter} from 'vue-router'
import showList from '@/components/showList.vue';
const router = useRouter();
const getData = ()=>{
//这里使用的是node写的接口服务,自行替换自己的接口return ajax('/live/api/packages/list');
}
const goAbout = ()=>{router.push('/about')
}
const {data,isLoading} = useQuery(["listData"], ()=>getData());</script><style scoped></style>
components/showList.vue
<template><div><h2>列表组件</h2><ul><li v-for="packages in packageList" :key="packages._id">{{ packages.name }}</li></ul></div>
</template><script setup lang="ts">
import { computed } from 'vue'
import { useQuery } from 'vue-query';const {data} = useQuery(["listData"]);const packageList = computed(() => data.value?.data.data.list);</script><style scoped></style>
效果展示

可以看到组使用 listData的缓存数据
接下来在首页跳转到about页面,在about页面也使用这份缓存数据
about.vue
<template><div><h2>About页面使用缓存数据</h2><ul><li v-for="packages in packageList" :key="packages._id">{{ packages.name }}</li></ul></div>
</template><script setup lang="ts">
import { computed } from 'vue'import { useQuery } from 'vue-query';
const { data } = useQuery(["listData"]);const packageList = computed(() => data.value?.data.data.list);</script><style scoped></style>
效果展示

跳转到about页面,是没有重新发送请求的,使用的是之前的缓存数据
但是发现在页面重新获取焦点和切换路由后,会重新发送请求,看文档说以下添加配置,但是发现不起效
const {data,isLoading} = useQuery(["listData"], ()=>getData(),{cacheTime: Infinity,staleTime: Infinity,
});
vue-query
@tanstack/vue-query
@tanstack/vue-query可以说是vue-query的强化版本,TanStack Query 是一个开源、功能齐全、支持 TypeScript 的库,非常适合用于处理客户端状态,处理异步或服务器状态。它支持React,Vue,Svelte,Solid框架,大多时候我们都会我们使用的框架把它叫做vue-query或者react-query。
特点
- 非常好用的query库,目的是为了缓存后端api的结果,不用像以前一样,手动将结果一个一个存储到store,并且提供了一些非常好用的hook方法
- 非常适合用于处理客户端状态,处理异步或服务器状态
- 默认支持异步
- 它并不是用于替代axios等请求库,而只是作为外层的封装,方便控制请求与结果
安装:
npm i @tanstack/vue-query
在入口文件注册
import { VueQueryPlugin } from '@tanstack/vue-query'
app.use(VueQueryPlugin);
复用上面的代码,只需要将vue-query改为@tanstack/vue-query
index.vue
<template><div>首页{{ isLoading }}<!-- {{ data }} --><!-- {{ datas }} --><showList /><button @click="goAbout">去about页面</button></div>
</template><script setup lang="ts">import ajax from '@/common/ajax'
import { useQuery } from '@tanstack/vue-query';import { useRouter } from 'vue-router'
import showList from '@/components/showList.vue';
const router = useRouter();const getData = () => {return ajax('/live/api/packages/list');
}const goAbout = () => {router.push('/about')
}const { data, isLoading } = useQuery({queryKey: ['listData'],queryFn: () => getData(),});</script><style scoped></style>
components/showList.vue
<template><div><h2>列表组件</h2><ul><li v-for="packages in packageList" :key="packages._id">{{ packages.name }}</li></ul></div>
</template><script setup lang="ts">
import { computed } from 'vue'
import {useQuery} from '@tanstack/vue-query';const { data } = useQuery({queryKey: ['listData']
});const packageList = computed(() => data.value?.data.data.list);</script><style scoped></style>
about.vue
<template><div><h2>About页面使用缓存数据</h2><ul><li v-for="packages in packageList" :key="packages._id">{{ packages.name }}</li></ul></div>
</template><script setup lang="ts">
import { computed } from 'vue'import { useQuery } from '@tanstack/vue-query';
const { data } = useQuery({queryKey:["listData"]
});const packageList = computed(() => data.value?.data.data.list);</script><style scoped></style>
设置refetchInterval,在规定间隔中重新发送请求
const { data, isLoading } = useQuery({queryKey: ['listData'],queryFn: () => getData(),refetchInterval: 12000
});
可以看到network会重新发送请求
@tanstack/vue-query
总结
vue-query 只适用于存储从服务端获取的数据,如果有另外的数据需要存储还是要用到 pinia,但是这种数据是比较少的,这样也可以使得 pinia 中的代码量减少很多并简洁。当然这里介绍的 vue-query 的 api 是最简单的,你能想到的功能它基本都有,感兴趣的可以查看文档。
相关文章:
vue-query的使用
vue-query,类似于vuex/pinia,以缓存为目的,但侧重的是对网络请求的缓存。 这是我预想的使用场景:假设在各个页面都需要发起相同的请求,去获取数据,而这种数据在一定时间内不会发生变化,那么这种…...
git本地搭建服务器[Vmware虚拟机访问window的git服务器]
先按照https://zhuanlan.zhihu.com/p/494988089说明下载好Gitblit然后复制到tomcat的webapps目录下,如下: 双击"startup.bat"启动tomcat: 然后访问"http://127.0.0.1:8080/gitblit/"即可看到git的界面: 说明git服务器已经能够成功运行了! Vmware虚拟机…...
【Python】基础练习题
1)从random库中选取相应的函数,用蒙特卡罗方法(统计实验方法)求解pi。 import randomdef estimate_pi(num_experiments):num_points_in_circle 0num_total_points 0for _ in range(num_experiments):x random.uniform(-1, 1)y…...
语雀故障与反思,顺便再领半年会员!
23 日语雀的故障相信大部分人都已经知道了,官方发布的公告是这样的: 10 月 23 日语雀出现重大服务故障,且持续 7 个多小时才完全恢复,给用户使用造成极大不便,对此我们深感抱歉。经过复盘,我们在这里向大家…...
PYTHON利用SQLAlchemy库高效操作关联的数据表
SQLAlchemy是一个Python库,用于处理关系型数据库的ORM(对象关系映射)和SQL表达式的生成。它提供了许多功能,包括: ORM(对象关系映射):允许将数据库表映射到Python对象,使…...
TypeScript中的类型工具
类型工具 是ts提供的一些内置的工具,用来更方便地处理各种类型,以及生成新的类型,可以直接使用。也就是对类型的操作。 1. 字符串类型工具 ts 内置了四个字符串类型工具,专门用来操作字符串类型。这四个工具类型都定义在 ts 自…...
File --JAVA
File --JAVA 构造方法 方法说明public File (String pathname)根据文件路径创建对象public File (String parent, String child)根据父路径名字字符串和子路径名字符串创建文件对象public File (String parent, String child)根据父路径对应文件对象和子路径名字符串创建文件…...
比较Excel中的两列目录编号是否一致
使用java代码比较excel中两列是否有包含关系,若有包含关系,核对编号是否一致。 excel数据样例如下: package com.itownet.hg;import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook;import j…...
pgsql 创建自增ID , 指定自增ID起始值
1. 创建序列: CREATE SEQUENCE table_name_id_seq; 2. 将序列与表的列关联: ALTER TABLE table_name ALTER COLUMN id SET DEFAULT nextval(table_name_id_seq);3. 设置序列的起始值、递增步长和最大值 // 将序列的起始值设置为 1 ALTER SEQUENCE ta…...
数据安全的重要性:如何解密[thekeyishere@cock.li].Elbie勒索病毒
尊敬的读者: 随着数字时代的来临,网络威胁也不断进化,而[datastorecyberfear.com].Elbie勒索病毒是其中的一个引人注目的例子。这个恶意软件采用高度精密的方法,将用户的数据文件锁定,并要求支付赎金以获取解锁密钥。…...
图像识别在自动驾驶汽车中的决策规划与控制策略研究。
图像识别在自动驾驶汽车中的决策规划与控制策略研究 随着自动驾驶技术的不断发展,图像识别已经成为实现自动驾驶的关键技术之一。在自动驾驶汽车中,图像识别技术主要用于环境感知、决策规划和控制系统。本文将重点探讨图像识别在自动驾驶汽车中的决策规…...
Spring MVC 的责任链模式
Spring MVC 框架使用了责任链模式来处理HTTP请求的流程。这个责任链模式主要包括多个拦截器(Interceptor)以及处理器(Handler),它们协同工作以完成请求的处理和响应。以下是Spring MVC的责任链模式的工作原理和流程图&…...
提升用户体验的关键步骤
快速搭建功能齐全的户外帐篷用具小程序,是现今越来越流行的一种商业模式。通过将线下的户外用品店转移到线上,不仅可以减少人力成本和租金等固定支出,还可以为用户提供更便捷的购物体验。因此,学习如何快速搭建一个功能齐全的户外…...
本地模拟,服务器下载文件
题目要求: 编写客户端程序和服务器端程序客户端可以输入一个音乐 文件名,比如 美丽中国,服务端 收到音乐后,可以给客户端返回这个音乐文件,如果服务器没有这个文件,返回一个默认的音乐即可客户端收到文件后…...
如何防止Shopee账户关联
在当今数字时代,隐私和安全问题变得日益重要。作为一家受欢迎的在线购物平台,Shopee卖家也面临着多账号关联的风险。本文将如何具保护Shopee免受关联。 一、MuLogin防关联指纹浏览器简介 MuLogin是一款专为隐私保护而设计的指纹浏览器,旨在保…...
Java 入门指南:使用 Docker 创建容器化 Spring Boot 应用程序
文章目录 步骤 1: 准备工作步骤 2: 克隆 Spring Boot 应用程序步骤 3: 创建 Dockerfile步骤 4: 构建 Docker 映像步骤 5: 运行容器步骤 6: 链接到本地数据库步骤 7: 使用 Docker Compose 运行多个容器步骤 8: 设置 CI/CD 管道结论 🎈个人主页:程序员 小侯…...
Leetcode 542. 01 矩阵
542. 01 矩阵-中等 问题描述 给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。 示例 1: 输入:mat [[0,0,0],[0,1,0],[0…...
分享一下微信小程序抽奖链接怎么做
标题:微信小程序抽奖链接制作全攻略,轻松玩转营销抽奖活动 一、引言 在当今的数字化时代,抽奖活动已经成为一种高效的市场营销策略,而微信小程序作为一个功能强大的移动端平台,为企业和个人提供了制作抽奖链接的便捷…...
MathType2024破解版激活序列号
MathType序列号是一款针对该软件而制作的激活工具,大家都知道这款软件在官方是需要花钱购买的,不然得话就只能试用。有很多功能都无法正常使用!而本序列号却可以完美的解决这一难题,因为它可以破解并激活“MathType”,…...
简述对 Spring MVC 的理解
SpringMVC 是一种基于 Java 语言开发,实现了 Web MVC 设计模式,请求驱动类型的轻量级 Web 框架。 Spring MVC组件 MVC 架构模式的思想,通过把 Model,View,Controller 分离,将 Web 层进行职责解耦࿰…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
