当前位置:首页 > 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中引入样式

vue请求实现进度条

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中添加导航守卫

vue请求实现进度条

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监控下载进度

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 实现公告功能的方法 公告功能通常需要实现滚动展示、自动切换或固定显示的效果。以下是几种常见的实现方式: 使用 marquee 标签实现滚动公告 <template> &l…

vue实现frame

vue实现frame

Vue 中实现 iframe 的方法 在 Vue 中可以通过直接使用 <iframe> 标签或动态绑定 src 属性来实现 iframe 功能。 基本用法 <template&g…

vue实现骰子

vue实现骰子

Vue 实现骰子功能 创建 Vue 组件 在 Vue 项目中创建一个骰子组件,例如 Dice.vue。该组件包含骰子的外观和逻辑。 <template> <div class=…

vue如何实现

vue如何实现

Vue 实现方法 在 Vue 中实现功能通常涉及组件化开发、状态管理和响应式数据绑定。以下是几种常见的实现方式: 组件化开发 使用 Vue 的单文件组件(.vue 文件)结构,将 UI 拆分为可复用…

vue轮播实现

vue轮播实现

Vue 轮播实现方法 使用第三方库(推荐) 安装 swiper 或 vue-awesome-swiper 库,快速实现功能丰富的轮播效果。 以 vue-awesome-swiper 为例: npm…

vue实现评分

vue实现评分

Vue 实现评分功能 使用组件库实现 安装 element-ui 或 ant-design-vue 这类 UI 库,它们已经内置了评分组件。 以 element-ui 为例: <te…