Nuxt3封裝網絡請求 useFetch $fetch

前言:

剛接觸、搭建Nuxt3項目的過程還是有點懵的,有種摸石頭過河的感覺,對于網絡請求這塊,與之前的Vue3項目有所區別,在Vue項目通常使用axios這個庫進行網絡請求,但在Nuxt項目并不推薦,因為有內置 fetch 相關...接下來一起學習一下Nuxt3數據請求的點點滴滴吧~

文檔:

數據獲取 · 快速入門 Nuxt

關鍵:

  • useFetch?是在組件設置函數中處理數據獲取的最簡單方法。
  • $fetch?可以根據用戶交互進行網絡請求。
  • useAsyncData?結合?$fetch,提供了更精細的控制。

講解:

useAsyncData:
  • 提供了一種在SSR友好的組合式中訪問異步解析數據的方式
  • 注意,setup期間,這里結合了$fetch,并且設置了一個key,一個唯一的鍵,用于確保數據獲取可以在請求中正確去重
  • <script setup>
    const { data, pending, error, refresh } = await useAsyncData('mountains',() => $fetch('https://api.nuxtjs.dev/mountains')
    )
    </script>
  • 當 CMS 或第三方提供自己的查詢層時。在這種情況下,您可以使用?useAsyncData?來封裝您的調用,并仍然保持組合函數提供的好處。?
$fetch:
  • Nuxt使用?ofetch?來全局暴露`$fetch`輔助函數,用于在Vue應用程序或API路由中進行HTTP請求?
  • 源碼:nuxt/packages/nuxt/src/app/entry.ts at main · nuxt/nuxt · GitHub
  • $fetch是在Nuxt中進行HTTP調用的首選方式,而不是為Nuxt 2設計的@nuxt/http和@nuxtjs/axios。
  • 比如,你的頁面有給用戶提供交互的(按鈕),那么就可以使用 $fetch ,不然控制臺會有警告,網上就有不少人是在交互的時候使用useFetch而出現問題,看下面這篇文章
  • 警告:[nuxt] [useFetch] Component is already mounted, please use $fetch instead. See https://nuxt.com/docs/getting-started/data-fetching
  • Nuxt 3:正確的方法 --- useFetch in Nuxt 3: The Proper Way (alex.party)
  • 請觀察以下調用接口的時機:setup | click
  • <script setup lang="ts">
    // 在SSR中數據將被獲取兩次,一次在服務器端,一次在客戶端。
    const dataTwice = await $fetch('/api/item')// 在SSR中,數據僅在服務器端獲取并傳遞到客戶端。
    const { data } = await useAsyncData('item', () => $fetch('/api/item'))// 你也可以使用useFetch作為useAsyncData + $fetch的快捷方式
    const { data } = await useFetch('/api/item')
    </script>
    <script setup lang="ts">
    function contactForm() {$fetch('/api/contact', {method: 'POST',body: { hello: 'world '}})
    }
    </script><template><button @click="contactForm">聯系我們</button>
    </template>
useFetch :
  • 使用一個與SSR兼容的可組合函數從API端點獲取數據。
  • 包裝了useAsyncData和$fetch,它返回響應式的可組合函數,并處理將響應添加到Nuxt的負載中,以便在頁面水合時可以從服務器傳遞給客戶端,而無需在客戶端重新獲取數據。
  • (水合的概念在文檔的渲染模式有講解:渲染模式 · 關鍵概念 (nuxt.com.cn))
  • 提供了攔截器
  • const { data, pending, error, refresh } = await useFetch('/api/auth/login', {onRequest({ request, options }) {// 設置請求頭options.headers = options.headers || {}options.headers.authorization = '...'},onRequestError({ request, options, error }) {// 處理請求錯誤},onResponse({ request, response, options }) {// 處理響應數據localStorage.setItem('token', response._data.token)},onResponseError({ request, response, options }) {// 處理響應錯誤}
    })
    
  • 事實上,useFetch(url)?幾乎等同于?useAsyncData(url, () => $fetch(url))?- 它是為最常見的用例提供的開發者體驗糖。?

封裝:工廠函數設計請求代碼結構

env:
  • 在nuxt.config.ts配置 runtimeConfig,通過useRuntimeConfig()解構,示例:
export default defineNuxtConfig({runtimeConfig: {public: {API_BASE_DEV: 'http://localhost:4000',API_BASE_PROD: 'https://api.example.com/v1'}},
})
  • 當然你還可以

?composables:
  • 封裝$fetch
  • -?composables/useDollarFetchRequest.ts
import { $fetch } from 'ofetch';
import { useRuntimeConfig } from '#app';interface RequestOptions {customBaseURL?: string;[key: string]: any;
}type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';// 請求攔截器
function handleRequest(options: RequestOptions) {options.headers = {...options.headers,'Content-Type': 'application/json',};
}// 響應攔截器
function handleResponse(response: any) {if (response.error) {throw new Error(response.error.message || '響應錯誤');}return response;
}/*** 創建請求方法* @param method*/
function createDollarFetchRequest(method: HttpMethod) {return async function (url: string,data?: any,options: RequestOptions = {}) {const {public: {API_BASE_DEV,API_BASE_PROD}} = useRuntimeConfig();const baseURL = process.env.NODE_ENV === 'production'? API_BASE_PROD: API_BASE_DEV;const requestUrl = new URL(url,options.customBaseURL || baseURL).toString();try {handleRequest(options);const response = await $fetch(requestUrl, {method,body: data,...options,});return handleResponse(response);} catch (error) {console.error('請求錯誤:', error);throw error;}};
}// 提供 $fetch & HTTP 方法 - 統一管理請求 - 再到組件中使用
export const useDollarGet = createDollarFetchRequest('GET');
export const useDollarPost = createDollarFetchRequest('POST');
export const useDollarPut = createDollarFetchRequest('PUT');
export const useDollarDelete = createDollarFetchRequest('DELETE');
  • 封裝useFetch
  • - composables/useFetchRequest.ts
import { useFetch, useRuntimeConfig } from '#app';
import type { UseFetchOptions } from 'nuxt/app';interface RequestOptions extends UseFetchOptions<any> {customBaseURL?: string;
}type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';
type HandleRequestOptions = { request: Request; options: RequestOptions };
type HandleResponseOptions = { response: any };// 請求攔截器
function handleRequest({ options }: HandleRequestOptions) {options.headers = {...options.headers,'Content-Type': 'application/json',};
}// 響應攔截器
function handleResponse({ response }: HandleResponseOptions) {if (response._data.error) {throw new Error(response._data.error.message || '響應錯誤');}return response._data;
}/*** 創建請求方法* @param method*/
function createUseFetchRequest(method: HttpMethod) {return async function (url: string,data?: any,options: RequestOptions = {}) {const {public: {API_BASE_DEV,API_BASE_PROD}} = useRuntimeConfig();const baseURL = process.env.NODE_ENV === 'production'? API_BASE_PROD: API_BASE_DEV;const requestUrl = new URL(url,options.customBaseURL || baseURL).toString();return await useFetch(requestUrl, {...options,method,body: data,onRequest: handleRequest,onResponse: handleResponse});};
}// 提供 useFetch & HTTP 方法 - 統一管理請求 - 再到組件中使用
export const useFetchGet = createUseFetchRequest('GET');
export const useFetchPost = createUseFetchRequest('POST');
export const useFetchPut = createUseFetchRequest('PUT');
export const useFetchDelete = createUseFetchRequest('DELETE');
統一管理 API?
  • 調用 $fetch 示例:
import { useDollarGet } from '~/composables/useDollarFetchRequest';export const getDocsApi = () => useDollarGet('/docs/list');
<template><div><button @click="handleGetUserInfo">獲取用戶信息</button></div><HomeCover /><HomeIntro /><HomeCadre /><HomeJoinUs /><BackToTop />
</template><script setup lang="ts">
import HomeCover from './HomeCover.vue';
import HomeIntro from './HomeIntro.vue';
import HomeCadre from './HomeCadre.vue';
import HomeJoinUs from './HomeJoinUs.vue';
import { getDocsApi } from '../../api/home/joinUs';const handleGetUserInfo = async () => {try {const data = await getDocsApi();console.log('文檔列表:', data);} catch (error) {console.error('獲取文檔列表出錯:', error);}
};
</script>
  • 調用 useFetch 示例
<script setup lang="ts">
import { getDocsApi } from '../../api/home/joinUs';try {const response = await getDocsApi();console.log('文檔列表:', response.data.value);
} catch (error) {console.error('獲取文檔列表出錯:', error);
}</script>
結果:

?


?歡迎三連,以及在評論區討論,如果有不對的還請告知糾正?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/45169.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/45169.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/45169.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RK3568平臺(顯示篇)主屏副屏配置

一.主屏副屏配置 目前在RK3568平臺上有兩路HDMIOUT輸出&#xff0c;分別輸出到兩個屏幕上&#xff0c;一路配置為主屏&#xff0c;一路配置為副屏。 硬件原理圖&#xff1a; &hdmi0_in_vp2 {status "okay"; };&hdmi1_in_vp0 {status "okay"; }…

【JAVA入門】Day15 - 接口

【JAVA入門】Day15 - 接口 文章目錄 【JAVA入門】Day15 - 接口一、接口是對“行為”的抽象二、接口的定義和使用三、接口中成員的特點四、接口和類之間的關系五、接口中新增的方法5.1 JDK8開始接口中新增的方法5.1.1 接口中的默認方法5.1.2 接口中的靜態方法 5.2 JDK9 開始接口…

Pandas實戰指南:any()函數深度解析與高效應用

Pandas實戰指南&#xff1a;any()函數深度解析與高效應用 引言 在數據分析和處理過程中&#xff0c;經常需要快速檢查數據集中是否存在滿足特定條件的元素。Pandas庫中的any()函數正是這樣一個強大的工具&#xff0c;它可以幫助我們沿著指定的軸檢查是否至少有一個元素滿足某…

Transformer重要論文與書籍 - Transformer教程

近年來&#xff0c;人工智能領域中的Transformer模型無疑成為了炙手可熱的研究對象。從自然語言處理&#xff08;NLP&#xff09;到計算機視覺&#xff0c;Transformer展現出了前所未有的強大能力。今天&#xff0c;我們將探討Tra在當今的人工智能和機器學習領域&#xff0c;Tr…

路由守衛中使用next()跳轉到指定路徑時會無限循環

路由守衛鉤子介紹 const router new VueRouter({ ... }) // 導航路由變化時觸發路由守衛鉤子 router.beforeEach((to, from, next) > {// ... }) to: Route: 即將要進入的目標路由對象(到哪去)from: Route: 當前導航正要離開的路由(從哪來)next: Function(必須&#xff0…

axios使用sm2加密數據后請求參數多了雙引號解決方法

axios使用sm2加密數據后請求參數多了雙引號解決 背景問題描述解決過程 背景 因項目安全要求&#xff0c;需對傳給后端的入參加密&#xff0c;將請求參數加密后再傳給后端 前期將axios降低到1.6.7后解決了問題&#xff0c;但最近axios有漏洞&#xff0c;安全要求對版本升級&…

從零開始[進階版]深入學習圖像分類:使用Python和TensorFlow

引言 圖像分類是計算機視覺中的一個核心任務&#xff0c;廣泛應用于人臉識別、自動駕駛、醫療影像分析等領域。在本篇文章中&#xff0c;我們將深入探討圖像分類的原理和實現&#xff0c;使用Python和TensorFlow搭建一個完整的圖像分類系統。本文不僅適合初學者&#xff0c;也…

【Qt 初識 Test】用圖形化和代碼的方式實現簡單的Qt程序

文章目錄 1. 通過圖形化的方式實現&#x1f34e;2. 通過代碼的方式實現 1. 通過圖形化的方式實現&#x1f34e; 在界面創建出一個控件&#xff0c;顯示 hello world&#xff0c;通過拖拽的方式實現&#xff1b; widget.ui文件如下&#xff1a;&#x1f50d; 生成的 ui_widget.…

生物環保技術有哪些缺點或者局限性呢

生物環保技術&#xff0c;作為一種利用生物學原理和技術來處理環境污染的方法&#xff0c;雖然具有綠色環保、高效節能等優點&#xff0c;但也存在一些缺點和局限性。以下是對這些缺點和局限性的詳細分析&#xff1a; 一、受環境因素影響大 生物環保技術的效果往往受到環境因…

數據結構第18節 散列表 - 應用

散列表&#xff08;Hash Table&#xff09;&#xff0c;也被稱為哈希表&#xff0c;是一種數據結構&#xff0c;它通過使用哈希函數將鍵映射到數組的某個位置來實現快速查找。散列表通常提供平均時間復雜度為O(1)的查找、插入和刪除操作&#xff0c;這使得它們在處理大量數據時…

【mybatis】mybatisX插件概述

一、主要功能 智能補全與提示 MyBatisX 可以智能地提示和補全 SQL 語句中的關鍵字、表名、列名等信息&#xff0c;從而顯著提高開發效率。代碼生成器 雖然 MyBatisX 本身可能不直接提供一個完整的、獨立的代碼生成器&#xff0c;但它可能集成了或支持與其他代碼生成工具&#…

鹵味江湖中,周黑鴨究竟該抓住什么賽點?

近年來&#xff0c;鹵味江湖的決斗從未停止。 隨著休閑鹵味、佐餐鹵味等細分賽道逐漸形成&#xff0c;“鹵味三巨頭”&#xff08;周黑鴨、絕味食品、煌上煌&#xff09;的牌桌上有了更多新對手&#xff0c;賽道變擠了&#xff0c;“周黑鴨們”也到了轉型關鍵期。 這個夏天&a…

MySQL字符串相關數據處理函數

目錄 1. 轉大小寫 2. 截取字符串 sunstr 3. 獲取字符長度 4. 字符串拼接 concat 5. 去掉空白 trim 1. 轉大小寫 轉大寫&#xff1a;upper() 轉小寫&#xff1a;lower() 雖然MySQL不嚴格區分大小寫&#xff0c;但是我們還是需要掌握這種大小寫的操作以方便學習其他…

python的入門知識(下)

目錄 學習內容數字字符串、列表和元組映射和集合類型 學習內容 數字 長整型&#xff08;Long Integer&#xff09;: 在Python中&#xff0c;整數沒有大小限制&#xff0c;但是可以用大寫或小寫的L來表示長整型&#xff0c;盡管這不是Python 3推薦的做法。 復數&#xff08;Co…

Nessus相關

tenable 1 安裝nessus scanner 1 )安裝nessus scanner: 方法一 curl -H X-Key: xxxxx https://cloud.tenable.com/install/scanner?namescanner-name&groupsscanner-group | bash方法二&#xff1a; **# for ubuntu, its https://www.tenable.com/downloads/api/v1/pu…

【JavaScript腳本宇宙】JavaScript 庫概覽:數字、貨幣值、日期時間處理一網打盡

簡化數據處理&#xff1a;掌握六大 JavaScript 庫的核心功能和使用技巧 前言 在現代的軟件開發中&#xff0c;處理數字、貨幣和日期時間是非常常見的需求。為了簡化這些任務&#xff0c;開發人員可以使用各種 JavaScript 庫來輕松地進行數字格式化、貨幣計算和日期時間操作。…

Google登錄時人機身份驗證的圖片類型和通過的經驗建議,以及一些常見問題

很多朋友在登錄谷歌賬號時&#xff0c;都遇到過要求人機身份驗證的步驟&#xff0c;而且有一些時候人機身份驗證這個步驟很讓人糾結&#xff0c;甚至壓根就出不來具體的驗證圖片&#xff0c;或者花了十幾分鐘、幾十分鐘都過不去。 所以今天GG賬號服務就來為您解析一下谷歌登錄…

初學SpringMVC之接收請求參數及數據回顯

pom.xml 文件導入 lombok 的依賴 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.34</version></dependency> Controller 表示這是一個控制器 RequestParam 表示從前端接收…

夏日智啟:我的Datawhale AI夏令營探索之旅

前言 最近幾年&#xff0c;AI&#xff08;人工智能&#xff09;的發展呈現出了前所未有的迅猛勢頭&#xff0c;其影響力和應用范圍不斷擴大&#xff0c;深刻地改變著我們的生活、工作和社會結構。尤其是AI大模型技術&#xff0c;國內外可謂是“百模大戰”&#xff0c;百舸爭流…

github恢復碼怎么備份

https://docs.github.com/zh/authentication/securing-your-account-with-two-factor-authentication-2fa/configuring-two-factor-authentication-recovery-methods