位置: IT常识 - 正文

Nuxt3实战系列之网络请求篇(nuxt怎么用)

编辑:rootadmin
Nuxt3实战系列之网络请求篇

推荐整理分享Nuxt3实战系列之网络请求篇(nuxt怎么用),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:nuxt怎么用,nuxt支持vue3吗,nuxt 教程,nuxt怎么用,nuxt怎么样,nuxt怎么样,nuxt好用吗,nuxt好用吗,内容如对您有帮助,希望把文章链接给更多的朋友!

Nuxt3提供了4种方式使得我们可以异步获取数据

useAsyncDatauseLazyAsyncData (useAsyncData+lazy:true)useFetchuseLazyFetch (useFetch+lazy:true)

4种方式中,其实核心的就是useAsyncData和useFetch。这两个方法不同于Nuxt2中的asyncData和fetch。接下来我们先来好好分析下这两个方法。

useAsyncData

我们知道,在Nuxt2中,asyncData方法类似于一个生命周期函数,它在服务端或路由更新之前被调用。方法的参数是当前页面的上下文对象,我们一般是利用 asyncData方法来获取数据并返回给当前组件,以避免请求放在客户端执行时带来的数据延迟出现问题。

export default {data() {return { project: 'default' }},asyncData(context) {return { project: 'nuxt' }}}

在Nuxt3中,useAsyncData可以看做是异步获取数据场景的一个封装,而且变成了一个主动调用函数,原则上可以在任何时机调用。

// 用法const {data: Ref<DataT>,// 返回的数据结果pending: Ref<boolean>,// 是否在请求状态中refresh: (force?: boolean) => Promise<void>,// 强制刷新数据error?: any // 请求失败返回的错误信息} = useAsyncData(key: string, // 唯一键,确保相同的请求数据的获取和去重fn: () => Object,// 一个返回数值的异步函数options?: { lazy: boolean, server: boolean }// options.lazy,是否在加载路由后才请求该异步方法,默认为false// options.server,是否在服务端请求数据,默认为true// options.default,异步请求前设置数据data默认值的工厂函数(对lazy:true选项特别有用)// options.transform,更改fn返回结果的函数// options.pick,只从数组中指定的key进行缓存)

从api的设计中可以看出,useAsyncData没有限制我们发起网络请求的方式,同时它还暴露了请求状态,增加了刷新控制,以及对重复获取数据的去重控制等。使用示例如下:

<script setup>const { data } = await useAsyncData('count', () => $fetch('/api/count'))</script><template>Page visits: {{ data }}</template> useFetch

在Nuxt2中,fetch 方法用于在渲染页面前填充应用的状态树(store)数据, 与 asyncData 方法类似,不同的是它不会设置组件的数据。

<template><h1>Stars: {{ $store.state.stars }}</h1></template><script> export default {fetch({ store, params }) {return axios.get('http://my-api/stars').then(res => {store.commit('setStars', res.data)})}} </script>

在Nuxt3中,useFetch实际上是对useAsyncData和$fetch的封装,提供了一个更便捷的封装方法。它相比useAsyncData, 主要做了以下两点处理:

1.它会根据URL和fetch参数自动生成一个key,同时推断出API的响应类型。也就是说不用手动指定key了。 2.它实现了网络请求的具体方式,使用$fetch发起请求,也就是说不需要再手动去实现网络请求的逻辑了。

//useFetch用法const {data: Ref<DataT>,pending: Ref<boolean>,refresh: (force?: boolean) => Promise<void>,error?: any} = useFetch(url: string, options?)// options (继承自 unjs/ofetch options以及 AsyncDataOptions)// 下边的这些参数是useAsyncData的options中没有的// options.method: 请求方式// options.query: url路径参数// options.params: query参数的别名// options.body: 请求体参数,// options.headers: 请求头的配置// options.baseURL: 请求的基础Url地址 实战应用Nuxt3实战系列之网络请求篇(nuxt怎么用)

我们不难发现,useFetch已经具备了网络请求的所有核心功能,虽然该Api主要用于在服务端请求,但它也是做了客户端请求的支持的,只要稍加封装改动,就可以同时用于服务端请求和客户端请求的场景。这样我们也就不用额外再引入像Axios这样的请求库了。

场景1: 如何处理对于带错误码的数据响应

通常我们的接口都不是直接返回数据,而是带了一个错误码和错误信息的对象,比如这样:

// response:{data: {age: 1},code: 1}

在这样的返回结构下,useFetch拿到的数据并不是我们真实想要的数据

const { data } = await useFetch('/api/user/info', {method: 'get'})console.log(data) // 此时data是一个Ref包裹的对象{ data: {age: 1}, code: 1 }const userInfo = unref(data).data //获取真正的数据需要先unref后再去获取data

所以,我们希望能在接口返回时对数据做一下转换,这里其实useFetch提供了相关的option参数,我们可以这样修改

const { data: userInfo} = await useFetch('/api/user/info', {method: 'get',// 处理方式1onResponse({ response }) {response._data = {...response._data.data,}},// 处理方式2// transform: (res) => {// return res.data// },}) 场景2: 如何只在客户端侧发起请求

这样的场景一般用于使用静态化构建部署,但是页面上有些内容是不能在构建时静态化的。这时可以利用server:false参数

// 异步获取当前用户信息const { data: userinfo } = await useMyFetch('/api/auth/userinfo', {server: false})

注意: 这种情况下,如果想在script内直接获取到userinfo的内部值,是获取不到的!官方文档也做了对应的说明:

if you have not fetched data on the server (for example, with server: false), then the data will not be fetched until hydration completes. This means even if you await useFetch on client-side, data will remain null within <script setup>.

如果非要在script中获取数据呢?这里笔者想到两个方案:

1.用$fetch去发起请求 2.用watch监听userinfo的值变化

场景3: 如何将请求结果转为非响应式的数据

这种场景一般用于在客户端发起的请求,我们不需要在页面上渲染响应的数据,只是为了做一些逻辑判断或者需要对数据进行加工。而useFetch请求后的返回值默认都是一个ref对象,我们得先获取内部值。

const { data } = await useMyFetch('/api/get-actiocn-token')// data是一个Ref包裹的对象,需要用unref获取内部值const tokenInfo = unref(data)

如果想直接获取原始数据的话,useFetch原生是不支持的(或者是我现在还不知道怎么实现)。我们只能使用$fetch去实现了。

请求统一封装

针对上述三种场景,笔者分享下自己的封装思路,即在composables目录中实现一个useMyFetch方法,去处理一些通用的逻辑

import type { NitroFetchRequest } from 'nitropack'import type { FetchOptions, FetchResponse } from 'ofetch'import type { UseFetchOptions } from 'nuxt/dist/app/composables/fetch'function transFormResponse({ response }: any) {// 处理后端携带了错误码响应的数据if (response._data && response._data.code)return Promise.reject(response._data)response._data = {...response._data.data,}}/** * 封装$fetch用于简单请求场景 * @param request * @param opts * @returns */export function useClientFetch(request: NitroFetchRequest, opts?: FetchOptions<any>) {return $fetch<FetchResponse<any>>(request, {onResponse: transFormResponse,...opts,})}/** * 抽离useFetch的通用配置 * @param request * @param opts * @returns */export function useMyFetch(request: NitroFetchRequest, opts?: UseFetchOptions<any>) {return useFetch(request, {onResponse: transFormResponse,...opts,})}/** * 实现更便捷的post请求 * @param request * @param opts * @returns */useMyFetch.get = (request: NitroFetchRequest, opts?: UseFetchOptions<any>) => {return useMyFetch(request, {method: 'get',...opts,})}/** * 实现更便捷的post请求 * @param request * @param opts * @returns */useMyFetch.post = (request: NitroFetchRequest, opts?: UseFetchOptions<any>) => {return useMyFetch(request, {method: 'post',...opts,})} 最后

为大家准备了一个前端资料包。包含54本,2.57G的前端相关电子书,《前端面试宝典(附答案和解析)》,难点、重点知识视频教程(全套)。 有需要的小伙伴,可以点击下方卡片领取,无偿分享

本文链接地址:https://www.jiuchutong.com/zhishi/283590.html 转载请保留说明!

上一篇:舍夫沙万的蓝色墙壁,摩洛哥 (© Tatsuya Ohinata/Getty Images)(舍夫沙万的蓝色是什么意思)

下一篇:奇陶尔加尔堡,印度 (© Anand Purohit/Getty Images)(奇托尔加赫城堡)

  • 抖音能看历史浏览记录吗(抖音能看历史浏览的人吗)

    抖音能看历史浏览记录吗(抖音能看历史浏览的人吗)

  • 魅族 18 Pro使用的是什么马达(魅族18 pro功能)

    魅族 18 Pro使用的是什么马达(魅族18 pro功能)

  • 华为nova5是否支持otg(华为nova5是否支持HDMI)

    华为nova5是否支持otg(华为nova5是否支持HDMI)

  • iphone8实况壁纸不动(苹果8实况照片怎么弄动态壁纸)

    iphone8实况壁纸不动(苹果8实况照片怎么弄动态壁纸)

  • 微信怎么小窗口聊天(玩游戏的时候微信怎么小窗口)

    微信怎么小窗口聊天(玩游戏的时候微信怎么小窗口)

  • 苹果手机死机重启(苹果手机死机重启方法视频)

    苹果手机死机重启(苹果手机死机重启方法视频)

  • 华为电脑死机了怎么办(华为电脑死机了按哪个键恢复)

    华为电脑死机了怎么办(华为电脑死机了按哪个键恢复)

  • 更换实名认证微信会注销么(更换实名认证微信怎么办)

    更换实名认证微信会注销么(更换实名认证微信怎么办)

  • 火山商品售卖怎么开通(火山商品售卖怎么样)

    火山商品售卖怎么开通(火山商品售卖怎么样)

  • 陌陌账号注销了还能找回来吗(陌陌账号注销了别人还可以查到我原先的陌陌号吗)

    陌陌账号注销了还能找回来吗(陌陌账号注销了别人还可以查到我原先的陌陌号吗)

  • vivo手机红外线在哪(vivo手机红外线遥控器怎么用)

    vivo手机红外线在哪(vivo手机红外线遥控器怎么用)

  • 华为mate30能无线充电吗(华为mate30有无线充电功能吗)

    华为mate30能无线充电吗(华为mate30有无线充电功能吗)

  • 手机wifi连不上是什么原因(手机wifi连不上ip配置失败)

    手机wifi连不上是什么原因(手机wifi连不上ip配置失败)

  • 小程序音频怎么下载(小程序音频怎么导出来手机)

    小程序音频怎么下载(小程序音频怎么导出来手机)

  • 苹果xs与苹果11的区别(苹果XS与苹果11pro参数对比)

    苹果xs与苹果11的区别(苹果XS与苹果11pro参数对比)

  • 怎么才能让自己打字快(怎么才能让自己开心起来不压抑)

    怎么才能让自己打字快(怎么才能让自己开心起来不压抑)

  • 华为钱包门禁卡用不了(华为钱包门禁卡模拟成功但是打不开)

    华为钱包门禁卡用不了(华为钱包门禁卡模拟成功但是打不开)

  • 抖音拍摄页面是哪里(抖音拍摄页面是什么样的)

    抖音拍摄页面是哪里(抖音拍摄页面是什么样的)

  • oppo手机用户体验计划有什么用(OPPO手机用户体验计划关闭有什么影响)

    oppo手机用户体验计划有什么用(OPPO手机用户体验计划关闭有什么影响)

  • 华为nova5录音机在哪里(华为荣耀手机录音机在哪)

    华为nova5录音机在哪里(华为荣耀手机录音机在哪)

  • 酷我音乐如何消除原音(酷我音乐怎么取消续费功能)

    酷我音乐如何消除原音(酷我音乐怎么取消续费功能)

  • 360安全卫士中360leakfixer.exe是什么进程(使用360安全卫士)

    360安全卫士中360leakfixer.exe是什么进程(使用360安全卫士)

  • 阿查法拉亚盆地的秃柏和西班牙苔藓,路易斯安那州 (© Chris Moore/Exploring Light Photography/Tandem Stills + Motion)(阿查法拉亚盆地牡蛎)

    阿查法拉亚盆地的秃柏和西班牙苔藓,路易斯安那州 (© Chris Moore/Exploring Light Photography/Tandem Stills + Motion)(阿查法拉亚盆地牡蛎)

  • 有关研发支出的账务怎么做?
  • 一般纳税人结转增值税
  • 开一般户需要提交人行吗
  • 企业不加入工会可以吗
  • 财务软件续费怎么记账
  • 通用机打发票还能用吗
  • 不得抵扣的进项税额转出会计分录
  • 国际货物运输07113
  • 关联方债务豁免需要缴纳所得税吗
  • 增值税加计递减额,这个科目如何使用
  • 公司用股东的钱交税吗
  • 出口货物补税申报表
  • 如何设置采购入库的对方科目暂估科目
  • 控股股权转让
  • 分期收款销售会计分录(现销)
  • 现金支票存根联需要盖章吗?
  • 差旅补贴需要缴纳个税吗
  • 微信交电费怎么退款
  • 网上勾选认证每月时间要求
  • 广告公司怎样
  • 个税零申报工资填0吗
  • 母公司向子公司收取管理费
  • 营业执照办下来多久能在网上查到
  • 捐赠货品怎么做会计分录
  • 增值税专票可以重开吗
  • 公司租赁汽车
  • 员工离职一次性结清工资
  • win10如何查看显卡版本
  • linux查看文件的权限
  • php做
  • 经营性流动负债计算公式
  • 开办费的账务处理实例
  • 长期病假解除劳动合同怎么赔偿
  • Create OpenAI Account的教程来啦,赶紧学习吧!
  • 免征个人所得税33种情形
  • php读取文件内容的方法和函数
  • 账面价值账面余额摊余成本
  • 保险费支出是什么意思
  • 织梦tag标签怎么用
  • 以前年度的成本忘了结转然后怎么办
  • 累计折旧如何计算使用年限
  • 我向银行借钱我是贷方还是借方
  • 增值税一般纳税人登记管理办法
  • mysqlreport显示Com_中change_db占用比例高的问题的解决方法
  • 退个税需要提供哪些资料
  • Centos5.5中安装Mysql5.5过程分享
  • 接受现金捐赠怎么做会计分录
  • 银行存款会计分录需要输入哪些内容
  • 一般纳税人的服务费税率是多少
  • 销售收入确认后怎么处理
  • 公交卡充值发票怎么开
  • 技术咨询服务开票代码
  • 专业收账公司合法吗
  • sql server数据库版本
  • sqlserver数据库版本号怎么查
  • u盘装系统软件哪个好
  • Win10 Build 10565快速预览版为什么有ISO镜像下载地址?
  • win10预览体验三个选项
  • 新手菜鸟什么意思
  • linux环境和常用命令
  • windows资源管理器停止工作怎么办
  • 用户账户限制
  • win7系统电脑开机后直接进入系统修复怎么办
  • win10新版磁贴
  • ubuntu sudo apt-get install
  • 字符有大小吗
  • nodejs跳转到指定页面
  • 用批处理删除注册表项
  • vue中使用js
  • Unity3D游戏开发(第2版)
  • bootstrap 树形菜单
  • 对于python程序,对代码缩进的要求非常严格
  • jquery通配符选择器
  • 综治维稳中心是干啥的啊
  • 河南工商年检网上申报
  • 员工离职了个人所得税年度汇算应申报未申报怎么处理
  • 无偿转让股权要交税吗
  • 一次性收入多少要交个人所得税
  • 上海市浦东新区人民医院
  • 请问报考国家税务局难吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设