中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Vue怎么實現接口進度條效果

發布時間:2023-04-25 16:41:12 來源:億速云 閱讀:186 作者:iii 欄目:開發技術

這篇文章主要介紹“Vue怎么實現接口進度條效果”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Vue怎么實現接口進度條效果”文章能幫助大家解決問題。

實現思路

首先定義一個進度條組件來渲染頁面展示效果,組件包含進度條背景、進度長度、以及進度數字,同時還要設置數據綁定相關屬性,如進度條當前的百分比、動畫執行狀態、以及完成狀態等。在請求數據的過程中,需要添加監聽函數來監測數據請求的過程變化,并更新組件相應的屬性和界面元素。

代碼實現

下面是使用 Vue 實現一個接口進度條的栗子:

<template>
    <div class="progress-bar">
        <div class="bg"></div>
        <div class="bar" :></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>

首先定義了三個數據屬性用于控制動畫的播放和完成狀態,分別是進度條當前比例 progress、動畫播放狀態 isPlaying、動畫完成狀態 isCompleted。在組件初始化的過程中,調用了 start 方法來啟動進度條動畫效果。在該方法內部,使用 Promise 來從 0% 到 90% 的百分比向相應位置移動,并在到達該位置時停止。

判斷當前是否完成,如果沒有完成則再次調用 animateProgress(100) ,并在進度加載期間檢查是否有數據返回。若存在,則停止前半段動畫,并使用1秒鐘將進度條填充至100%。

下面講解一下如何在請求數據的過程中添加監聽函數:

import axios from 'axios';
import ProgressBar from './ProgressBar.vue';

const progressBar = new Vue(ProgressBar).$mount();
document.body.appendChild(progressBar.$el);

在這個代碼片段中,使用了 Axios 攔截器來監聽請求的過程。在請求開始之前,向頁面添加進度條組件,之后將該組件掛載到頁面中,并且將其元素追加到 HTML 的 <body> 標記尾部。

接下來,通過 onDownloadProgress 監聽函數來監測下載進度的變化。如果加載完成則移除進度條組件。同時,也可以實現針對使用不同 API 的 ajax 請求設定不同的進度條,以達到更佳的用戶體驗效果。

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);
});

參數注入

為了能夠靈活地調整接口進度條效果,可以使用參數注入來控制動畫速度和完成時間的設定。在 animateProgress 函數中,使用傳參來設置百分比范圍和動畫播放速度,從而得到不同進度條和播放時間的效果。

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 參數添加到 animateProgress 函數內部,并使用該參數來設置動畫速度和完成時間。在第一個調用函數的時候,將異步進度條的播放時間設為 1000ms,從而得到速度較慢、完成時間較長的進度條效果。在第二個調用函數時,將進度條完成時間縮短為 500ms,并獲得由此帶來的更快動畫效果。

關于“Vue怎么實現接口進度條效果”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

vue
AI

乌拉特后旗| 综艺| 北辰区| 郸城县| 胶州市| 汤阴县| 烟台市| 霸州市| 石嘴山市| 永善县| 偃师市| 健康| 湖州市| 古浪县| 嘉荫县| 西昌市| 杭锦后旗| 台南县| 定襄县| 淅川县| 寻甸| 阿勒泰市| 崇明县| 邵武市| 卫辉市| 济阳县| 桑植县| 乐平市| 敖汉旗| 法库县| 四平市| 阿克陶县| 措勤县| 凌云县| 来宾市| 龙井市| 老河口市| 泊头市| 临沭县| 和静县| 济南市|