vue3中封裝Axios請求及在組件中使用詳解
前言
這篇文章直接能夠在項目中使用,沒有解釋什么東西,直接復制粘貼,嘎嘎用。
一、創(chuàng)建文件夾存放封裝好的js
我是創(chuàng)建在src/request/axios.js

二、封裝代碼如下
直接將下面代碼復制在request.js中,封裝了get,post請求,需要自己配置的是:自己的請求地址,tokenKey是否為token,改為自己存入本地的token名,可以看一下代碼中的注釋,很好看懂。
/**axios封裝
* 請求攔截、相應攔截、錯誤統(tǒng)一處理
*/
import axios from 'axios';
import QS from 'qs';
import router from '../router/index'
//qs.stringify()是將對象 序列化成URL的形式,以&進行拼接
// let protocol = window.location.protocol; //協(xié)議
// let host = window.location.host; //主機
// axios.defaults.baseURL = protocol + "http://" + host;
axios.defaults.baseURL = 'http://localhost:8888'
axios.interceptors.request.use( //響應攔截
async config => {
// 每次發(fā)送請求之前判斷vuex中是否存在token
// 如果存在,則統(tǒng)一在http請求的header都加上token,這樣后臺根據(jù)token判斷你的登錄情況
// 即使本地存在token,也有可能token是過期的,所以在響應攔截器中要對返回狀態(tài)進行判斷
config.headers.token = sessionStorage.getItem('token')
return config;
},
error => {
return Promise.error(error);
})
// 響應攔截器
axios.interceptors.response.use(
response => {
if (response.status === 200) {
return Promise.resolve(response); //進行中
} else {
return Promise.reject(response); //失敗
}
},
// 服務器狀態(tài)碼不是200的情況
error => {
if (error.response.status) {
switch (error.response.status) {
// 401: 未登錄
// 未登錄則跳轉登錄頁面,并攜帶當前頁面的路徑
// 在登錄成功后返回當前頁面,這一步需要在登錄頁操作。
case 401:
break
// 403 token過期
// 登錄過期對用戶進行提示
// 清除本地token和清空vuex中token對象
// 跳轉登錄頁面
case 403:
sessionStorage.clear()
router.push('/login')
break
// 404請求不存在
case 404:
break;
// 其他錯誤,直接拋出錯誤提示
default:
}
return Promise.reject(error.response);
}
}
);
/**
* get方法,對應get請求
* @param {String} url [請求的url地址]
* @param {Object} params [請求時攜帶的參數(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方法,對應post請求
* @param {String} url [請求的url地址]
* @param {Object} params [請求時攜帶的參數(shù)]
*/
const $post = (url, params) => {
return new Promise((resolve, reject) => {
axios.post(url, QS.stringify(params)) //是將對象 序列化成URL的形式,以&進行拼接
.then(res => {
resolve(res.data);
})
.catch(err => {
reject(err.data)
})
});
}
//下面是vue3必須加的,vue2不需要,只需要暴露出去get,post方法就可以
export default {
install: (app) => {
app.config.globalProperties['$get'] = $get;
app.config.globalProperties['$post'] = $post;
app.config.globalProperties['$axios'] = axios;
}
}三、配置
在main.js中,引入我們第一步封裝的js,然后use()
//引入封裝Axios請求 import Axios from './request/axios'; const app = createApp(App).use(VueAxios, axios).use(ElementPlus).use(router).use(Axios)
四、在需要的組件中使用
重點來了,封裝完了,歸根到底我得用。在組件中導入getCurrentInstance。加上如下代碼。
import { getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance(); function logout(){
proxy.$post("/sysStaff/logout",{}).then((response)=>{
console.log(response)
if(response.code == 200){
sessionStorage.clear();
router.push('/')
ElMessage({
message: '退出成功',
type: 'success',
})
}
})
}調用的時候,當中有兩個參數(shù),第一個參數(shù)是路徑,第二個參數(shù)是個對象,里面可以寫要發(fā)送請求的參數(shù),比如:username:shuaibi,password:123456。
補充:通過具體配置解決跨域問題CORS
安裝第三方包webpack-dev-server
不安裝沒有devServer配置項,必須安裝
npm install webpack-dev-server
在根目錄vue.config.js中寫入如下配置
module.exports = {
// 關閉語法檢查
lintOnSave: false,
// 解決axios發(fā)送請求時的跨域問題,不做配置會報錯如下↓↓↓↓
// ccess to XMLHttpRequest at 'http://127.0.0.1:23456/webPage/home_notice.post' from origin 'http://localhost:8080' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
devServer: {
// https: false,
proxy: {
// /api 表示攔截以/api開頭的請求路徑
"/webPage": {
target: "http://127.0.0.1:23456/", // 跨域的域名(不需要重寫路徑)
ws: false, // 是否開啟websockede
changeOrigin: true, // 是否開啟跨域
// pathRewrite: {
// "^/webPage": "",
// },
},
},
},
};瀏覽器從一個域名的網(wǎng)頁去請求另一個域名的資源時,域名、端口、協(xié)議任一不同,都是跨域。這里不具體解釋,想了解的可以查資料。
- devServer配置項可以開啟一個反向代理,來解決跨域問題。之前所有的地址拼接可以得到
/webPage/cooperater.post…最終發(fā)起請求時,如果沒有寫pathRewrite則表示查找/webPage并在其前拼接target中的地址。最會向http://127.0.0.1:23456/webPage/cooperater.post口發(fā)起請求。 - pathRewrite: {"^/webPage": "***",},表示路由重寫將/webPage替換為***
總結
vue項目當中對axios請求的封裝就是如此,非常的容易!?。?/p>
到此這篇關于vue3中封裝Axios請求及在組件中使用的文章就介紹到這了,更多相關vue3封裝Axios請求內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Vue3之getCurrentInstance與ts結合使用的方式
這篇文章主要介紹了Vue3之getCurrentInstance與ts結合使用的方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
解決vue-cli項目sourcemap因為文件重名導致的文件定位映射錯誤問題
這篇文章主要介紹了解決vue-cli項目sourcemap因為文件重名導致的文件定位映射錯誤問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
vue.js動態(tài)修改background-image問題
這篇文章主要介紹了vue.js動態(tài)修改background-image問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08
vue 使用iView組件中的Table實現(xiàn)定時自動滾動效果
要在css中設置table的高度,使數(shù)據(jù)過多時出現(xiàn)滾動條,將縱向設置為overflow-y: auto;橫向設置隱藏 overflow-x: hidden,接下來通過本文介紹vue使用iView組件中的Table實現(xiàn)定時自動滾動效果,需要的朋友可以參考下2024-05-05
vue動態(tài)綁定class選中當前列表變色的方法示例
這篇文章主要介紹了vue動態(tài)綁定class選中當前列表變色的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12

