使用Vue Query来获取数据

使用Vue Query来获取数据

构建现代大规模应用程序最具挑战性的方面之一是数据获取。加载和错误状态、分页、过滤、排序、缓存等功能会增加复杂性,并且经常会因大量样板代码而使应用程序变得臃肿。

vue query使用声明性语法处理和简化数据获取,并在幕后为我们处理所有这些重复性任务。

Vue Query介绍

Vue Query不能替代Axiosfetch。它是它们之上的抽象层。

管理服务器状态所面临的挑战与管理客户端状态不同且更加复杂。我们需要解决:

  • 缓存
  • 在后台更新过时的数据
  • 了解数据何时过期
  • 尽快反映数据更新
  • 将同一数据的多个请求合并为单个请求
  • 性能优化,例如分页和延迟加载
  • 管理服务器状态的内存和垃圾收集
  • 通过结构共享来记忆查询结果

Vue Query向我们隐藏了所有这些复杂性。它是根据最佳实践进行默认配置的,同时也提供了一种在需要时更改此配置的方法。

基本用法

在页面级别,我们需要获取所有产品,将它们显示在表格中,并使用一些简单的附加逻辑来选择其中一个。

<!-- 未使用vue query的组件 -->
<script setup>
import { ref } from "vue";
import BoringTable from "@/components/BoringTable.vue";
import ProductModal from "@/components/ProductModal.vue";const data = ref();
const loading = ref(false);async function fetchData() {loading.value = true;const response = await fetch(`https://dummyjson.com/products?limit=10`).then((res) => res.json());data.value = response.products;loading.value = false;
}fetchData();const selectedProduct = ref();function onSelect(item) {selectedProduct.value = item;
}
</script><template><div class="container"><ProductModalv-if="selectedProduct":product-id="selectedProduct.id"@close="selectedProduct = null"/><BoringTable :items="data" v-if="!loading" @select="onSelect" /></div>
</template>

在选择产品的情况下,我们将显示一个弹窗并在显示加载状态时获取附加产品信息。

<!-- 未使用vue query的组件 -->
<script setup>
import { ref } from "vue";
import GridLoader from 'vue-spinner/src/GridLoader.vue'const props = defineProps({productId: {type: String,required: true,},
});const emit = defineEmits(["close"]);const product = ref();
const loading = ref(false);async function fetchProduct() {loading.value = true;const response = await fetch(`https://dummyjson.com/products/${props.productId}`).then((res) => res.json());product.value = response;loading.value = false;
}fetchProduct();
</script><template><div class="modal"><div class="modal__content" v-if="loading"><GridLoader /></div><div class="modal__content" v-else-if="product">弹窗内容</div></div><div class="modal-overlay" @click="emit('close')"></div>
</template>

添加Vue Query

该库预先配置了合理的默认值。这意味着对于基本用法我们不需要做太多事情。

<!-- 使用vue query的组件 -->
<script setup>
import { useQuery } from "vue-query";function fetchData() {// 获取数据
}const { isLoading, data } = useQuery("uniqueKey",fetchData
);
</script><template>{{ isLoading }}{{ data }}
</template>

在上面的例子中:

  • uniqueKey是用于缓存的唯一标识符
  • fetchData是一个通过 API 调用返回承诺的函数
  • isLoading指示 API 调用是否已完成
  • data是对 API 调用的响应

让我们将其合并到我们的示例中:

<!-- 未使用vue query的组件 -->
<script setup>
import { ref } from "vue";
import { useQuery } from "vue-query";import BoringTable from "@/components/BoringTable.vue";
import OptimisedProductModal from "@/components/OptimisedProductModal.vue";async function fetchData() {return await fetch(`https://dummyjson.com/products?limit=10`).then((res) => res.json());
}const { isLoading, data } = useQuery("products",fetchData
);const selectedProduct = ref();function onSelect(item) {selectedProduct.value = item;
}
</script><template><div class="container"><OptimisedProductModalv-if="selectedProduct":product-id="selectedProduct.id"@close="selectedProduct = null"/><BoringTable :items="data.products" v-if="!isLoading" @select="onSelect" /></div>
</template>

由于加载状态由库处理,因此提取函数现在得到了简化。

这同样适用于弹窗组件:

<script setup>
import GridLoader from 'vue-spinner/src/GridLoader.vue'
import { useQuery } from "vue-query";const props = defineProps({productId: {type: String,required: true,},
});const emit = defineEmits(["close"]);async function fetchProduct() {return await fetch(`https://dummyjson.com/products/${props.productId}`).then((res) => res.json());
}const { isLoading, data: product } = useQuery(["product", props.productId],fetchProduct
);</script><template><div class="modal"><div class="modal__content" v-if="isLoading"><GridLoader /></div><div class="modal__content" v-else-if="product">弹窗内容</div></div><div class="modal-overlay" @click="emit('close')"></div>
</template>

上面有两点需要注意:

  • useQuery返回带有名称的响应data,为了重命名它,我们可以使用像const { data: product } = useQuery(...)这样的 es6 解构,当在同一页面上执行多个查询时,这也很有用。
  • 简单的标识符字符串不起作用,因为所有产品都将使用相同的函数。我们还需要提供产品 ID["product", props.productId]

我们没有做太多事情,但我们得到了很多开箱即用的东西。首先,即使没有网络限制,重新访问产品时缓存的性能改进也是显而易见的。

默认情况下,缓存的数据被认为是过时的。在以下情况下,它们会在后台自动重新获取:

  • 查询挂载的新实例
  • 窗口重新聚焦
  • 网络已重新连接。
  • 该查询可以选择配置重新获取间隔。

添加错误处理

到目前为止,我们的代码都默认 API 调用不会失败。但在实际应用中,情况并非总是如此。错误处理应该在 try-catch 块内实现,并且需要一些附加变量来处理错误状态。而Vue Query 通过提供isError变量提供了一种更直观处理错误的方式。

<script setup>
import { useQuery } from "vue-query";function fetchData() {// 获取数据
}const { data, isError, error } = useQuery("uniqueKey",fetchData
);
</script><template>{{ data }}<template v-if="isError">An error has occurred: {{ error }}</template>
</template>

Vue Query 通过用几行直观的代码逻辑替换复杂的样板代码来简化数据获取。这提高了可维护性并允许无缝连接新的服务器数据源。这样同样能使得应用程序速度更快、 响应更灵敏。

如果我们正在开发中型到大型应用程序,可以考虑将Vue Query添加到代码库中。

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

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

相关文章

维深(Wellsenn):2023中国消费端VR内容开发商调研报告(附下载

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 国内互联网大厂商入局VR&#xff0c;字节跳动、网易表态明确。字节跳动2021年收购国内头部VR硬件厂商PICO后&#xff0c;加速构建VR内容生态&#xff0c;2021年 成立海南创见未来当前已推出VR视频应用…

大语言模型之三 InstructGPT训练过程

大语言模型 GPT历史文章中简介的大语言模型的的发展史&#xff0c;并且简要介绍了大语言模型的训练过程&#xff0c;本篇文章详细阐述训练的细节和相关的算法。 2020年后全球互联网大厂、AI创业公司研发了不少AI超大模型&#xff08;百亿甚至千亿参数&#xff09;&#xff0c;…

【C语言】结构体(1)

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解C语言的结构体&#xff08;初阶&#xff09;&#xff0c;以后会出进阶的&#xff0c;如果大家觉得我写的不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 ① WHO IS 结构体② 结构体的作…

【学习日记】【FreeRTOS】手动任务切换详解

前言 本文是关于 FreeRTOS 中实现两个任务轮流切换并执行的代码详解。目前不支持优先级&#xff0c;仅实现两个任务轮流切换。 一、任务的自传 任务从生到死的过程究竟是怎么样的呢&#xff1f;&#xff08;其实也没死&#xff09;&#xff0c;这个问题一直困扰着我&#xf…

LeetCode[164]最大间距

难度&#xff1a;Hard 题目&#xff1a; 给定一个无序的数组 nums&#xff0c;返回 数组在排序之后&#xff0c;相邻元素之间最大的差值 。如果数组元素个数小于 2&#xff0c;则返回 0 。 您必须编写一个在「线性时间」内运行并使用「线性额外空间」的算法。 示例 1: 输入: …

nacos 403错误

403错误 2023-08-12 18:04:55,418 [main] ERROR [com.alibaba.cloud.nacos.client.NacosPropertySourceBuilder:106] [trace,span,parent] - get data from Nacos error,dataId:gateway-server.yaml, com.alibaba.nacos.api.exception.NacosException: <html><body&…

CSDN 直播:腾讯云大数据 ES 结合 AI 大模型与向量检索的新一代云端检索分析引擎 8月-8号 19:00-20:30

本次沙龙围绕腾讯云大数据ES产品展开&#xff0c;重点介绍了腾讯云ES自研的存算分离技术&#xff0c;以及能与AI大模型和文本搜索深度结合的高性能向量检索能力。同时&#xff0c;本次沙龙还将为我们全方位介绍腾讯云ES重磅推出的Elasticsearch Serverless服务&#xff0c;期待…

【BASH】回顾与知识点梳理(十六)

【BASH】回顾与知识点梳理 十六 十六. 十二至十五章知识点总结及练习16.1 总结16.2 练习16.3 简答题 该系列目录 --> 【BASH】回顾与知识点梳理&#xff08;目录&#xff09; 十六. 十二至十五章知识点总结及练习 16.1 总结 绝对路径&#xff1a;『一定由根目录 / 写起』…

permission denied while trying to connect to the Docker daemon socket 错误

安装 docker 执行错误如下&#xff1a; $ docker pspermission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get “http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json”: dial unix /var/run/docker.sock: connect:…

基于亚奈奎斯特采样和SOMP算法的平板脉冲响应空间插值matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ...................................................................... %fine regular gr…

本地构建包含java和maven的镜像

目录 1.前提条件 2.下载 2.1.创建Dockerfile 3.构建镜像 参考文章 1.前提条件 本地环境需要的系统和软件 win10 Docker Desktop Powershell 图1 Win10安装Docker后&#xff0c;直接在Powershell使用Docker命令 有些Developer不习惯win10系统&#xff0c;却想要使用Lin…

C++初阶——运算符重载

前言&#xff1a;前面介绍过了函数重载&#xff0c;C为了增强代码的可读性引入了运算符重载的概念&#xff0c;运算符重载是具有特殊函数名的函数&#xff0c;也具有其返回值类型。 下文博主将通过自定义类型日期类的比较引出运算符重载&#xff0c;以此凸显运算符重载提高代码…

Arraylist集合

保存数据会经常使用到数组&#xff0c;但数组存在以下几个缺陷: 长度固定&#xff1b;保存的必须为同一类型的元素&#xff0c;&#xff08;基本数据类型&#xff0c;或引用数据类型&#xff09;&#xff1b;使用数组进行增加元素的步骤比较麻烦&#xff1b; 这个时候就需要用一…

安卓:网络框架okhttp

目录 一、okhttp介绍 1. OkHttpClient类&#xff1a; 常用方法&#xff1a; 2. Request类&#xff1a; 常用方法&#xff1a; 3. Response类&#xff1a; 常用方法&#xff1a; 4. Call类&#xff1a; 常用方法&#xff1a; 5. Interceptor接口&#xff1a; 常用方法&…

在生产环境中部署Elasticsearch:最佳实践和故障排除技巧———索引与数据上传(二)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

MySQL语句总和之MySQL数据库与表结构操作

目录 1、启动MySQL服务 2、进入MySQL数据库 3、退出数据库 4、查看MySQL数据库所有库 5、创建、删除、使用、查看所处库操作 6、创建表 7、查看表结构 8、表结构操作 1&#xff09;修改表名 2&#xff09;自增长操作 3)添加一个address字段放在Phone字段后面 4)添加…

python爬虫3:requests库-案例1

python爬虫3&#xff1a;requests库-案例1 前言 ​ python实现网络爬虫非常简单&#xff0c;只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点&#xff0c;方便以后复习。 申明 ​ 本系列所涉及的代码仅用于个人研究与讨论&#xff0c;并不会对网…

SQLAlchemy 入门:Python 中的 SQL 工具包和 ORM

SQLAlchemy 是 Python 中一款非常流行的数据库工具包&#xff0c;它对底层的数据库操作提供了高层次的抽象。在本篇文章中&#xff0c;我们将介绍 SQLAlchemy 的两个主要组成部分&#xff1a;SQL 工具包 (SQL Toolkit) 和对象关系映射器 (Object-Relational Mapper, ORM) 的基本…

linux初学者小命令

linux初学者小命令 一.在正式学习linux命令之前需要先认识一下linux环境中命令是如何被执行的shell是一个属于linux内核的软件&#xff0c;在系统启动后加载进RAM(内存)内&#xff0c;每个用户通过终端登录系统后&#xff0c;就会运行。负责不间断的接收用户的输入&#xff0c…