构建现代大规模应用程序最具挑战性的方面之一是数据获取 。加载和错误状态、分页、过滤、排序、缓存等许多功能可能会增加复杂性,并经常使应用程序充满大量的样板代码 。
这就是 Vue Query 库的用途所在 。它使用声明式语法处理和简化数据获取,并在幕后为我们处理所有那些重复的任务 。
理解 Vue QueryVue Query 并不是 AxIOS 或 fetch 的替代品 。它是在它们之上的一个抽象层 。
管理服务器状态时面临的挑战与管理客户端状态不同,而且更为复杂 。我们需要解决的问题包括:
- 缓存...(可能是编程中最难的事情)
- 将对相同数据的多个请求进行去重,合并为一个请求
- 在后台更新过时的数据
- 了解何时数据过时
- 尽快反映数据的更新情况
- 像分页和懒加载这样的性能优化
- 管理服务器状态的内存和垃圾回收
- 使用结构共享来记忆化查询结果
基本示例使用通过构建以下简单的应用程序来展示这个图书馆 。
![使用Vue Query进行高级数据获取](http://img.jiangsulong.com/230822/1J1214I6-0.png)
文章插图
在页面级别上,我们需要获取所有产品,将它们展示在一个表格中,并有一些简单的额外逻辑来选择其中的一个 。
<!-- 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(); // modal content omitted
添加 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;}