探索Nuxt.js的useFetch:高效数据获取与处理指南
title: 探索Nuxt.js的useFetch:高效数据获取与处理指南
date: 2024/7/15
updated: 2024/7/15
author: cmdragon
excerpt:
摘要:“探索Nuxt.js的useFetch:高效数据获取与处理指南”详述了Nuxt.js中useFetch函数的使用,包括基本用法、动态参数获取、拦截器使用,及参数详解。文章通过示例展示了如何从API获取数据,处理动态参数,自定义请求和响应,以及useFetch和useAsyncData的参数选项,帮助开发者掌握异步数据加载技巧。
categories:
- 前端开发
tags:
- Nuxt.js
- useFetch
- API
- 数据
- 异步
- Vue.js
- SSR

扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
在构建现代Web应用时,数据获取是关键的一环。Nuxt.js,作为Vue.js的服务器渲染框架,提供了一系列强大的工具来简化数据获取流程。其中,useFetch
可组合函数是用于从API端点获取数据的高级封装,旨在与Nuxt的服务器端渲染(SSR)兼容。这个可组合函数提供了一个方便的封装,包装了useAsyncData
和$fetch。它根据URL和fetch选项自动生成一个键,根据服务器路由提供请求URL的类型提示,并推断API响应类型。
useFetch的使用场景
useFetch主要用于在Nuxt应用中从API获取数据。它提供了一个方便的API,使得开发者能够以简洁的方式获取、处理和更新数据。这个函数可以用于任何需要从外部API获取数据的场景,如获取文章列表、用户信息、产品数据等。
示例:获取文章列表
假设我们有一个API端点https://api.example.com/articles,我们可以使用useFetch来获取文章列表:
<template>
  <div>
    <div v-if="pending">加载中...</div>
    <div v-else-if="error">{{ error }}</div>
    <div v-else>
      <ul>
        <li v-for="article in articles" :key="article.id">
          {{ article.title }}
        </li>
      </ul>
    </div>
  </div>
</template>
<script>
import { ref, onMounted } from 'vue';
import { useRoute } from 'vue-router';
export default {
  setup() {
    const route = useRoute();
    const { data, pending, error, refresh } = useFetch(`https://api.example.com/articles/${route.params.slug}`);
    onMounted(() => {
      // 刷新数据以确保获取最新的文章列表
      refresh();
    });
    return { data, pending, error, refresh };
  },
};
</script>
使用useFetch获取动态参数
假设API端点需要动态参数,如文章ID:
<script>
import { useRoute } from 'vue-router';
export default {
  setup() {
    const route = useRoute();
    const param1 = ref('value1');
    const { data, pending, error, refresh } = useFetch('https://api.example.com/articles', {
      query: { param1, param2: 'value2' }
    });
    return { data, pending, error, refresh };
  },
};
</script>
使用拦截器
拦截器允许开发者在请求和响应阶段进行自定义操作,如设置请求头、处理请求错误、存储令牌等:
<script>
export default {
  setup() {
    const { data, pending, error, refresh } = useFetch('/api/auth/login', {
      onRequest({ request, options }) {
        options.headers.authorization = 'Bearer ' + localStorage.getItem('token');
      },
      onResponse({ request, response, options }) {
        localStorage.setItem('token', response.data.token);
      }
    });
    return { data, pending, error, refresh };
  },
};
</script>
在Nuxt.js中,useFetch是一个强大的可组合函数,它允许你从不同的API端点异步获取数据。以下是对useFetch接收的参数的详细解释:
参数
1. URL
- 类型:string
- 描述:这是你想要从API获取数据的URL。它可以是绝对路径或相对路径。相对路径将相对于当前页面的URL解析。
2. Options
- 类型: - object
- 描述:这是一个对象,包含了从 - unjs/ofetch和- AsyncDataOptions扩展而来的各种选项。以下是一些常见的选项:- method:string- 请求方法,如'GET'、'POST'、'PUT'、'DELETE'等。
- query:object-
 一个对象,其键和值将被转换为查询字符串并附加到URL上。例如,{ param1: 'value1', param2: 'value2' }
 将生成?param1=value1¶m2=value2。
- params:object- 与query类似,也是用于添加查询参数的对象。params是query的别名。
- body:any- 请求体,可以是对象、数组或其他任何可以被转换为字符串的值。如果传递的是对象,它将被自动转换为JSON字符串。
- headers:object- 一个对象,包含了要发送的HTTP请求头。
- baseURL:string- 请求的基本URL,所有请求都将相对于这个URL发送。
 
- method:
示例代码
以下是一个使用useFetch的示例,展示了如何使用这些参数:
async function fetchData() {
  const { data, pending, error, refresh } = await useFetch('https://api.example.com/data', {
    method: 'GET',
    query: { userId: 123 },
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer your-token'
    },
    body: {
      key1: 'value1',
      key2: 'value2'
    },
    baseURL: 'https://api.example.com'
  });
  // 处理数据
  if (!pending && !error) {
    console.log(data);
  }
}
在这个例子中,我们向https://api.example.com/data发送了一个 GET 请求,其中包含查询参数userId
,请求头,以及一个请求体。baseURL被设置为'https://api.example.com',这意味着所有的请求都将相对于这个URL发送。
注意事项
- 如果同时提供了query和params,useFetch会将它们视为相同的选项。
- body中的对象将被自动转换为JSON字符串,除非显式设置- Content-Type请求头。
- baseURL是可选的,如果未提供,则使用- URL参数中的值。
useAsyncData 参数详解
useAsyncData是 Nuxt 3 提供的一个用于异步加载数据的可组合函数。以下是对useAsyncData接收的参数的详细解释:
1. key
- 类型:string或symbol
- 描述:一个唯一的键,用于确保数据获取可以在请求之间正确去重。如果未提供,useAsyncData将根据使用它的静态代码位置生成一个键。
2. server
- 类型:boolean
- 描述:是否在服务器上获取数据。默认值为true。如果设置为false,则数据只会在客户端获取。
3. lazy
- 类型:boolean
- 描述:是否在加载路由后解析异步函数,而不是阻止客户端导航。默认值为false。如果设置为true,则异步数据获取将不会阻塞路由导航。
4. immediate
- 类型:boolean
- 描述:如果设置为false,将阻止立即发出请求。默认值为true,意味着异步函数会在组件初始化时立即执行。
5. default
- 类型:() => any(工厂函数)
- 描述:一个工厂函数,用于设置数据的默认值,在异步函数解析之前使用。通常与lazy: true或immediate: false选项一起使用。
6. transform
- 类型:(data) => any
- 描述:在解析后可以用于更改处理函数结果的函数。这个函数接收原始数据作为参数,并返回转换后的数据。
7. pick
- 类型:string[]
- 描述:仅从处理函数结果中选择指定的键。这允许你从响应中提取特定的数据片段。
8. watch
- 类型:boolean | Array
- 描述:监听一组响应式源,并在它们发生变化时自动刷新获取的结果。默认情况下,会监听fetch选项和URL
 。通过设置watch: false,可以完全忽略响应式源。结合immediate: false,可以实现完全手动的数据获取。
9. deep
- 类型:boolean
- 描述:以深层 ref 对象的形式返回数据。默认值为true。如果设置为false,则数据将在浅层 ref 对象中返回,这可以在不需要深层响应式数据时提高性能。
示例代码
返回值
1. data
2. pending
3. refresh/execute
4. error
5. status
默认行为
示例代码
余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完整的文章:探索Nuxt.js的useFetch:高效数据获取与处理指南 | cmdragon's Blog
往期文章归档:
- Nuxt.js 错误侦探:useError 组合函数 | cmdragon's Blog
- useCookie函数:管理SSR环境下的Cookie | cmdragon's Blog
- 轻松掌握useAsyncData获取异步数据 | cmdragon's Blog
- 使用 useAppConfig:轻松管理应用配置 | cmdragon's Blog
- Nuxt框架中内置组件详解及使用指南(五) | cmdragon's Blog
- Nuxt框架中内置组件详解及使用指南(四) | cmdragon's Blog
- Nuxt框架中内置组件详解及使用指南(三) | cmdragon's Blog
- Nuxt框架中内置组件详解及使用指南(二) | cmdragon's Blog
- Nuxt框架中内置组件详解及使用指南(一) | cmdragon's Blog
- Nuxt3 的生命周期和钩子函数(十一) | cmdragon's Blog
- Nuxt3 的生命周期和钩子函数(十) | cmdragon's Blog
- Nuxt3 的生命周期和钩子函数(九) | cmdragon's Blog
- Nuxt3 的生命周期和钩子函数(八) | cmdragon's Blog
- Nuxt3 的生命周期和钩子函数(七) | cmdragon's Blog
探索Nuxt.js的useFetch:高效数据获取与处理指南的更多相关文章
- 今天聊一聊nuxt.js(上)
		背景 近期在做内部系统的重构,从一线业务彻底的重构,经过充分的考虑我们准备把这个项目打造成前台业务的试验站,比如ssr和一些其他的前沿技术的探索,积累充分的经验后待合适的契机应用到C端的项目中. 既然 ... 
- Nuxt.js开启SSR渲染快速入门
		第一节:nuxt.js相关概述 nuxt.js简单的说是Vue.js的通用框架,最常用的就是用来作SSR(服务器端渲染).Vue.js是开发SPA(单页应用)的,Nuxt.js这个框架,用Vue开发多 ... 
- 解析Nuxt.js Vue服务端渲染摸索
		本篇文章主要介绍了详解Nuxt.js Vue服务端渲染摸索,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. Nuxt.js 十分简单易用.一个简单 ... 
- Nuxt.js logoVue.js 后端渲染开源库 Nuxt.js
		Nuxt.js 是一个通过 Vue 用于服务端渲染的简单框架,灵感来自 Next.js. 目前尚处于开发阶段,1.0 版本即将发布 1 分钟视频演示 Nuxt 基于 ES2015,这使得代码有着更愉快 ... 
- Vue 爬坑之路(十一)—— 基于 Nuxt.js 实现服务端渲染(SSR)
		直接使用 Vue 构建前端单页面应用,页面源码时只有简单的几行 html,这并不利于网站的 SEO,这时候就需要服务端渲染 2016 年 10 月 25 日,zeit.co 背后的团队对外发布了一个 ... 
- 从壹开始 [ Nuxt.js ] 之二 || 项目搭建 与 接口API
		前言 哈喽大家周一好,今天的内容比较多,主要就是包括:把前端页面的展示页给搭出来,然后调通接口API,可以添加数据,这两天我也一直在开发,本来想一篇一篇的写,发现可能会比较简单,就索性把项目搭建的过程 ... 
- 从壹开始 [ Nuxt.js ] 之一 || 为开源收录Bug之 TiBug项目 开篇讲
		缘起 哈喽大家周二好呀,刚刚经历过了几天火车抢票,整个人都不好了,不知道小伙伴对今年的春节是否还一如既往的期待呢,眼看都要春节了,本来也想写篇2018总结篇,但是怕不免会出现鸡汤文的窠臼嫌疑,想想还是 ... 
- 从壹开始前后端分离 [ vue + .netcore 补充教程 ] 二八║ Nuxt 基础:面向源码研究Nuxt.js
		前言 哈喽大家周五好,又是一个开开心心的周五了,接下来就是三天小团圆啦,这里先祝大家节日快乐咯,希望都没有加班哈哈,今天公司发了月饼,嗯~时间来不及了,上周应该搞个活动抽中几个粉丝发月饼的,下次吧,这 ... 
- Nuxt.js笔记
		前置知识 SSR服务器渲染 Vue SSR(server side rendering)服务端渲染 和 Vue SPA(single page application)单页应用 Vue SSR-> ... 
- Nuxt.js国际化vue-i18n的搭配使用
		Nuxt.js国际化的前提是,已经使用脚手架工具搭建好了Nuxt.js的开发环境. 我使用的环境是nuxt@2.3 + vuetify@1.4 + vue-i18n@7.3 1. 先安装vue-i18 ... 
随机推荐
- 统计学习:EM算法及其在高斯混合模型(GMM)中的应用
			1. EM算法的基本思想 我们在应用中所面对的数据有时是缺损的/观测不完全的[1][2].我们将数据分为: 可观测数据,用\(Y\)表示: 缺失数据,用\(Z\)表示; 完全数据,用\(X=(Y, Z ... 
- Python 多线程、线程池、协程 爬虫
			多线程生产者消费者模型爬虫 import queue import requests from bs4 import BeautifulSoup import threading import tim ... 
- 一文详解编辑距离(Levenshtein Distance)
			更多博文请关注:https://blog.bigcoder.cn 一. 什么是Levenshtein Distance Levenshtein Distance,一般称为编辑距离(Edit Dista ... 
- Django——前后端分离出现同源策略的解决方式
			浏览器控制台报错:"Access-Control-Allow-Origin" 解决方式:在Django服务端解决 1.安装django-cors-headers(可能需要先更新pi ... 
- 2024盘古石取证比赛(APK)
			题目列表 使用软件: Notepad++,火眼证据分析软件,雷电分析app,DB browser for SQLCipher 1. 分析伏季雅的手机检材,手机中诈骗APP的包名是:[答案格式:abc. ... 
- Android 12(S) MultiMedia Learning(七)NuPlayer GenericSource
			本节来看一下NuPlayer Source中的GenericSource,GenericSource主要是用来播放本地视频的,接下来着重来看以下5个方法: prepare,start,pause,se ... 
- NOIP模拟91(多校24)
			T1 破门而入 解题思路 签到题(然而我数组开小直接变成暴力分...) 发现其实就是第一类斯特林数,然后 \(n^2\) 推就好了. 感觉可以用 NTT 优化成 \(nlogn\) ,但是好像并没有什 ... 
- C++笔记(12) 标准模板库STL
			STL提供了一组表示容器.迭代器.函数.函数对象和算法的模板.STL不是面向对象的编程,而是一种不同的编程模式--泛型编程. 容器:与数组类似的单元,可以存储若干个值,存储的值的类型相同: 算法:完成 ... 
- 关于 Linux 中模拟鼠标
			问题的背景是我想用自动化脚本来玩 Stardew Valley 的小游戏,刷钱,但是遇到了一系列问题,这里记录我的一些历程. pyautogui/pydirectinput pyautogui 是我第 ... 
- xv6 文件系统
			文件系统 公众号:Rand_cs 本文继续来看 x v 6 xv6 xv6 的文件系统部分, x v 6 xv6 xv6 将文件系统的设计分为 7 层: 磁 盘 → 缓 存 区 → 日 志 → i n ... 
