從入門到精通詳解Vue3如何集成NProgress進度條
在前端應(yīng)用開發(fā)中,用戶體驗至關(guān)重要。當(dāng)頁面加載或進行數(shù)據(jù)請求時,一個優(yōu)雅的進度條不僅能告知用戶系統(tǒng)正在工作,還能有效緩解用戶的等待焦慮。NProgress 作為一款輕量級的進度條庫,憑借其簡潔的設(shè)計和良好的兼容性,被廣泛應(yīng)用于各類 Web 項目中。本文將詳細(xì)介紹如何在 Vue3 項目中優(yōu)雅地集成和使用 NProgress。
一、環(huán)境準(zhǔn)備
1.1 安裝依賴
# 安裝 NProgress 核心庫和 lodash-es 工具庫 pnpm i nprogress lodash-es # 安裝 TypeScript 類型定義(開發(fā)依賴) pnpm i @types/nprogress @types/lodash-es -D
1.2 依賴說明
- nprogress:進度條核心庫,提供簡單的進度控制 API
- lodash-es:高效的 JavaScript 工具庫,用于對象合并等操作
- @types/nprogress:NProgress 的 TypeScript 類型定義文件
- @types/lodash-es:lodash-es 的 TypeScript 類型定義文件
1.3 環(huán)境變量配置
在 .env 文件中配置進度條的開關(guān):
# 路由進度條,默認(rèn)開啟(設(shè)置為 'false' 可關(guān)閉) VITE_ROUTER_NPROGRESS = true # 請求進度條,默認(rèn)開啟(設(shè)置為 'false' 可關(guān)閉) VITE_REQUEST_NPROGRESS = true
二、核心實現(xiàn)
2.1 基礎(chǔ)封裝
// src/hooks/useProgress.ts
import { merge } from 'lodash-es'
import NProgress from 'nprogress'
import type { NProgressOptions } from 'nprogress'
interface ProgressConfig extends NProgressOptions {
/** 是否顯示進度條 */
show: boolean
}
const DEFAULT_CONFIG: Partial<ProgressConfig> = {
/** CSS3 緩沖動畫字符串,支持 ease、linear、ease-in、ease-out、ease-in-out 以及自定義 cubic-bezier 等 */
easing: 'ease',
/** 指定進度條的父容器,默認(rèn)為 body */
parent: 'body',
/** 是否顯示進度條,可通過環(huán)境變量控制 */
show: true,
/** 是否顯示右側(cè)的環(huán)形進度動畫 */
showSpinner: false,
/** 是否開啟自動遞增模式 */
trickle: true,
/** 設(shè)置開始時最低百分比,范圍 0-1 */
minimum: 0.08,
/** 動畫速度,單位毫秒 */
speed: 200,
}
/**
* 進度條控制工具 Hook
* @param config 自定義配置,會與默認(rèn)配置深度合并
* @returns { start, done } 啟動/結(jié)束進度條方法
*/
export function useProgress(config: Partial<ProgressConfig> = {}) {
const mergeConfig = merge({}, DEFAULT_CONFIG, config)
NProgress.configure(mergeConfig)
/**
* 啟動進度條
*/
function start() {
if (!mergeConfig.show) return
NProgress.start()
}
/**
* 結(jié)束進度條
*/
function done() {
if (!mergeConfig.show || !NProgress.isStarted()) return
NProgress.done()
}
return { start, done }
}三、實際應(yīng)用場景
3.1 Axios 請求攔截器集成
在實際項目中,我們通常需要為 API 請求自動添加進度條。以下是配合 Axios 使用的完整示例,通過環(huán)境變量控制是否顯示:
// src/utils/request.ts
import axios, { AxiosInstance, AxiosResponse, InternalAxiosRequestConfig } from 'axios'
const NProgress = useProgress({ show: import.meta.env.VITE_REQUEST_NPROGRESS !== 'false' })
const instance: AxiosInstance = axios.create({
baseURL: import.meta.env.VITE_API_BASE_URL,
timeout: 15000,
})
// 請求攔截器
instance.interceptors.request.use(
(config: InternalAxiosRequestConfig) => {
NProgress.start()
return config
},
(error) => {
NProgress.done()
return Promise.reject(error)
},
)
// 響應(yīng)攔截器
instance.interceptors.response.use(
(response: AxiosResponse) => {
NProgress.done()
return response
},
(error) => {
NProgress.done()
return Promise.reject(error)
},
)
export const request = instance
3.2 Vue Router 路由守衛(wèi)集成
結(jié)合 Vue Router,可以在頁面切換時顯示進度條,通過環(huán)境變量控制是否顯示:
// src/router/index.ts
import { createRouter, createWebHistory } from 'vue-router'
const router = createRouter({
history: createWebHistory(),
routes: [],
})
const NProgress = useProgress({ show: import.meta.env.VITE_ROUTER_NPROGRESS !== 'false' })
router.beforeEach((to, from, next) => {
NProgress.start()
next()
})
router.afterEach(() => {
NProgress.done()
})
export default router
3.3 組合式使用示例
<template>
<div class="app">
<button @click="loadData">加載數(shù)據(jù)</button>
</div>
</template>
<script setup lang="ts">
import { useProgress } from '@/hooks/useProgress'
const NProgress = useProgress({ show: import.meta.env.VITE_REQUEST_NPROGRESS !== 'false' })
async function loadData() {
NProgress.start()
try {
await fetch('/api/data')
} finally {
NProgress.done()
}
}
</script>四、全局樣式配置
4.1 全局樣式入口文件
創(chuàng)建全局樣式入口文件,統(tǒng)一管理項目樣式:
// src/styles/index.scss
@use './variables.scss';
@use './transition.scss';
@use 'nprogress/nprogress.css';
@use './element-plus/el-table.scss';
@use './element-plus/el-dialog.scss';
@use './element-plus/el-dropdown.scss';
body {
font-family: var(--el-font-family);
background-color: var(--el-bg-color-page);
}
#nprogress .bar {
background-color: var(--el-color-primary);
}4.2 樣式文件說明
- variables.scss:Element Plus 主題變量定義
- transition.scss:全局過渡動畫樣式
- nprogress.css:NProgress 進度條基礎(chǔ)樣式
- element-plus/*.scss:Element Plus 組件樣式覆蓋
- 全局樣式:包含進度條顏色等自定義樣式
4.3 NProgress 主題樣式覆蓋
如果需要更詳細(xì)的自定義 NProgress 樣式,可以創(chuàng)建專門的樣式文件:
// src/styles/nprogress.scss
#nprogress .bar {
background-color: var(--el-color-primary);
height: 3px;
// 添加漸變效果
background: linear-gradient(90deg, var(--el-color-primary-light-3) 0%, var(--el-color-primary) 100%);
}
#nprogress .peg {
box-shadow: 0 0 10px var(--el-color-primary);
}
#nprogress .spinner-icon {
border-top-color: var(--el-color-primary);
border-left-color: var(--el-color-primary);
}4.4 在入口文件中引入
// src/styles/index.scss
@use './variables.scss';
@use './transition.scss';
@use './nprogress.scss'; // 替換為自定義樣式文件
@use './element-plus/el-table.scss';
@use './element-plus/el-dialog.scss';
@use './element-plus/el-dropdown.scss';
body {
font-family: var(--el-font-family);
background-color: var(--el-bg-color-page);
}
#nprogress .bar {
background-color: var(--el-color-primary);
}4.5 main.ts 中引入全局樣式
// src/main.ts
import { createApp } from 'vue'
import App from './App.vue'
import './styles/index.scss' // 引入全局樣式
const app = createApp(App)
app.mount('#app')五、NProgress 配置詳解
5.1 核心配置項
| 配置項 | 類型 | 默認(rèn)值 | 說明 |
|---|---|---|---|
| easing | string | 'ease' | CSS3 緩動函數(shù) |
| speed | number | 200 | 動畫速度(毫秒) |
| trickle | boolean | true | 是否自動遞增 |
| trickleSpeed | number | 200 | 自動遞增速度 |
| minimum | number | 0.08 | 起始百分比 |
| showSpinner | boolean | false | 是否顯示環(huán)形動畫 |
| showUI | boolean | false | 是否顯示進度條 |
| parent | string | 'body' | 父容器選擇器 |
| positionUsing | string | '' | 定位方式 |
5.2 緩動函數(shù)推薦
const EASING_FUNCTIONS = {
// 勻速運動
linear: 'linear',
// 標(biāo)準(zhǔn)緩動
ease: 'ease',
easeIn: 'ease-in',
easeOut: 'ease-out',
easeInOut: 'ease-in-out',
// 自定義貝塞爾曲線
smooth: 'cubic-bezier(0.4, 0, 0.2, 1)',
gentle: 'cubic-bezier(0.25, 0.1, 0.25, 1)',
swift: 'cubic-bezier(0.4, 0, 0.6, 1)',
}
五、總結(jié)
通過本文的學(xué)習(xí),你應(yīng)該已經(jīng)掌握了:
- 基礎(chǔ)集成:如何在 Vue3 項目中安裝和配置 NProgress
- 封裝技巧:如何封裝通用的進度條 Hook,提高代碼復(fù)用性
- 環(huán)境變量控制:如何通過環(huán)境變量靈活控制進度條的開關(guān)
- 實際應(yīng)用:如何與 Axios、Vue Router 等常見庫配合使用
- 全局樣式配置:如何通過全局樣式統(tǒng)一管理進度條外觀
到此這篇關(guān)于從入門到精通詳解Vue3如何集成NProgress進度條的文章就介紹到這了,更多相關(guān)Vue3集成NProgress進度條內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vuex新手進階篇之改變state?mutations的使用
在vue的項目中不可避免的會使用到vuex用于數(shù)據(jù)的存儲,下面這篇文章主要給大家介紹了關(guān)于vuex新手進階篇之改變state?mutations的使用,文中通過圖文以及實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10
Vue使用pdfobject實現(xiàn)預(yù)覽pdf的示例詳解
PDFObject?是一個?JavaScript?庫用來在HTML中動態(tài)嵌入?PDF?文檔。這篇文章主要為大家詳細(xì)介紹了使用pdfobject實現(xiàn)預(yù)覽pdf的功能,需要的可以了解一下2023-03-03
vue前端HbuliderEslint實時校驗自動修復(fù)設(shè)置
這篇文章主要為大家介紹了vue前端中Hbulider中Eslint實時校驗自動修復(fù)設(shè)置操作過程,有需要的朋友可以借鑒參考下希望能夠有所幫助2021-10-10
vue2如何使用vue-i18n搭建多語言切換環(huán)境
這篇文章主要介紹了vue2-使用vue-i18n搭建多語言切換環(huán)境的相關(guān)知識,在data(){}中獲取的變量存在更新this.$i18n.locale的值時無法自動切換的問題,需要刷新頁面才能切換語言,感興趣的朋友一起看看吧2023-12-12
vue前端如何將任意文件轉(zhuǎn)為base64傳給后端
這篇文章主要介紹了vue前端如何將任意文件轉(zhuǎn)為base64傳給后端問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03

