简介
NProgress 是一个轻量级的进度条库,只有 2KB 大小,可以为你的应用添加优雅的页面加载进度条效果。它具有现实的涓流动画,让用户知道页面正在加载,提升用户体验。
特性
- 轻量级,仅 2KB
- 简洁美观的进度条样式
- 高性能,基于 CSS3 动画
- 易于配置和自定义
- 响应式设计,支持移动端
- 零依赖,兼容所有现代浏览器
安装
# npm
npm install nprogress
# yarn
yarn add nprogress
# pnpm
pnpm add nprogress
基础使用
1. 引入样式
// main.js
import { createApp } from "vue";
import App from "./App.vue";
import "nprogress/nprogress.css";
createApp(App).mount("#app");
2. 基本 API 使用
<template>
<h2 class="text-2xl font-bold text-gray-800 mb-6 text-center">
NProgress 进度条演示
</h2>
<div class="flex gap-4">
<button
@click="startProgress"
class="w-full px-6 py-3 bg-blue-600 hover:bg-blue-700 text-white font-medium rounded-lg transform transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-4 focus:ring-blue-200 shadow-lg"
>
开始进度条
</button>
<button
@click="doneProgress"
class="w-full px-6 py-3 bg-green-600 hover:bg-green-700 text-white font-medium rounded-lg transform transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-4 focus:ring-green-200 shadow-lg"
>
完成进度条
</button>
<button
@click="setProgress"
class="w-full px-6 py-3 bg-orange-600 hover:bg-orange-700 text-white font-medium rounded-lg transform transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-4 focus:ring-orange-200 shadow-lg"
>
设置进度50%
</button>
<button
@click="incrementProgress"
class="w-full px-6 py-3 bg-purple-600 hover:bg-purple-700 text-white font-medium rounded-lg transform transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-4 focus:ring-purple-200 shadow-lg"
>
增加进度
</button>
</div>
</template>
<script setup>
import NProgress from "nprogress";
// 开始进度条
const startProgress = () => {
NProgress.start();
};
// 完成进度条
const doneProgress = () => {
NProgress.done();
};
// 设置特定进度
const setProgress = () => {
NProgress.set(0.5); // 设置为50%
};
// 增加进度
const incrementProgress = () => {
NProgress.inc(); // 随机增加一点进度
};
</script>

配置选项
全局配置
// main.js
import NProgress from "nprogress";
// 配置选项
NProgress.configure({
// 动画效果的缓动函数,默认为 'ease'
easing: "ease",
// 动画速度,默认为 200ms
speed: 500,
// 是否显示右上角的加载指示器,默认为 true
showSpinner: false,
// 进度条的最小百分比,默认为 0.08
minimum: 0.1,
// 进度条的父容器,默认为 'body'
parent: "#app",
// 进度条的模板
template:
'<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>',
});
高级使用
路由守卫中使用
// router/index.js
import { createRouter, createWebHistory } from "vue-router";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
// 配置 NProgress
NProgress.configure({
showSpinner: false,
speed: 300,
});
const router = createRouter({
history: createWebHistory(),
routes: [
// 你的路由配置
],
});
// 路由前置守卫
router.beforeEach((to, from, next) => {
NProgress.start();
next();
});
// 路由后置守卫
router.afterEach(() => {
NProgress.done();
});
export default router;
HTTP 请求集成
// utils/request.js
import axios from "axios";
import NProgress from "nprogress";
// 创建 axios 实例
const request = axios.create({
baseURL: "/api",
timeout: 10000,
});
// 请求拦截器
request.interceptors.request.use(
(config) => {
NProgress.start();
return config;
},
(error) => {
NProgress.done();
return Promise.reject(error);
}
);
// 响应拦截器
request.interceptors.response.use(
(response) => {
NProgress.done();
return response;
},
(error) => {
NProgress.done();
return Promise.reject(error);
}
);
export default request;
hooks 封装
// composables/useNProgress.js
import { ref, onBeforeUnmount } from "vue";
import NProgress from "nprogress";
export function useNProgress(options = {}) {
const isLoading = ref(false);
// 配置 NProgress
NProgress.configure({
showSpinner: false,
speed: 300,
...options,
});
const start = () => {
isLoading.value = true;
NProgress.start();
};
const done = () => {
isLoading.value = false;
NProgress.done();
};
const set = (progress) => {
NProgress.set(progress);
};
const inc = (amount) => {
NProgress.inc(amount);
};
// 组件卸载时确保进度条完成
onBeforeUnmount(() => {
if (isLoading.value) {
NProgress.done();
}
});
return {
isLoading,
start,
done,
set,
inc,
};
}
自定义样式
基础样式定制
/* 自定义进度条颜色 */
#nprogress .bar {
background: #29d !important;
height: 3px !important;
}
/* 自定义加载指示器 */
#nprogress .spinner-icon {
border-top-color: #29d !important;
border-left-color: #29d !important;
}
/* 进度条发光效果 */
#nprogress .peg {
box-shadow: 0 0 10px #29d, 0 0 5px #29d !important;
}
/* 隐藏加载指示器 */
#nprogress .spinner {
display: none !important;
}
主题样式
/* 渐变主题 */
.gradient-theme #nprogress .bar {
background: linear-gradient(90deg, #667eea 0%, #764ba2 100%) !important;
}
/* 暗色主题 */
.dark-theme #nprogress .bar {
background: #ffffff !important;
}
/* 彩虹主题 */
.rainbow-theme #nprogress .bar {
background: linear-gradient(
90deg,
#ff0000 0%,
#ff8000 16.66%,
#ffff00 33.33%,
#80ff00 50%,
#00ff80 66.66%,
#0080ff 83.33%,
#8000ff 100%
) !important;
}
常见问题
进度条不显示
确保正确引入了 CSS 文件:
import "nprogress/nprogress.css";
路由切换时进度条卡住
在路由守卫中正确处理:
router.beforeEach((to, from, next) => {
NProgress.start();
next();
});
router.afterEach(() => {
// 使用 nextTick 确保DOM更新完成
nextTick(() => {
NProgress.done();
});
});
最佳实践
- 合理配置延迟: 避免短时间请求频繁显示进度条
- 统一管理: 在应用入口处统一配置和管理
- 样式一致性: 确保进度条样式与应用主题一致
- 性能考虑: 避免过于频繁的进度更新
- 用户体验: 为长时间操作提供更详细的进度信息
总结
NProgress 是一个简单而强大的进度条库,通过合理的配置和使用,可以显著提升应用的用户体验。结合 Vue3 的组合式 API,我们可以创建更加灵活和可复用的进度条解决方案。
原文链接:https://code.ifrontend.net/archives/1311,转载请注明出处。
评论0