詳解Vue前端對(duì)axios的封裝和使用
Axios 是一個(gè)基于 promise 的 HTTP 庫(kù)。將axios封裝好后能更高效的開(kāi)發(fā)并且方便維護(hù),而且在以后的項(xiàng)目中也能直接套用,所以封裝好是必要的。在參考了很多方法后,我拼湊出了一套我認(rèn)為很實(shí)用的方法。
首先是http目錄下的兩個(gè)文件
helper.js
這個(gè)是功能性文件包括拼接url、過(guò)濾參數(shù)等,把方法集合到一個(gè)文件方便維護(hù)和修改。
讀一遍知道他有什么功能就行了
const helper = {
// 根據(jù)name獲取地址欄的參數(shù)值
getQueryString (name) {
let reg = new RegExp(`(^|&)${name}=([^&]*)(&|$)`)
let hash = window.location.hash
let search = hash.split('?')
let r = search[1] && search[1].match(reg)
if (r != null) return r[2]; return ''
},
// 拼接參數(shù)至url
queryString (url, query) {
let str = []
for (let key in query) {
str.push(key + '=' + query[key])
}
let paramStr = str.join('&')
return paramStr ? `${url}?${paramStr}` : url
},
// 自定義判斷元素類(lèi)型JS
toType(obj) {
return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
},
// 參數(shù)過(guò)濾函數(shù)
filterNull(o) {
for (var key in o) {
if (o[key] === null) {
delete o[key]
}
if (toType(o[key]) === 'string') {
o[key] = o[key].trim()
} else if (toType(o[key]) === 'object') {
o[key] = filterNull(o[key])
} else if (toType(o[key]) === 'array') {
o[key] = filterNull(o[key])
} else if (toType(o[key]) === 'number') {
o[key] = filterNull(o[key])
}
}
return o
}
}
export default helper
http.js
接收請(qǐng)求,暴露接口,包含參數(shù)params、發(fā)往后端的url和token(如果不用JWT的同學(xué)可以省略參數(shù)token),處理后發(fā)往后端
import axios from 'axios'
let qs = require('querystring')
import helper from './helper'
//console.log( process.env.NODE_ENV)
//判斷環(huán)境提供baseURL,注意要與后臺(tái)地址一致
let root = process.env.NODE_ENV === 'development'
// 開(kāi)發(fā)環(huán)境api接口
?
`http://localhost:3001/api`
// 生產(chǎn)環(huán)境api接口
:
`http://127.0.0.1:3001/api`;
// 引用axios,設(shè)置頭文件
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
function apiAxios(method, url, params, token) {
if (params) {
params = helper.filterNull(params)
}
return axios({
method: method,
//拼接參數(shù)
url: method === 'GET'|| method === 'DELETE' ? helper.queryString(url,params) : url,
data: method === 'POST' || method === 'PUT' ? qs.stringify(params) : null,
baseURL: root,
timeout: 10000,
headers: { Authorization: `Bearer ${token}` }, //jwt
withCredentials: false
})
}
// 返回在vue模板中的調(diào)用接口
export default {
get: function (url, params, token) {
return apiAxios('GET', url, params, token)
},
post: function (url, params, token) {
return apiAxios('POST', url, params, token)
},
put: function (url, params, token) {
return apiAxios('PUT', url, params, token)
},
delete: function (url, params, token) {
return apiAxios('DELETE', url, params, token)
},
}
api.js
封裝前端api接口,接受前端頁(yè)面發(fā)來(lái)的請(qǐng)求,封裝后可根據(jù)函數(shù)名判斷類(lèi)型和url給axios文件,方便維護(hù)和開(kāi)發(fā)。
import http from '../http/http.js'
export default {
login(data, token){
return http.post("/login",data, token)
},
getUserInfo(data, token){
return http.get("/getUserInfo",data, token)
}
}
在main.js中引用后就可以全局調(diào)用了
前端中用this.$api.urlName()的格式發(fā)送請(qǐng)求,也可以不經(jīng)過(guò)api直接用this. $http,但是每次都要寫(xiě)url,當(dāng)接口多的時(shí)候比較麻煩。所以推薦用api封裝好。
import api from './api/api.js' import http from './http/http.js' //定義全局變量 Vue.prototype.$api = api Vue.prototype.$http = http
前端中使用:
由于axios返回的是promise對(duì)象,所以要用 .then的形式接收后端發(fā)回來(lái)的response,然后做出相應(yīng)的反饋。
//直接用this.$api調(diào)用api中接口,如果不封裝api接口可以用this.$http
this.$api.login(data, token).then((res) => {
console.log(res)
}).catch((err) => {
console.log(res)
})
以上所述是小編給大家介紹的Vue前端對(duì)axios的封裝和使用詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
56個(gè)實(shí)用的JavaScript 工具函數(shù)助你提升開(kāi)發(fā)效率
今天來(lái)看看JavaScript中的一些實(shí)用的工具函數(shù),希望能幫助你提高開(kāi)發(fā)效率!需要的朋友可以參考下面文章的具體內(nèi)容2021-10-10
Vue響應(yīng)式原理及雙向數(shù)據(jù)綁定示例分析
這篇文章主要為大家介紹了Vue響應(yīng)式原理及雙向數(shù)據(jù)綁定的示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
基于Vue實(shí)現(xiàn)人民幣小寫(xiě)轉(zhuǎn)為大寫(xiě)功能
在金融類(lèi)應(yīng)用中,經(jīng)常需要將金額從小寫(xiě)數(shù)字轉(zhuǎn)換為大寫(xiě)形式,這種轉(zhuǎn)換主要用于正式票據(jù)、合同等場(chǎng)合,以增加文本的專(zhuān)業(yè)性和可讀性,本文將詳細(xì)介紹如何在Vue.js項(xiàng)目中實(shí)現(xiàn)這一功能,并提供多個(gè)示例和詳細(xì)的代碼說(shuō)明,需要的朋友可以參考下2024-09-09
vue+elementUI組件遞歸實(shí)現(xiàn)可折疊動(dòng)態(tài)渲染多級(jí)側(cè)邊欄導(dǎo)航
這篇文章主要介紹了vue+elementUI組件遞歸實(shí)現(xiàn)可折疊動(dòng)態(tài)渲染多級(jí)側(cè)邊欄導(dǎo)航,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
Vue中的數(shù)據(jù)驅(qū)動(dòng)解釋
這篇文章主要為大家介紹了Vue中的數(shù)據(jù)驅(qū)動(dòng)解釋?zhuān)行枰呐笥芽梢越梃b參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
vue中beforeRouteLeave實(shí)現(xiàn)頁(yè)面回退不刷新的示例代碼
這篇文章主要介紹了vue中beforeRouteLeave實(shí)現(xiàn)頁(yè)面回退不刷新的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
使用Vue實(shí)現(xiàn)點(diǎn)擊按鈕小球加入購(gòu)物車(chē)動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了如何使用Vue實(shí)現(xiàn)點(diǎn)擊按鈕小球加入購(gòu)物車(chē)動(dòng)畫(huà),文中的示例代碼講解詳細(xì),有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
elementui?el-table底層背景色修改簡(jiǎn)單方法
最近在做項(xiàng)目的時(shí)候遇到個(gè)需求,需要修改el-table背景色,這里給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于elementui?el-table底層背景色修改的相關(guān)資料,需要的朋友可以參考下2023-10-10
vue+element實(shí)現(xiàn)表單校驗(yàn)功能
這篇文章主要介紹了vue+element表單校驗(yàn)功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05
Vue3實(shí)現(xiàn)provide/inject的示例詳解
Vue3 的 Provide / Inject 的實(shí)現(xiàn)原理其實(shí)就是巧妙利用了原型和原型鏈來(lái)實(shí)現(xiàn)的。本文將通過(guò)示例為大家介紹下provide/inject的具體實(shí)現(xiàn),需要的可以參考一下2022-11-11

