使用Vue Query进行高级数据获取

构建现代大规模应用程序最具挑战性的方面之一是数据获取 。加载和错误状态、分页、过滤、排序、缓存等许多功能可能会增加复杂性,并经常使应用程序充满大量的样板代码 。
这就是 Vue Query 库的用途所在 。它使用声明式语法处理和简化数据获取,并在幕后为我们处理所有那些重复的任务 。
理解 Vue QueryVue Query 并不是 AxIOS 或 fetch 的替代品 。它是在它们之上的一个抽象层 。
管理服务器状态时面临的挑战与管理客户端状态不同,而且更为复杂 。我们需要解决的问题包括:

  • 缓存...(可能是编程中最难的事情)
  • 将对相同数据的多个请求进行去重,合并为一个请求
  • 在后台更新过时的数据
  • 了解何时数据过时
  • 尽快反映数据的更新情况
  • 像分页和懒加载这样的性能优化
  • 管理服务器状态的内存和垃圾回收
  • 使用结构共享来记忆化查询结果
Vue Query真棒,因为它为我们隐藏了所有这些复杂性 。它默认基于最佳实践进行配置,但也提供了一种方法来更改这个配置(如果需要的话) 。
基本示例使用通过构建以下简单的应用程序来展示这个图书馆 。
使用Vue Query进行高级数据获取

文章插图
 
在页面级别上,我们需要获取所有产品,将它们展示在一个表格中,并有一些简单的额外逻辑来选择其中的一个 。
<!-- Page component without Vue-Query --><script setup>import { ref } from "vue";import BoringTable from "@/components/BoringTable.vue";import ProductModal from "@/components/ProductModal.vue";const data = https://www.isolves.com/it/cxkf/qd/2023-08-22/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;}在选择产品的情况下,我们会显示一个模态框,并在显示加载状态时获取额外的产品信息 。
<!-- Modal component without 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 = https://www.isolves.com/it/cxkf/qd/2023-08-22/true;const response = await fetch(`https://dummyjson.com/products/${props.productId}`).then((res) => res.json());product.value = response;loading.value = false;}fetchProduct();添加 Vue Query这个库预设了一些既激进又理智的默认设置 。这意味着我们在基本使用时不需要做太多操作 。
<script setup>import { useQuery } from "vue-query";function fetchData() {// Make api call here}const { isLoading, data } = useQuery("uniqueKey",fetchData);</script><template>{{ isLoading }}{{ data }}</template>在上述例子中:
  • uniqueKey 是用于缓存的唯一标识符
  • fetchData 是一个函数,它返回一个带有API调用的 promise
  • isLoading 表示API调用是否已经完成
  • data 是对API调用的响应
我们将其融入到我们的例子中:
<!-- Page component with 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 = https://www.isolves.com/it/cxkf/qd/2023-08-22/item;}