最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue使用axios的小技巧分享

 更新時間:2023年10月27日 09:55:50   作者:落筆憶夢  
這篇文章主要為大家詳細介紹了一些vue使用axios的小技巧,文中的示例代碼講解詳細,對我們深入掌握vue有一定的幫助,感興趣的小伙伴可以跟隨小編一起學(xué)習一下

全局loading

在日常開發(fā)工作中,每次使用api請求數(shù)據(jù)時,都會涉及添加loading狀態(tài),從而達到優(yōu)化用戶體驗的效果,特別是對于請求時間較長的接口時。這樣每次請求開始時就要添加loading狀態(tài),請求完成時要移除loading狀態(tài),導(dǎo)致重復(fù)又繁瑣的工作。所以我們可以思考從axios方向著手,嘻嘻嘻...

思路

創(chuàng)建axios函數(shù) 我們采用axios.create()創(chuàng)建http方法

/**
 * Axios實例化參數(shù)選項對象
 * @const
 * @type {object}
 * @property {object} headers 請求頭對象對象,默認:null
 * @property {number} timeout 超時時間,默認:0, 不限制
 * @property {boolean} withCredentials 是否帶上驗證信息, 默認:true
 * @property {number} maxContentLength 限制最大發(fā)送內(nèi)容長度,默認:-1 不限制
 * @property {strin} baseURL 默認請求拼接的前綴
 */
const http = axios.create({
	headers: {
		'Content-Type': 'application/json;charset=UTF-8',
		// ie瀏覽器get請求兼容問題
		'Cache-Control': 'no-cache',
		'If-Modified-Since': '0'
	},
	timeout: 0,
	withCredentials: false,
	responseType: 'json',
	maxContentLength: -1,
	baseURL: import.meta.env.VITE_APP_BASE_API
});
export default http

添加loading

axios具有請求攔截器以及響應(yīng)攔截器的特性進行處理。我們在請求攔截器觸發(fā)時添加loading,響應(yīng)攔截器觸發(fā)時移除loading。

import { ElLoading } from 'element-plus';

// 全局loading
let loadingInstance;

/**
 * Axios實例化參數(shù)選項對象
 * @const
 * @type {object}
 * @property {object} headers 請求頭對象對象,默認:null
 * @property {number} timeout 超時時間,默認:0, 不限制
 * @property {boolean} withCredentials 是否帶上驗證信息, 默認:true
 * @property {number} maxContentLength 限制最大發(fā)送內(nèi)容長度,默認:-1 不限制
 * @property {strin} baseURL 默認請求拼接的前綴
 */
const http = axios.create({
	headers: {
		'Content-Type': 'application/json;charset=UTF-8',
		// ie瀏覽器get請求兼容問題
		'Cache-Control': 'no-cache',
		'If-Modified-Since': '0'
	},
	timeout: 0,
	withCredentials: false,
	responseType: 'json',
	maxContentLength: -1,
	baseURL: import.meta.env.VITE_APP_BASE_API
});
/**
 * 請求攔截器
 */
http.interceptors.request.use((config) => {
	// 創(chuàng)建全局loading
	loadingInstance = ElLoading.service({
		text: '加載中...',
		target: '#ContentArea'
	});
	return config;
});

// 響應(yīng)攔截器
http.interceptors.response.use((res) => {
	nextTick(() => {
		loadingInstance?.close();
	});
});
export default http

注意

這個時候乍一看是沒有什么問題的,但是當多個請求同時執(zhí)行時,每個請求都會添加全局loading,當?shù)谝粋€請求完成時全局loading就被移除了,實際上應(yīng)該是最后一個請求完成時,才移除全局loading。

處理loading混亂 基于loading的攔截器,我們可以定義一個請求隊列,對當前正在進行中的請求進行管理,在請求攔截器中將該請求添加進請求隊列中,當請求隊列的長度為0時,添加loading,在響應(yīng)攔截器中將該請求從請求隊列中移除,當請求隊列的長度為0時,移除loading。

import { ElLoading } from 'element-plus';

// 請求隊列
const httpPromiseArr = new Map();

// 全局loading
let loadingInstance;

/**
 * 判斷是否為JSON格式
 * @param {*} str
 * @returns
 */
function isJSON(str) {
	if (typeof str == 'string') {
		try {
			JSON.parse(str);
			return true;
		} catch (e) {
			return false;
		}
	}
}
/**
 * 創(chuàng)建緩存key, 由請求url、類型、參數(shù)、發(fā)送數(shù)據(jù)構(gòu)成的標識符
 * @param {string} url 請求url
 * @param {string} type 請求類型
 * @param {object} params url參數(shù)對象
 * @param {object} data 請求數(shù)據(jù)
 * @return {string}
 */
function createKey(config) {
	const { url, method, params = {}, data = {} } = config;
	return encodeURIComponent(
		[url, method, isJSON(params) ? params : JSON.stringify(params), isJSON(data) ? data : JSON.stringify(data)].join(
			','
		)
	);
}

/**
 * Axios實例化參數(shù)選項對象
 * @const
 * @type {object}
 * @property {object} headers 請求頭對象對象,默認:null
 * @property {number} timeout 超時時間,默認:0, 不限制
 * @property {boolean} withCredentials 是否帶上驗證信息, 默認:true
 * @property {number} maxContentLength 限制最大發(fā)送內(nèi)容長度,默認:-1 不限制
 * @property {strin} baseURL 默認請求拼接的前綴
 */
const http = axios.create({
	headers: {
		'Content-Type': 'application/json;charset=UTF-8',
		// ie瀏覽器get請求兼容問題
		'Cache-Control': 'no-cache',
		'If-Modified-Since': '0'
	},
	timeout: 0,
	withCredentials: false,
	responseType: 'json',
	maxContentLength: -1,
	baseURL: import.meta.env.VITE_APP_BASE_API
});
/**
 * 請求攔截器
 */
http.interceptors.request.use((config) => {
	if (httpPromiseArr.size === 0) {
		// 創(chuàng)建全局loading
		loadingInstance = ElLoading.service({
			text: '加載中...'
		});
	}
	httpPromiseArr.set(createKey(config));
	return config;
});

// 響應(yīng)攔截器
http.interceptors.response.use((res) => {
	const key = createKey(res.config);

	if (httpPromiseArr.has(key)) {
		httpPromiseArr.delete(key);
	}

	// 全部請求結(jié)束關(guān)閉loading
	if (httpPromiseArr.size === 0) {
		nextTick(() => {
			loadingInstance?.close();
		});
	}
});
export default http

總結(jié)

思路就是使用隊列來管理請求的方式來實現(xiàn),基于此思路同樣可以完成,在同一時間內(nèi)禁止同意請求的多次觸發(fā),也就是攔截同一請求,進行性能優(yōu)化。

到此這篇關(guān)于vue使用axios的小技巧分享的文章就介紹到這了,更多相關(guān)vue使用axios內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue3實現(xiàn)組件拖拽實時預(yù)覽功能

    Vue3實現(xiàn)組件拖拽實時預(yù)覽功能

    這篇文章主要介紹了Vue3實現(xiàn)組件拖拽實時預(yù)覽功能,對于組件拖拽預(yù)覽,用戶可以在含有各種功能組件的列表中,選擇需要的組件進行拖拽,需要的朋友可以參考下
    2023-12-12
  • vue + socket.io實現(xiàn)一個簡易聊天室示例代碼

    vue + socket.io實現(xiàn)一個簡易聊天室示例代碼

    本篇文章主要介紹了vue + socket.io實現(xiàn)一個簡易聊天室示例代碼,具有一定的參考價值,有興趣的可以了解一下。
    2017-03-03
  • vue父子組件之間的傳參的幾種方式小結(jié)

    vue父子組件之間的傳參的幾種方式小結(jié)

    本文主要介紹了vue父子組件之間的傳參的幾種方式小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2023-04-04
  • vue前端編譯報錯的圖文解決方法

    vue前端編譯報錯的圖文解決方法

    Vue框架可以很方便的引入各種插件,但是也因此會經(jīng)常遇到種編譯報錯,這篇文章主要給大家介紹了關(guān)于vue前端編譯報錯解決的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • Vue 模板中 ref 的自動解包機制及常見誤區(qū)

    Vue 模板中 ref 的自動解包機制及常見誤區(qū)

    從Vue 3的Composition API開始,ref成為了處理響應(yīng)式數(shù)據(jù)的核心方式之一,本文給大家介紹Vue模板中ref的自動解包機制及常見誤區(qū),感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • vue中如何去掉input前后的空格

    vue中如何去掉input前后的空格

    這篇文章主要介紹了vue中如何去掉input前后的空格問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 使用vite搭建ssr活動頁架構(gòu)的實現(xiàn)

    使用vite搭建ssr活動頁架構(gòu)的實現(xiàn)

    本文主要介紹了使用vite搭建ssr活動頁架構(gòu),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2022-07-07
  • vue如何根據(jù)url下載非同源文件

    vue如何根據(jù)url下載非同源文件

    我們在開發(fā)過程中,有時會遇到后端返回的文件地址和我們的網(wǎng)站不是同源的情況下,本文就介紹了vue如何根據(jù)url下載非同源文件,感興趣的可以了解一下
    2021-06-06
  • vue實現(xiàn)下拉框篩選表格數(shù)據(jù)

    vue實現(xiàn)下拉框篩選表格數(shù)據(jù)

    這篇文章主要為大家詳細介紹了vue實現(xiàn)下拉框篩選表格數(shù)據(jù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • 解決ElementUI中tooltip出現(xiàn)無法顯示的問題

    解決ElementUI中tooltip出現(xiàn)無法顯示的問題

    這篇文章主要介紹了解決ElementUI中tooltip出現(xiàn)無法顯示的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評論

花垣县| 布尔津县| 珲春市| 溧阳市| 曲阜市| 舞钢市| 岚皋县| 来安县| 玛曲县| 佳木斯市| 庆安县| 高阳县| 漳平市| 南部县| 如东县| 聂拉木县| 莲花县| 依安县| 山西省| 祁连县| 乌恰县| 罗甸县| 兴城市| 彝良县| 重庆市| 富民县| 永靖县| 洛浦县| 汨罗市| 洞口县| 花垣县| 武清区| 威宁| 东城区| 雅江县| 宝应县| 乌兰浩特市| 临泽县| 通河县| 萨嘎县| 吐鲁番市|