vue3使用axios并封裝axios請求的詳細(xì)步驟
Axios,是一個(gè)基于promise的網(wǎng)絡(luò)請求庫,作用于node.js和瀏覽器中,它是 isomorphic 的(即同一套代碼可以運(yùn)行在瀏覽器和node.js中)。在服務(wù)端它使用原生node.js http模塊, 而在客戶端 (瀏覽端) 則使用XMLHttpRequest。
第一步:安裝axios

npm install axios
第二步:編寫請求文件
新建request.js

簡單的axios封裝,里面相關(guān)提示信息,自己可以引入element-plus去添加
/**axios封裝
* 請求攔截、相應(yīng)攔截、錯(cuò)誤統(tǒng)一處理
*/
import axios from 'axios';
import QS from 'qs';
import router from '../router/index'
//qs.stringify()是將對象 序列化成URL的形式,以&進(jìn)行拼接
// let protocol = window.location.protocol; //協(xié)議
// let host = window.location.host; //主機(jī)
// axios.defaults.baseURL = protocol + "http://" + host;
axios.defaults.baseURL = '/api'
axios.interceptors.request.use( //響應(yīng)攔截
async config => {
// 每次發(fā)送請求之前判斷vuex中是否存在token
// 如果存在,則統(tǒng)一在http請求的header都加上token,這樣后臺根據(jù)token判斷你的登錄情況
// 即使本地存在token,也有可能token是過期的,所以在響應(yīng)攔截器中要對返回狀態(tài)進(jìn)行判斷
config.headers.token = sessionStorage.getItem('token')
return config;
},
error => {
return Promise.error(error);
})
// 響應(yīng)攔截器
axios.interceptors.response.use(
response => {
if (response.status === 200) {
return Promise.resolve(response); //進(jìn)行中
} else {
return Promise.reject(response); //失敗
}
},
// 服務(wù)器狀態(tài)碼不是200的情況
error => {
if (error.response.status) {
switch (error.response.status) {
// 401: 未登錄
// 未登錄則跳轉(zhuǎn)登錄頁面,并攜帶當(dāng)前頁面的路徑
// 在登錄成功后返回當(dāng)前頁面,這一步需要在登錄頁操作。
case 401:
break
// 403 token過期
// 登錄過期對用戶進(jìn)行提示
// 清除本地token和清空vuex中token對象
// 跳轉(zhuǎn)登錄頁面
case 403:
sessionStorage.clear()
router.push('/login')
break
// 404請求不存在
case 404:
break;
// 其他錯(cuò)誤,直接拋出錯(cuò)誤提示
default:
}
return Promise.reject(error.response);
}
}
);
/**
* get方法,對應(yīng)get請求
* @param {String} url [請求的url地址]
* @param {Object} params [請求時(shí)攜帶的參數(shù)]
*/
const $get = (url, params) => {
return new Promise((resolve, reject) => {
axios.get(url, {
params: params,
})
.then(res => {
resolve(res.data);
})
.catch(err => {
reject(err.data)
})
});
}
/**
* post方法,對應(yīng)post請求
* @param {String} url [請求的url地址]
* @param {Object} params [請求時(shí)攜帶的參數(shù)]
*/
const $post = (url, params) => {
return new Promise((resolve, reject) => {
axios.post(url, QS.stringify(params)) //是將對象 序列化成URL的形式,以&進(jìn)行拼接
.then(res => {
resolve(res.data);
})
.catch(err => {
reject(err.data)
})
});
}
//下面是將get和post方法掛載到vue原型上供全局使用、
// vue2.x中是通 Vue.prototype 來綁定的,像這樣Vue.prototype.$toast = Toast。在vue3中取消了Vue.prototype,推薦使用globalProperties來綁定,
export default {
install: (app) => {
app.config.globalProperties['$get'] = $get;
app.config.globalProperties['$post'] = $post;
app.config.globalProperties['$axios'] = axios;
}
}幾個(gè)需要注意的點(diǎn):
1、我們可以通過window.location.protocol和window.location.host獲取協(xié)議和主機(jī)ip端口,然后統(tǒng)一設(shè)置axios的默認(rèn)請求baseURL
// let protocol = window.location.protocol; //協(xié)議 // let host = window.location.host; //主機(jī) // axios.defaults.baseURL = protocol + "http://" + host;
2、qs.stringify()是將對象 序列化成URL的形式,以&進(jìn)行拼接
(1)先引入 qs模塊
import QS from 'qs';
(2)在請求參數(shù)前面包裹使用

(3)查看參數(shù)結(jié)果,就轉(zhuǎn)換為了formdata傳參形式,方便快捷、

3、全局掛載,vue2.x中是通 Vue.prototype 來綁定的,例如 Vue.prototype.$toast = Toast。在vue3中取消了Vue.prototype,推薦使用 globalProperties 來綁定,掛載到組件的proxy上
export default {
install: (app) => {
app.config.globalProperties['$get'] = $get;
app.config.globalProperties['$post'] = $post;
app.config.globalProperties['$axios'] = axios;
}
}第三步:在main.js引入
注意:axios在request.js中已經(jīng)全局引入了,在main.js中就不需要再引入axios,否則會報(bào)錯(cuò)

第四步:在組件中使用
引入

由于 Vue3中,在setup中無法通過this獲取組件實(shí)例,console.log(this)打印出來的值是undefined。因此我們需要通過getCurrentInstance 方法獲取當(dāng)前組件實(shí)例。
注意:getCurrentInstance只能在setup或生命周期鉤子中使用。
proxy是getCurrentInstance()對象中的一個(gè)屬性,然后通過對象的解構(gòu)賦值方式拿到proxy。
import { getCurrentInstance } from 'vue'
const { proxy } = getCurrentInstance();然后通過proxy拿到掛載好的get和post請求。
function testFunc() {
let data = {
roleId: "A",
username: "dpc",
password: "--",
sysType: "zhfw",
}
proxy.$post("/index/login", data).then((response) => {
console.log(response)
})
}到此這篇關(guān)于vue3使用axios并封裝axios請求的文章就介紹到這了,更多相關(guān)vue3封裝axios請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
proxy代理不生效以及vue?config.js不生效解決方法
在開發(fā)Vue項(xiàng)目過程中,使用了Proxy代理進(jìn)行數(shù)據(jù)劫持,但是在實(shí)際運(yùn)行過程中發(fā)現(xiàn)代理并沒有生效,也就是說數(shù)據(jù)并沒有被劫持,這篇文章主要給大家介紹了關(guān)于proxy代理不生效以及vue?config.js不生效解決方法的相關(guān)資料,需要的朋友可以參考下2023-11-11
一文詳解Vue如何整合Echarts實(shí)現(xiàn)可視化界面
ECharts,縮寫來自Enterprise Charts,商業(yè)級數(shù)據(jù)圖表,一個(gè)純Javascript的圖表庫,可以流暢的運(yùn)行在PC和移動設(shè)備上。本文將在Vue中整合Echarts實(shí)現(xiàn)可視化界面,感興趣的可以了解一下2022-04-04
解決vue里a標(biāo)簽值解析變量,跳轉(zhuǎn)頁面,前面加默認(rèn)域名端口的問題
這篇文章主要介紹了解決vue里a標(biāo)簽值解析變量,跳轉(zhuǎn)頁面,前面加默認(rèn)域名端口的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
vue項(xiàng)目下npm或yarn下安裝echarts多個(gè)版本方式
這篇文章主要介紹了vue項(xiàng)目下npm或yarn下安裝echarts多個(gè)版本方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
vue 音樂App QQ音樂搜索列表最新接口跨域設(shè)置方法
這篇文章主要介紹了vue 音樂App QQ音樂搜索列表最新接口跨域設(shè)置方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09

