vue实现加载条
Vue 实现加载条的方法
使用第三方库(如 NProgress)
安装 NProgress 库:
npm install nprogress
在 Vue 项目中引入并使用:
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
// 在路由跳转时显示加载条
router.beforeEach((to, from, next) => {
NProgress.start()
next()
})
router.afterEach(() => {
NProgress.done()
})
自定义加载条组件
创建一个 LoadingBar 组件:
<template>
<div class="loading-bar" :style="{ width: progress + '%' }"></div>
</template>
<script>
export default {
data() {
return {
progress: 0
}
},
methods: {
start() {
this.progress = 0
this.simulateProgress()
},
simulateProgress() {
const interval = setInterval(() => {
if (this.progress >= 100) {
clearInterval(interval)
return
}
this.progress += 10
}, 300)
},
finish() {
this.progress = 100
}
}
}
</script>
<style>
.loading-bar {
height: 3px;
background-color: #42b983;
position: fixed;
top: 0;
left: 0;
transition: width 0.3s;
z-index: 9999;
}
</style>
在全局使用自定义加载条
在 main.js 中注册为全局组件:
import LoadingBar from './components/LoadingBar.vue'
Vue.component('loading-bar', LoadingBar)
// 创建事件总线
const eventBus = new Vue()
Vue.prototype.$eventBus = eventBus
在需要的地方触发加载:
// 开始加载
this.$eventBus.$emit('start-loading')
// 结束加载
this.$eventBus.$emit('finish-loading')
结合 Axios 拦截器实现请求加载条
在 axios 拦截器中添加加载逻辑:
import axios from 'axios'
let requestsCount = 0
axios.interceptors.request.use(config => {
requestsCount++
if (requestsCount === 1) {
this.$eventBus.$emit('start-loading')
}
return config
})
axios.interceptors.response.use(response => {
requestsCount--
if (requestsCount === 0) {
this.$eventBus.$emit('finish-loading')
}
return response
}, error => {
requestsCount--
if (requestsCount === 0) {
this.$eventBus.$emit('finish-loading')
}
return Promise.reject(error)
})
使用 Vue 过渡效果增强体验
为加载条添加平滑过渡效果:

.loading-bar-enter-active, .loading-bar-leave-active {
transition: opacity 0.5s;
}
.loading-bar-enter, .loading-bar-leave-to {
opacity: 0;
}
这些方法提供了从简单到复杂的多种实现方式,可以根据项目需求选择合适的方案。第三方库方案适合快速集成,自定义组件方案则提供更多灵活性。






