当前位置:首页 > VUE

vue请求实现进度条

2026-03-06 21:09:09VUE

使用axios拦截器实现请求进度条

在Vue项目中安装axios依赖

npm install axios

创建axios实例并添加请求/响应拦截器

import axios from 'axios'

const instance = axios.create({
  baseURL: 'https://api.example.com'
})

// 请求拦截器
instance.interceptors.request.use(config => {
  // 开始请求时显示进度条
  NProgress.start()
  return config
})

// 响应拦截器
instance.interceptors.response.use(response => {
  // 请求完成时隐藏进度条
  NProgress.done()
  return response
}, error => {
  // 请求出错时也隐藏进度条
  NProgress.done()
  return Promise.reject(error)
})

export default instance

使用NProgress库显示进度条

安装NProgress

npm install nprogress

在main.js中引入样式

import 'nprogress/nprogress.css'

配置NProgress外观

import NProgress from 'nprogress'

NProgress.configure({
  minimum: 0.1,
  easing: 'ease',
  speed: 500,
  trickleRate: 0.02,
  trickleSpeed: 200,
  showSpinner: false
})

结合Vue Router实现路由切换进度条

在router.js中添加导航守卫

import NProgress from 'nprogress'

router.beforeEach((to, from, next) => {
  NProgress.start()
  next()
})

router.afterEach(() => {
  NProgress.done()
})

使用Element UI的Loading组件实现局部进度

在组件中使用局部加载

methods: {
  async fetchData() {
    const loading = this.$loading({
      lock: true,
      text: '加载中...',
      spinner: 'el-icon-loading',
      background: 'rgba(0, 0, 0, 0.7)'
    })

    try {
      const res = await axios.get('/api/data')
      // 处理数据
    } finally {
      loading.close()
    }
  }
}

自定义进度条组件实现

创建自定义进度条组件

<template>
  <div class="progress-container" v-if="visible">
    <div class="progress-bar" :style="{ width: progress + '%' }"></div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      visible: false,
      progress: 0
    }
  },
  methods: {
    start() {
      this.visible = true
      this.progress = 0
      this.simulateProgress()
    },
    simulateProgress() {
      const interval = setInterval(() => {
        this.progress += Math.random() * 10
        if (this.progress >= 100) {
          clearInterval(interval)
          setTimeout(() => {
            this.visible = false
          }, 300)
        }
      }, 300)
    }
  }
}
</script>

<style scoped>
.progress-container {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 3px;
  background-color: #f0f0f0;
  z-index: 9999;
}
.progress-bar {
  height: 100%;
  background-color: #409eff;
  transition: width 0.3s ease;
}
</style>

使用Fetch API实现原生进度监控

利用Fetch API的ReadableStream监控下载进度

vue请求实现进度条

async function fetchWithProgress(url, options = {}) {
  const response = await fetch(url, options)

  if (!response.ok) throw new Error(response.statusText)
  if (!response.body) return response.json()

  const contentLength = +response.headers.get('Content-Length')
  const reader = response.body.getReader()
  const chunks = []
  let receivedLength = 0

  while(true) {
    const { done, value } = await reader.read()

    if (done) break

    chunks.push(value)
    receivedLength += value.length

    if (contentLength) {
      const percent = Math.round((receivedLength / contentLength) * 100)
      console.log(`下载进度: ${percent}%`)
      // 更新UI进度条
    }
  }

  const chunksAll = new Uint8Array(receivedLength)
  let position = 0
  for (const chunk of chunks) {
    chunksAll.set(chunk, position)
    position += chunk.length
  }

  return new TextDecoder('utf-8').decode(chunksAll)
}

标签: 进度条vue
分享给朋友:

相关文章

vue 实现打印

vue 实现打印

Vue 实现打印功能的方法 在Vue项目中实现打印功能,可以通过以下几种方式实现: 使用window.print()方法 通过调用浏览器的原生打印API实现基础打印功能,适用于简单内容打印。 //…

vue登录实现

vue登录实现

Vue 登录实现 实现登录功能通常需要前端与后端配合,Vue 作为前端框架,主要负责表单处理、请求发送和状态管理。以下是常见的实现方式: 表单设计与数据绑定 使用 Vue 的 v-model 实现表…

vue实现幻灯

vue实现幻灯

Vue实现幻灯片的基础方法 使用Vue实现幻灯片功能可以通过多种方式完成,以下是几种常见方案: 方案一:基于Vue的过渡动画 通过Vue的<transition>或<transit…

vue 实现穿透

vue 实现穿透

Vue 样式穿透的实现方法 在 Vue 中,样式穿透通常指在带有 scoped 属性的样式块中,强制影响子组件的样式。以下是几种常见的实现方式: 使用 >>> 或 /deep/ 选…

vue实现slidedown

vue实现slidedown

Vue 实现 SlideDown 动画效果 在 Vue 中实现 SlideDown 效果可以通过 CSS 过渡或动画结合 Vue 的过渡系统完成。以下是几种常见方法: 使用 Vue Transiti…

vue实现settimeout

vue实现settimeout

在 Vue 中实现 setTimeout Vue 中可以通过 JavaScript 原生的 setTimeout 方法实现延时操作,但需要注意结合 Vue 的响应式特性和生命周期管理。以下是几种常见实…