Vue?實現(xiàn)接口進度條示例詳解
前端在向后端請求信息時,常常需要等待一定的時間才能得到返回結(jié)果。為了提高用戶體驗,可以通過實現(xiàn)一個接口進度條函數(shù)來增加頁面的交互性和視覺效果。

接口響應(yīng)快 - 效果

接口響應(yīng)慢 - 效果
實現(xiàn)思路
首先定義一個進度條組件來渲染頁面展示效果,組件包含進度條背景、進度長度、以及進度數(shù)字,同時還要設(shè)置數(shù)據(jù)綁定相關(guān)屬性,如進度條當(dāng)前的百分比、動畫執(zhí)行狀態(tài)、以及完成狀態(tài)等。在請求數(shù)據(jù)的過程中,需要添加監(jiān)聽函數(shù)來監(jiān)測數(shù)據(jù)請求的過程變化,并更新組件相應(yīng)的屬性和界面元素。
代碼實現(xiàn)
下面是使用 Vue 實現(xiàn)一個接口進度條的栗子:
<template>
<div class="progress-bar">
<div class="bg"></div>
<div class="bar" :style="{ width: progress + '%' }"></div>
<div class="label">{{ progress }}%</div>
</div>
</template>
<script>
export default {
data() {
return {
progress: 0,
isPlaying: false,
isCompleted: false
}
},
mounted() {
this.start();
},
methods: {
start() {
this.isPlaying = true;
this.animateProgress(90)
.then(() => {
if (!this.isCompleted) {
this.animateProgress(100);
}
})
.catch((error) => {
console.error('Progress error', error);
});
},
animateProgress(target) {
return new Promise((resolve, reject) => {
let start = this.progress;
const end = target;
const duration = (target - start) * 150;
const doAnimation = () => {
const elapsed = Date.now() - startTime;
const progress = Math.min(elapsed / duration, 1);
this.progress = start + ((end - start) * progress);
if (progress === 1) {
resolve();
} else if (this.isCompleted) {
resolve();
} else {
requestAnimationFrame(doAnimation);
}
};
const startTime = Date.now();
requestAnimationFrame(doAnimation);
});
},
finish() {
this.isCompleted = true;
this.progress = 100;
}
}
};
</script>
<style scoped>
.progress-bar {
position: relative;
height: 8px;
margin: 10px 0;
}
.bg {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: #ccc;
border-radius: 5px;
}
.bar {
position: absolute;
top: 0;
left: 0;
height: 100%;
border-radius: 5px;
background-color: #409eff;
transition: width 0.5s;
}
.label {
position: absolute;
top: -20px;
left: calc(100% + 5px);
color: #333;
font-size: 12px;
}
</style>首先定義了三個數(shù)據(jù)屬性用于控制動畫的播放和完成狀態(tài),分別是進度條當(dāng)前比例 progress、動畫播放狀態(tài) isPlaying、動畫完成狀態(tài) isCompleted。在組件初始化的過程中,調(diào)用了 start 方法來啟動進度條動畫效果。在該方法內(nèi)部,使用 Promise 來從 0% 到 90% 的百分比向相應(yīng)位置移動,并在到達該位置時停止。
判斷當(dāng)前是否完成,如果沒有完成則再次調(diào)用 animateProgress(100) ,并在進度加載期間檢查是否有數(shù)據(jù)返回。若存在,則停止前半段動畫,并使用1秒鐘將進度條填充至100%。
下面講解一下如何在請求數(shù)據(jù)的過程中添加監(jiān)聽函數(shù):
import axios from 'axios'; import ProgressBar from './ProgressBar.vue'; const progressBar = new Vue(ProgressBar).$mount(); document.body.appendChild(progressBar.$el);
在這個代碼片段中,使用了 Axios 攔截器來監(jiān)聽請求的過程。在請求開始之前,向頁面添加進度條組件,之后將該組件掛載到頁面中,并且將其元素追加到 HTML 的 <body> 標(biāo)記尾部。
接下來,通過 onDownloadProgress 監(jiān)聽函數(shù)來監(jiān)測下載進度的變化。如果加載完成則移除進度條組件。同時,也可以實現(xiàn)針對使用不同 API 的 ajax 請求設(shè)定不同的進度條,以達到更佳的用戶體驗效果。
axios.interceptors.request.use((config) => {
const progressBar = new Vue(ProgressBar).$mount();
document.body.appendChild(progressBar.$el);
config.onDownloadProgress = (event) => {
if (event.lengthComputable) {
progressBar.progress = parseInt((event.loaded / event.total) * 100, 10);
if (progressBar.progress === 100) {
progressBar.finish();
setTimeout(() => {
document.body.removeChild(progressBar.$el);
}, 500);
}
}
};
return config;
}, (error) => {
return Promise.reject(error);
});參數(shù)注入
為了能夠靈活地調(diào)整接口進度條效果,可以使用參數(shù)注入來控制動畫速度和完成時間的設(shè)定。在 animateProgress 函數(shù)中,使用傳參來設(shè)置百分比范圍和動畫播放速度,從而得到不同進度條和播放時間的效果。
animateProgress(target, duration) {
return new Promise((resolve, reject) => {
let start = this.progress;
const end = target;
const doAnimation = () => {
const elapsed = Date.now() - startTime;
const progress = Math.min(elapsed / duration, 1);
this.progress = start + ((end - start) * progress);
if (progress === 1) {
resolve();
} else if (this.isCompleted) {
resolve();
} else {
requestAnimationFrame(doAnimation);
}
};
const startTime = Date.now();
requestAnimationFrame(doAnimation);
});
}
...
this.animateProgress(90, 1000)
.then(() => {
if (!this.isCompleted) {
this.animateProgress(100, 500);
}
})
...在這個栗子中,將 duration 參數(shù)添加到 animateProgress 函數(shù)內(nèi)部,并使用該參數(shù)來設(shè)置動畫速度和完成時間。在第一個調(diào)用函數(shù)的時候,將異步進度條的播放時間設(shè)為 1000ms,從而得到速度較慢、完成時間較長的進度條效果。在第二個調(diào)用函數(shù)時,將進度條完成時間縮短為 500ms,并獲得由此帶來的更快動畫效果。
總結(jié)
實現(xiàn)一個接口進度條函數(shù)可以提高網(wǎng)站性能和用戶體驗效果,同時也可以讓頁面更加交互性和生動有趣。在栗子中,使用了 Vue 框架來構(gòu)建動畫組件,使用了 Axios 攔截器來監(jiān)聽請求進度,使用了參數(shù)注入來控制動畫速度和完成時間。
到此這篇關(guān)于Vue 實現(xiàn)接口進度條的文章就介紹到這了,更多相關(guān)Vue 接口進度條內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue使用echarts散點圖在區(qū)域內(nèi)標(biāo)點
這篇文章主要為大家詳細介紹了Vue使用echarts散點圖在區(qū)域內(nèi)標(biāo)點,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
Vue和relation-graph庫打造高質(zhì)量的關(guān)系圖應(yīng)用程序
這篇文章主要介紹了Vue和relation-graph庫打造高質(zhì)量的關(guān)系圖應(yīng)用程序,在這篇文章中,我們深入探討了如何使用Vue和relation-graph高效打造關(guān)系圖,我們詳細介紹了數(shù)據(jù)準(zhǔn)備、關(guān)系映射、點擊事件等關(guān)鍵步驟,需要的朋友可以參考下2023-09-09
解決vue打包 npm run build-test突然不動了的問題
這篇文章主要介紹了解決vue打包 npm run build-test突然不動了的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
Vue使用v-viewer插件實現(xiàn)圖片預(yù)覽和縮放和旋轉(zhuǎn)等功能(推薦)
v-viewer是一個基于viewerjs封裝的vue圖片預(yù)覽組件,有預(yù)覽縮放拉伸旋轉(zhuǎn)切換拖拽等功能,支持配置化,這篇文章主要介紹了Vue使用v-viewer插件實現(xiàn)圖片預(yù)覽和縮放和旋轉(zhuǎn)等功能,需要的朋友可以參考下2023-02-02
Vue實現(xiàn)預(yù)覽docx/xlsx/pdf等類型文件功能
這篇文章主要介紹了如何在Vue中實現(xiàn)docx/xlsx/pdf等類型文件預(yù)覽功能,在實現(xiàn)過程中,需要注意文件的格式和轉(zhuǎn)換方式,以及插件和組件的使用方法和注意事項,需要的朋友可以參考下2023-05-05
Vue實例的對象參數(shù)options的幾個常用選項詳解
今天小編就為大家分享一篇Vue實例的對象參數(shù)options的幾個常用選項詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11

