Vue怎么实现接口进度条效果

其他教程   发布日期:前天 08:04   浏览次数:103

这篇文章主要介绍“Vue怎么实现接口进度条效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue怎么实现接口进度条效果”文章能帮助大家解决问题。

实现思路

首先定义一个进度条组件来渲染页面展示效果,组件包含进度条背景、进度长度、以及进度数字,同时还要设置数据绑定相关属性,如进度条当前的百分比、动画执行状态、以及完成状态等。在请求数据的过程中,需要添加监听函数来监测数据请求的过程变化,并更新组件相应的属性和界面元素。

代码实现

下面是使用 Vue 实现一个接口进度条的栗子:

  1. <template>
  2. <div class="progress-bar">
  3. <div class="bg"></div>
  4. <div class="bar" :></div>
  5. <div class="label">{{ progress }}%</div>
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. data() {
  11. return {
  12. progress: 0,
  13. isPlaying: false,
  14. isCompleted: false
  15. }
  16. },
  17. mounted() {
  18. this.start();
  19. },
  20. methods: {
  21. start() {
  22. this.isPlaying = true;
  23. this.animateProgress(90)
  24. .then(() => {
  25. if (!this.isCompleted) {
  26. this.animateProgress(100);
  27. }
  28. })
  29. .catch((error) => {
  30. console.error('Progress error', error);
  31. });
  32. },
  33. animateProgress(target) {
  34. return new Promise((resolve, reject) => {
  35. let start = this.progress;
  36. const end = target;
  37. const duration = (target - start) * 150;
  38. const doAnimation = () => {
  39. const elapsed = Date.now() - startTime;
  40. const progress = Math.min(elapsed / duration, 1);
  41. this.progress = start + ((end - start) * progress);
  42. if (progress === 1) {
  43. resolve();
  44. } else if (this.isCompleted) {
  45. resolve();
  46. } else {
  47. requestAnimationFrame(doAnimation);
  48. }
  49. };
  50. const startTime = Date.now();
  51. requestAnimationFrame(doAnimation);
  52. });
  53. },
  54. finish() {
  55. this.isCompleted = true;
  56. this.progress = 100;
  57. }
  58. }
  59. };
  60. </script>
  61. <style scoped>
  62. .progress-bar {
  63. position: relative;
  64. height: 8px;
  65. margin: 10px 0;
  66. }
  67. .bg {
  68. position: absolute;
  69. top: 0;
  70. left: 0;
  71. width: 100%;
  72. height: 100%;
  73. background-color: #ccc;
  74. border-radius: 5px;
  75. }
  76. .bar {
  77. position: absolute;
  78. top: 0;
  79. left: 0;
  80. height: 100%;
  81. border-radius: 5px;
  82. background-color: #409eff;
  83. transition: width 0.5s;
  84. }
  85. .label {
  86. position: absolute;
  87. top: -20px;
  88. left: calc(100% + 5px);
  89. color: #333;
  90. font-size: 12px;
  91. }
  92. </style>

首先定义了三个数据属性用于控制动画的播放和完成状态,分别是进度条当前比例

  1. progress
、动画播放状态
  1. isPlaying
、动画完成状态
  1. isCompleted
。在组件初始化的过程中,调用了
  1. start
方法来启动进度条动画效果。在该方法内部,使用 Promise 来从 0% 到 90% 的百分比向相应位置移动,并在到达该位置时停止。

判断当前是否完成,如果没有完成则再次调用

  1. animateProgress(100)
,并在进度加载期间检查是否有数据返回。若存在,则停止前半段动画,并使用1秒钟将进度条填充至100%。

下面讲解一下如何在请求数据的过程中添加监听函数:

  1. import axios from 'axios';
  2. import ProgressBar from './ProgressBar.vue';
  3. const progressBar = new Vue(ProgressBar).$mount();
  4. document.body.appendChild(progressBar.$el);

在这个代码片段中,使用了 Axios 拦截器来监听请求的过程。在请求开始之前,向页面添加进度条组件,之后将该组件挂载到页面中,并且将其元素追加到 HTML 的

  1. <body>
标记尾部。

接下来,通过

  1. onDownloadProgress
监听函数来监测下载进度的变化。如果加载完成则移除进度条组件。同时,也可以实现针对使用不同 API 的 ajax 请求设定不同的进度条,以达到更佳的用户体验效果。
  1. axios.interceptors.request.use((config) => {
  2. const progressBar = new Vue(ProgressBar).$mount();
  3. document.body.appendChild(progressBar.$el);
  4. config.onDownloadProgress = (event) => {
  5. if (event.lengthComputable) {
  6. progressBar.progress = parseInt((event.loaded / event.total) * 100, 10);
  7. if (progressBar.progress === 100) {
  8. progressBar.finish();
  9. setTimeout(() => {
  10. document.body.removeChild(progressBar.$el);
  11. }, 500);
  12. }
  13. }
  14. };
  15. return config;
  16. }, (error) => {
  17. return Promise.reject(error);
  18. });

参数注入

为了能够灵活地调整接口进度条效果,可以使用参数注入来控制动画速度和完成时间的设定。在

  1. animateProgress
函数中,使用传参来设置百分比范围和动画播放速度,从而得到不同进度条和播放时间的效果。
  1. animateProgress(target, duration) {
  2. return new Promise((resolve, reject) => {
  3. let start = this.progress;
  4. const end = target;
  5. const doAnimation = () => {
  6. const elapsed = Date.now() - startTime;
  7. const progress = Math.min(elapsed / duration, 1);
  8. this.progress = start + ((end - start) * progress);
  9. if (progress === 1) {
  10. resolve();
  11. } else if (this.isCompleted) {
  12. resolve();
  13. } else {
  14. requestAnimationFrame(doAnimation);
  15. }
  16. };
  17. const startTime = Date.now();
  18. requestAnimationFrame(doAnimation);
  19. });
  20. }
  21. ...
  22. this.animateProgress(90, 1000)
  23. .then(() => {
  24. if (!this.isCompleted) {
  25. this.animateProgress(100, 500);
  26. }
  27. })
  28. ...

在这个栗子中,将

  1. duration
参数添加到
  1. animateProgress
函数内部,并使用该参数来设置动画速度和完成时间。在第一个调用函数的时候,将异步进度条的播放时间设为 1000ms,从而得到速度较慢、完成时间较长的进度条效果。在第二个调用函数时,将进度条完成时间缩短为 500ms,并获得由此带来的更快动画效果。

以上就是Vue怎么实现接口进度条效果的详细内容,更多关于Vue怎么实现接口进度条效果的资料请关注九品源码其它相关文章!