前端項目Axios封裝Vue3詳細教程(附源碼)

前端項目Axios封裝Vue3詳細教程(附源碼)


在這里插入圖片描述

一、引言

在前端項目開發中,HTTP請求是不可或缺的一部分。Axios作為一個基于Promise的HTTP客戶端,因其易用性和豐富的功能而廣受歡迎。在Vue3項目中,合理地封裝Axios不僅可以提高開發效率,還可以增強代碼的可維護性和可讀性。本文將詳細介紹如何在Vue3項目中封裝Axios,包括請求攔截器中添加加載框、響應攔截器中處理各類狀態碼等高級功能,并給出詳細的教程和可直接使用的代碼。

二、Axios安裝與基本使用
1. 安裝Axios

首先,你需要在Vue3項目中安裝Axios。可以使用npm或yarn進行安裝:

npm install axios
# 或者
yarn add axios
2. 基本使用

安裝完成后,你可以在Vue組件中直接使用Axios發送HTTP請求。例如:

import axios from 'axios';axios.get('https://api.example.com/data').then(response => {console.log(response.data);}).catch(error => {console.error(error);});
三、Axios封裝流程

為了更好地管理HTTP請求,我們需要對Axios進行封裝。以下是封裝Axios的詳細流程:

1. 創建Axios實例

在項目根目錄或src目錄下創建一個新的文件夾(如utils),并在其中創建一個文件(如request.js),用于創建Axios實例和配置相關參數。

// src/utils/request.js
import axios from 'axios';// 創建Axios實例
const instance = axios.create({baseURL: 'https://api.example.com', // API的基礎URLtimeout: 10000, // 請求超時時間headers: {'Content-Type': 'application/json'}
});export default instance;
2. 配置請求攔截器

請求攔截器可以在請求發送之前對請求進行一些處理,如添加token、設置請求頭等。此外,我們還可以在請求攔截器中添加加載框,以提示用戶請求正在進行中。

假設我們使用的是一個簡單的加載框組件(如LoadingComponent),它可以通過Vue的全局狀態管理(如Vuex)或事件總線來控制顯示和隱藏。

// src/utils/request.js (繼續添加代碼)
import store from '@/store'; // 假設我們有一個Vuex store來管理加載框狀態// 請求攔截器
instance.interceptors.request.use(config => {// 從localStorage或Vuex中獲取tokenconst token = localStorage.getItem('token');if (token) {config.headers.Authorization = `Bearer ${token}`;}// 顯示加載框store.commit('setLoading', true); // 假設我們有一個mutation叫`setLoading`return config;},error => {// 隱藏加載框(請求出錯時)store.commit('setLoading', false);return Promise.reject(error);}
);

在這里,我們假設Vuex store中有一個loading狀態,用于控制加載框的顯示和隱藏。你需要根據自己的項目實際情況來調整這部分代碼。

3. 配置響應攔截器

響應攔截器可以在響應返回之后對響應進行一些處理,如統一處理錯誤、轉換響應數據格式等。我們還可以根據響應的狀態碼來執行不同的操作,如顯示錯誤通知、跳轉到登錄頁面等。

// src/utils/request.js (繼續添加代碼)
import { Message } from 'element-ui'; // 假設我們使用Element UI來顯示通知
import router from '@/router'; // 引入Vue Router// 響應攔截器
instance.interceptors.response.use(response => {// 隱藏加載框store.commit('setLoading', false);// 對響應數據進行處理,如統一格式const res = response.data;if (res.code !== 200) {// 根據不同的狀態碼執行不同的操作switch (res.code) {case 401:// 未登錄或token過期,跳轉到登錄頁面router.push('/login');break;case 403:// 無權限訪問Message.error('無權限訪問');break;default:// 其他錯誤Message.error(res.message || '請求出錯');}return Promise.reject(new Error(res.message || 'Error'));} else {return res;}},error => {// 隱藏加載框(請求出錯時)store.commit('setLoading', false);// 對錯誤進行處理,如顯示通知if (error.response) {switch (error.response.status) {case 401:// 未登錄或token過期,跳轉到登錄頁面router.push('/login');break;case 403:// 無權限訪問Message.error('無權限訪問');break;case 404:// 資源未找到Message.error('資源未找到');break;default:// 其他錯誤Message.error('請求出錯');}} else {Message.error('網絡錯誤');}return Promise.reject(error);}
);

在這里,我們使用了Element UI的Message組件來顯示通知,并根據響應的狀態碼執行了不同的操作。你需要根據自己的項目實際情況來調整這部分代碼,比如使用其他的通知庫或自定義的錯誤處理方式。

4. 封裝請求方法

為了方便調用,我們可以將常用的HTTP請求方法(如GET、POST、PUT、DELETE等)封裝成函數。

// src/utils/request.js (繼續添加代碼)export function get(url, params = {}) {return instance.get(url, { params });
}export function post(url, data = {}) {return instance.post(url, data);
}export function put(url, data = {}) {return instance.put(url, data);
}export function del(url) {return instance.delete(url);
}
四、在Vue3項目中使用封裝后的Axios
1. 引入封裝后的Axios

在需要使用Axios的Vue組件中引入封裝后的Axios實例和請求方法。

// src/views/Home.vue
<template><div><h1>Home</h1><p>{{ message }}</p></div>
</template><script>
import { get } from '@/utils/request';export default {data() {return {message: ''};},created() {this.fetchData();},methods: {async fetchData() {try {const response = await get('/api/data');this.message = response.data;} catch (error) {console.error(error);}}}
};
</script>
2. 調用請求方法

在組件的方法中調用封裝好的請求方法,即可發送HTTP請求并處理響應。由于我們已經在請求攔截器和響應攔截器中處理了加載框和錯誤通知,因此在組件中無需再額外處理這些邏輯。

五、封裝細節與優化
1. 加載框的顯示與隱藏

在請求攔截器中顯示加載框,在響應攔截器和請求出錯時隱藏加載框。這樣可以確保加載框在請求進行時顯示,并在請求完成后及時隱藏。

2. 錯誤處理與通知

在響應攔截器中,我們根據響應的狀態碼執行了不同的操作,如跳轉到登錄頁面、顯示錯誤通知等。這樣可以統一處理錯誤,提高用戶體驗。

3. 請求方法的封裝

將常用的HTTP請求方法封裝成函數,方便在組件中調用。這樣可以減少重復代碼,提高開發效率。

4. 可擴展性

我們的封裝方式具有良好的可擴展性。如果未來需要添加新的請求方法或處理新的狀態碼,只需在request.js文件中進行相應的修改即可。

六、封裝流程單與表格
封裝流程單
  1. 安裝Axios:使用npm或yarn安裝Axios。

  2. 創建Axios實例:在utils文件夾中創建request.js文件,并創建Axios實例。

  3. 配置請求攔截器

    • 從localStorage或Vuex中獲取token,并添加到請求頭中。
    • 顯示加載框。
  4. 配置響應攔截器

    • 隱藏加載框。
  5. 配置響應攔截器

    • 根據響應的狀態碼執行不同的操作,如處理未登錄、無權限訪問、資源未找到等錯誤。
    • 對響應數據進行統一處理,如格式轉換或錯誤消息提取。
    • 隱藏加載框(響應完成或出錯時)。
  6. 封裝請求方法

    • 將常用的HTTP請求方法(GET、POST、PUT、DELETE等)封裝成易于調用的函數。
    • 提供可選的參數配置,如請求參數或請求體數據。
  7. 在Vue組件中使用

    • 在需要發送HTTP請求的Vue組件中引入封裝后的Axios實例和請求方法。
    • 調用請求方法發送請求,并處理響應數據或錯誤。
封裝細節優化表格
優化點描述
加載框管理在請求攔截器中顯示加載框,在響應攔截器和錯誤處理中隱藏加載框,確保用戶體驗。
錯誤統一處理在響應攔截器中根據狀態碼統一處理錯誤,如跳轉登錄、顯示通知,減少重復代碼。
請求方法封裝封裝GET、POST等常用請求方法,簡化調用,提高代碼可讀性和開發效率。
可擴展性封裝設計易于擴展,未來可輕松添加新請求方法或處理新狀態碼。
配置集中管理Axios實例的配置(如baseURL、timeout)集中在一處管理,方便修改和維護。
Token自動附加請求攔截器自動從localStorage或Vuex中獲取并附加Token,簡化請求頭管理。
響應數據統一處理對響應數據進行統一格式處理或錯誤消息提取,減少組件中重復處理邏輯。
七、實踐案例與代碼片段
實踐案例

假設我們有一個用戶信息管理模塊,需要獲取用戶列表、添加新用戶、更新用戶信息和刪除用戶。使用封裝后的Axios,我們可以輕松實現這些功能。

獲取用戶列表
// src/views/UserList.vue
<template><div><h1>User List</h1><ul><li v-for="user in users" :key="user.id">{{ user.name }}</li></ul></div>
</template><script>
import { get } from '@/utils/request';export default {data() {return {users: []};},created() {this.fetchUsers();},methods: {async fetchUsers() {try {const response = await get('/api/users');this.users = response.data;} catch (error) {console.error('Failed to fetch users:', error);}}}
};
</script>
添加新用戶
// src/views/AddUser.vue
<template><div><h1>Add User</h1><form @submit.prevent="addUser"><input v-model="newUser.name" placeholder="Enter user name" required /><button type="submit">Add User</button></form></div>
</template><script>
import { post } from '@/utils/request';export default {data() {return {newUser: {name: ''}};},methods: {async addUser() {try {await post('/api/users', this.newUser);this.$message.success('User added successfully');this.newUser.name = ''; // Reset form} catch (error) {console.error('Failed to add user:', error);this.$message.error('Failed to add user');}}}
};
</script>
更新和刪除用戶

類似地,我們可以使用putdel方法來更新和刪除用戶信息。這里不再贅述具體代碼,但你可以想象它們的使用方式與getpost非常相似,只是請求的URL和方法名有所不同。

八、總結與展望

通過本文的介紹,我們學習了如何在Vue3項目中封裝Axios,包括創建Axios實例、配置請求和響應攔截器、封裝請求方法以及在Vue組件中使用封裝后的Axios。這種封裝方式不僅提高了開發效率,還增強了代碼的可維護性和可讀性。




快,讓 我 們 一 起 去 點 贊 !!!!在這里插入圖片描述

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

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

相關文章

手寫一個Tomcat

Tomcat 是一個廣泛使用的開源 Java Servlet 容器&#xff0c;用于運行 Java Web 應用程序。雖然 Tomcat 本身功能強大且復雜&#xff0c;但通過手寫一個簡易版的 Tomcat&#xff0c;我們可以更好地理解其核心工作原理。本文將帶你一步步實現一個簡易版的 Tomcat&#xff0c;并深…

在 UniApp 開發的網站中使圖片能夠緩存,不一直刷新

在 UniApp 開發的網站中&#xff0c;要使圖片能夠緩存&#xff0c;不一直刷新&#xff0c;可以考慮以下幾種方法&#xff1a; 1. 使用適當的 HTTP 緩存頭 確保你的服務器在響應圖片時&#xff0c;返回合適的緩存控制 HTTP 頭。以下是一些常用的 HTTP 頭來控制緩存&#xff1a…

Makefile——make工具編譯STM32工程

一、Makefile相關指令 1.1、變量 符號含義替換追加:恒等于 1.2、隱含規則 符號含義%.o任意的.o文件*.o所有的.o文件 1.3、通配符 符號含義$^所有依賴文件$所有目標文件$<所有依賴文件的第一個文件 1.4、編譯器指令常用參數功能說明 符號含義舉例-E預處理&#xff0c;…

深入理解Linux文件系統權限:從基礎到高級應用全解析

1. 什么是文件系統權限&#xff1f;它是如何工作的&#xff1f; 文件權限的本質 想象你的電腦是一個大房子&#xff0c;每個文件和目錄都是房間里的物品。文件系統權限就像是一把鑰匙&#xff0c;決定誰能進房間、能看什么、能修改什么。 權限三要素&#xff1a; 讀&#xff…

C語言:6.22練習題數組解答

#include <stdio.h> #include <string.h> // 用于 strlen() int main() {char a[100];int j 0;// 從用戶輸入讀取字符串printf("請輸入一個字符串: ");fgets(a, sizeof(a), stdin);// 遍歷字符串中的每個字符for (int i 0; i < strlen(a); i) {if (…

一、docker的安裝

一、docker桌面 二、docker的配置文件 1、docker配置文件位置/etc/docker/daemon.json 使用json格式&#xff0c;graphdata-root {"graph":"/deploy/docker","registry-mirrors": ["https://8auvmfwy.mirror.aliyuncs.com"],"…

Matlab 多項式擬合點法線(二維)

文章目錄 一、簡介二、實現代碼三、實現效果一、簡介 這個思路其實很簡單,假設我們有一組曲線點,我們可以對其擬合曲線并計算其導數來獲取每個點的法向量,當然這一思路也可以擴展至三維。具體過程如下所示: 二、實現代碼 %% *********

DeepSeek-R1 論文閱讀總結

1. QA問答&#xff08;我的筆記&#xff09; Q1: DeepSeek如何處理可讀性問題&#xff1f; 通過構建冷啟動數據&#xff08;數千條長CoT數據&#xff09;微調基礎模型&#xff0c;結合多階段訓練流程&#xff08;RL訓練、拒絕采樣生成SFT數據&#xff09;&#xff0c;并優化輸…

Manus AI:多語言手寫識別的技術革命與未來圖景

摘要&#xff1a;在全球化浪潮下&#xff0c;跨語言溝通的需求日益迫切&#xff0c;但手寫文字的多樣性卻成為技術突破的難點。Manus AI憑借其多語言手寫識別技術&#xff0c;將潦草筆跡轉化為精準數字文本&#xff0c;覆蓋全球超百種語言。本文從技術原理、應用場景、行業價值…

Flutter——最詳細原生交互(MethodChannel、EventChannel、BasicMessageChannel)使用教程

MethodChannel&#xff08;方法通道&#xff09; 用途&#xff1a;實現 雙向通信&#xff0c;用于調用原生平臺提供的 API 并獲取返回結果。 場景&#xff1a;適合一次性操作&#xff0c;如調用相機、獲取設備信息等。 使用步驟&#xff1a; Flutter 端&#xff1a;通過 Meth…

Python控制語句-循環語句-while

1.若k為整形,下述while循環執行的次數為()。 k=1000 while k>1: print(k) k=k/2 A、9 B、10 C、11 D、100 答案:A。k=k/2意味著每循環一次,k的值就會變為原來的一半,直到k的值不大于1。 2.下面的代碼,哪些會輸出1,2,3三個數字( )。 A、 for i in range(3): print(i) …

十二天-雙指針技術:鏈表問題的高效解法

一、雙指針技術分類 1. 同速雙指針&#xff08;同向移動&#xff09; 特點&#xff1a;兩個指針以相同速度移動適用場景&#xff1a; 鏈表逆序查找倒數第 k 個元素刪除倒數第 n 個節點 2. 快慢雙指針&#xff08;異速移動&#xff09; 特點&#xff1a;一個指針每次移動 1 步…

【vllm】Qwen2.5-VL-72B-AWQ 部署記錄

版本&#xff1a;0.7.2 注意事項&#xff1a; export LD_LIBRARY_PATH/home/xxxxx/anaconda3/envs/xxxxx/lib/python3.10/site-packages/nvidia/nvjitlink/lib:$LD_LIBRARY_PATH # 如果報錯可能需要Also pip install --force-reinstall githttps://github.com/huggingface/tra…

深度學習與大模型-張量

大家好&#xff01;今天我們來聊聊張量&#xff08;Tensor&#xff09;。別被這個詞嚇到&#xff0c;其實它沒那么復雜。 什么是張量&#xff1f; 簡單來說&#xff0c;張量就是一個多維數組。你可以把它看作是一個裝數據的容器&#xff0c;數據的維度可以是一維、二維&#…

【前端面試題】Vu3常見的面試題

1.Vue3與 Vue2的核心區別有哪些&#xff1f; ? 響應式系統 ?&#xff1a; ? Vue2&#xff1a;通過Object.defineProperty 實現響應式。這種方式在處理對象屬性的添加和刪除時存在局限性&#xff0c;且無法直接監控數組的變化 ?;?Vue3&#xff1a;采用Proxy 實現響應式&…

Android 粘包與丟包處理工具類:支持多種粘包策略的 Helper 實現

在Android開發中&#xff0c;處理TCP/UDP通信時&#xff0c;粘包和丟包是常見的問題。粘包是指多個數據包被接收方一次性接收&#xff0c;導致數據包之間的界限不清晰&#xff1b;丟包則是指數據包在傳輸過程中丟失。為了處理這些問題&#xff0c;我們可以編寫一個幫助類 Packe…

【C++11】移動語義

回顧 const int c的c是可以被取地址的&#xff0c;盡管是常量。所以以是否為常量來判斷是否為右值是錯誤的。 左值與右值正確的區分方法是是否能夠被取地址。&#xff08;能被取地址也就代表著是一個持久狀態&#xff0c;即有持久的存儲空間的值&#xff09; 常見的左值有我們…

LangChain教程 - Agent -之 ZERO_SHOT_REACT_DESCRIPTION

在構建智能 AI 助手時&#xff0c;我們希望模型能夠智能地調用工具&#xff0c;以便提供準確的信息。LangChain 提供了 AgentType.ZERO_SHOT_REACT_DESCRIPTION&#xff0c;它結合了 ReAct&#xff08;Reasoning Acting&#xff09;策略&#xff0c;使得 LLM 可以基于工具的描…

移動Android和IOS自動化中常見問題

APP測試邏輯 在app編寫自動化測試用例時&#xff0c;通常會出現只是簡單的點點點過程&#xff0c;然而卻忽略了在實際的自動化實現過程中&#xff0c;軟件是對app元素的判斷來執行測試腳本。所以會出現在后期已經寫好自動化腳本之后還會對測試用例的更新。 App在測試時&#…

python高效試用17---兩個字符串組成一個新的字符串和兩個字符串組成元組作為key哪個更高效

在 Python 中&#xff0c;使用字符串連接 (str1 str2) 作為 key 和使用元組 ((str1, str2)) 作為 key 的效率差異&#xff0c;主要受以下因素影響&#xff1a; 哈希計算速度&#xff1a; 字符串連接 (str1 str2)&#xff1a;會創建一個新的字符串對象&#xff0c;并計算哈希…