vue-query的使用

news2024/11/23 7:19:28

 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,
});

@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会重新发送请求

总结

vue-query 只适用于存储从服务端获取的数据,如果有另外的数据需要存储还是要用到 pinia,但是这种数据是比较少的,这样也可以使得 pinia 中的代码量减少很多并简洁。当然这里介绍的 vue-query 的 api 是最简单的,你能想到的功能它基本都有,感兴趣的可以查看文档。

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

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

相关文章

优思学院:从西格玛计算出Cpk与不良率PPM

在品质控制的领域中&#xff0c;Cpk&#xff08;制程能力指数&#xff09;和PPM&#xff08;每百万个中不良品的个数&#xff09;是两个关键的指标&#xff0c;用来评估一个制程的稳定性和一致性。然而&#xff0c;这两者的计算并不简单&#xff0c;特别是当规格中心值与物品量…

openfeign和全局异常

我们在seata中使用openfeign调用服务的时候经常会出现一些问题 (1)在使用openfeign的时候使用到了全局异常,本来feign调用失败会触发降级异常,但是如果加上 全局异常处理器的话可能不会触发,导致降级失败 (2)服务a调用服务b的接口b(),b接口调用出错了,服务b本来应该返回异常,但…

最新ai系统ChatGPT商业运营版网站源码+支持GPT4.0/支持AI绘画+已支持OpenAI GPT全模型+国内AI全模型+绘画池系统

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

GPU渲染中各个步骤的作用

MainLightShadow(主光照阴影&#xff09;&#xff1a; 通常在渲染管线中的最开始阶段进行绘制&#xff0c;这是因为主要光源的阴影对于场景中的物体渲染和视觉效果非常重要。 下面是一些原因&#xff0c;解释为什么主光照阴影往往是在最开始绘制的&#xff1a; 1、视觉效果的…

关闭谷歌浏览器的自动更新 详细教程

1.前往资源库找到Google文件夹 2.进入找到GoogleSoftwareUpdate.bundle 并且删除 弹出删除框 需要我们使用指纹或者锁屏密码 就可以删除了 3.打开谷歌浏览器查看是否已经不再自动更新了 发现上面提示更新失败即可 将不会再次更新 window/其他电脑关闭自动更新教程参考&#x…

MFC实现堆栈窗口:多个子界面可任意切换

1、效果 在Qt中可使用QStackedWidget控件直接拖动布置即可实现&#xff0c;但在MFC中并未提供类似的控件&#xff0c;因此需要自己简单实现。 2、实现原理 实现原理比较简单&#xff0c;父级对话框在显示的区域部分&#xff0c;通过切换子对话框即可实现。子对话框去掉边框后…

ZOC8 for Mac:超越期待的终端仿真器

在Mac上&#xff0c;一个优秀的终端仿真器是每位开发者和系统管理员的必备工具。ZOC8&#xff0c;作为一款广受好评的终端仿真器&#xff0c;以其强大的功能和易用性&#xff0c;已经在Mac用户中积累了良好的口碑。本文将为您详细介绍ZOC8的各项特性&#xff0c;以及为什么它会…

如何从微信视频号中提取视频链接,视频号链接获取办法?

方法1&#xff1a;李华面临的新挑战 让我们回到李华的故事。他是一个自身的自媒体从业者&#xff0c;自己有一个很好的习惯&#xff0c;就是将自己喜欢的内容直接保存下载来。但是&#xff0c;微信视频号并没有提供直接下载的功能。此时&#xff0c;李华又陷入了困扰。 方法2&a…

MATLAB——一维小波的多层分解

%% 学习目标&#xff1a;一维小波的多层分解 clear all; close all; load noissin.mat; xnoissin; [C,L]wavedec(x,3,db4); % 3层分解&#xff0c;使用db4小波 [cd1,cd2,cd3]detcoef(C,L,[1,2,3]); % 使用detcoef函数获取细节系数 ca3appcoef(C,L,db4,3); …

ROS常用命令及多机(TX2 与虚拟机)通信步骤

目录 ROS常用命令 常用命令 ROS多机通信步骤 虚拟机中添加镜像源 TX2中添加镜像源 ROS常用命令 rostopic list 命令查看当前系统中有哪些 topic。 rostopic info 命令查看该 topic 的信息&#xff0c;包括它的数据类型、发布者数量等。 rostopic hz 命令查看该 topic 的发布…

GIT文件夹上面的状态(对钩或红色感叹号)不显示,解决

换了新电脑&#xff0c;GIT代码上传啥的都正常&#xff0c;但是文件中文件图标状态不显示&#xff0c;搜了一下已找到解决方法&#xff0c;实测有效。 第一步 winr&#xff0c;输入regedit.exe&#xff0c;打开注册表 第二步 找到以下路径 “ HKEY_LOCAL_MACHINE–>SOFTWA…

1992-2021年全国各省经过矫正的夜间灯光数据(GNLD、VIIRS)

1992-2021年省市县经过矫正的夜间灯光数据&#xff08;GNLD、VIIRS&#xff09; 1、时间&#xff1a;1992-2021年3月&#xff0c;其中1992-2013年为年度数据&#xff0c;2013-2021年3月为月度数据 2、来源&#xff1a;DMSP、VIIRS 3、范围&#xff1a;31省 4、指标解释&…

如何在实践中建立持久有效的6S管理呢?

提起6S管理&#xff0c;很多人可能认为是老旧的概念。然而&#xff0c;在三一集团&#xff0c;整理、整顿、清扫、清洁、素养和安全这12个字被执行到极致&#xff0c;甚至形成了一个共识&#xff1a;“搞不好6S的总经理是不合格的总经理”。这是因为三一集团高层通过多年的实践…

堆栈与队列算法-以链表来实现队列

目录 堆栈与队列算法-以链表来实现队列 C代码 堆栈与队列算法-以链表来实现队列 队列除了能以数组的方式来实现外&#xff0c;也可以用链表来实现。在声明队列的类中&#xff0c;除了和队列相关的方法外&#xff0c;还必须有指向队列前端和队列末尾的指针&#xff0c;即fron…

Mac用户心目中的四款首选原型工具

Wireframe、Mockup和prototype在原型工具中有什么区别&#xff1f; 无论你是刚进入这个行业的UX/UI设计师&#xff0c;还是已经进入这个行业多年的老手&#xff0c;你都必须在制作原型的过程中接触或听到三个非常重要的原型术语&#xff1a;“wireframe(线框图)Mockup”或“pr…

概念解析 | 雷达动态范围

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:雷达动态范围。 揭开雷达动态范围的神秘面纱 雷达动态范围是描述雷达系统性能的一个重要指标,它直接影响着雷达的检测能力。但是这个指标又比较抽象,对于非专业人员来说不太容易…

arcpy.AddIDMessage

描述 使用 AddIDMessage 函数编写任何标准错误或警告消息。 示例 代码 def _raise_conda_import_error():#使用 AddIDMessage 函数编写任何标准错误或警告消息。arcpy.AddIDMessage("ERROR", 260005)exit(260005) #检测导入的包是否存在错误&#xff0c;如果导入…

防抖节流适用于input输入查询

文章目录 1 当监听input 输入变化做接口查询时&#xff0c;会出现疯狂的请求接口。这里用计时器做时间段查询。当用户输入完成1s后再走查询 4次输入1&#xff0c;不做节流会打印&#xff1a;1 11 111 1111 1 当监听input 输入变化做接口查询时&#xff0c;会出现疯狂的请求接口…

勇立潮头丨家装设计师首选品牌意大利OXO专注品质 为消费者带来个性化整卫方案

近几年&#xff0c;“整装”赛道大热&#xff0c;“整家”、“整装”、“大家居”在行业内引发诸多热烈讨论。在卫浴行业&#xff0c;卫浴头部定制企业率先开启了一波套餐式营销战。 在传统的卫浴销售模式下对尺寸大小的匹配已经无法满足当今家居消费主力的需求&#xff0c;单…

技术学习群-第五期内容共享

本期是技术学习群第五期知识共享。对外免费开放。私聊即可。欢迎各位加入。 一起看看本期分享了些啥知识。 关于Python第三方装包-pandas 群友有提问&#xff1a; 这个问题还是比较明显的&#xff0c;直接将 Microsoft Visual C 14.0 下载安装即可。随后她又遇到了一个问题&…