最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

從入門到精通詳解Vue3如何集成NProgress進(jìn)度條

 更新時(shí)間:2026年04月24日 08:47:00   作者:當(dāng)時(shí)只道尋常  
NProgress?作為一款輕量級(jí)的進(jìn)度條庫(kù),憑借其簡(jiǎn)潔的設(shè)計(jì)和良好的兼容性,被廣泛應(yīng)用于各類?Web?項(xiàng)目中,本文將詳細(xì)介紹如何在?Vue3?項(xiàng)目中優(yōu)雅地集成和使用?NProgress,希望對(duì)大家有所幫助

在前端應(yīng)用開(kāi)發(fā)中,用戶體驗(yàn)至關(guān)重要。當(dāng)頁(yè)面加載或進(jìn)行數(shù)據(jù)請(qǐng)求時(shí),一個(gè)優(yōu)雅的進(jìn)度條不僅能告知用戶系統(tǒng)正在工作,還能有效緩解用戶的等待焦慮。NProgress 作為一款輕量級(jí)的進(jìn)度條庫(kù),憑借其簡(jiǎn)潔的設(shè)計(jì)和良好的兼容性,被廣泛應(yīng)用于各類 Web 項(xiàng)目中。本文將詳細(xì)介紹如何在 Vue3 項(xiàng)目中優(yōu)雅地集成和使用 NProgress。

一、環(huán)境準(zhǔn)備

1.1 安裝依賴

# 安裝 NProgress 核心庫(kù)和 lodash-es 工具庫(kù)
pnpm i nprogress lodash-es
# 安裝 TypeScript 類型定義(開(kāi)發(fā)依賴)
pnpm i @types/nprogress @types/lodash-es -D

1.2 依賴說(shuō)明

  • nprogress:進(jìn)度條核心庫(kù),提供簡(jiǎn)單的進(jìn)度控制 API
  • lodash-es:高效的 JavaScript 工具庫(kù),用于對(duì)象合并等操作
  • @types/nprogress:NProgress 的 TypeScript 類型定義文件
  • @types/lodash-es:lodash-es 的 TypeScript 類型定義文件

1.3 環(huán)境變量配置

.env 文件中配置進(jìn)度條的開(kāi)關(guān):

# 路由進(jìn)度條,默認(rèn)開(kāi)啟(設(shè)置為 'false' 可關(guān)閉)
VITE_ROUTER_NPROGRESS = true
# 請(qǐng)求進(jìn)度條,默認(rèn)開(kāi)啟(設(shè)置為 'false' 可關(guān)閉)
VITE_REQUEST_NPROGRESS = true

二、核心實(shí)現(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 {
  /** 是否顯示進(jìn)度條 */
  show: boolean
}
const DEFAULT_CONFIG: Partial<ProgressConfig> = {
  /** CSS3 緩沖動(dòng)畫(huà)字符串,支持 ease、linear、ease-in、ease-out、ease-in-out 以及自定義 cubic-bezier 等 */
  easing: 'ease',
  /** 指定進(jìn)度條的父容器,默認(rèn)為 body */
  parent: 'body',
  /** 是否顯示進(jìn)度條,可通過(guò)環(huán)境變量控制 */
  show: true,
  /** 是否顯示右側(cè)的環(huán)形進(jìn)度動(dòng)畫(huà) */
  showSpinner: false,
  /** 是否開(kāi)啟自動(dòng)遞增模式 */
  trickle: true,
  /** 設(shè)置開(kāi)始時(shí)最低百分比,范圍 0-1 */
  minimum: 0.08,
  /** 動(dòng)畫(huà)速度,單位毫秒 */
  speed: 200,
}
/**
 * 進(jìn)度條控制工具 Hook
 * @param config 自定義配置,會(huì)與默認(rèn)配置深度合并
 * @returns { start, done } 啟動(dòng)/結(jié)束進(jìn)度條方法
 */
export function useProgress(config: Partial<ProgressConfig> = {}) {
  const mergeConfig = merge({}, DEFAULT_CONFIG, config)
  NProgress.configure(mergeConfig)
  /**
   * 啟動(dòng)進(jìn)度條
   */
  function start() {
    if (!mergeConfig.show) return
    NProgress.start()
  }
  /**
   * 結(jié)束進(jìn)度條
   */
  function done() {
    if (!mergeConfig.show || !NProgress.isStarted()) return
    NProgress.done()
  }
  return { start, done }
}

三、實(shí)際應(yīng)用場(chǎng)景

3.1 Axios 請(qǐng)求攔截器集成

在實(shí)際項(xiàng)目中,我們通常需要為 API 請(qǐng)求自動(dòng)添加進(jìn)度條。以下是配合 Axios 使用的完整示例,通過(guò)環(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,
})

// 請(qǐng)求攔截器
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,可以在頁(yè)面切換時(shí)顯示進(jìn)度條,通過(guò)環(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)一管理項(xià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 樣式文件說(shuō)明

  • variables.scss:Element Plus 主題變量定義
  • transition.scss:全局過(guò)渡動(dòng)畫(huà)樣式
  • nprogress.css:NProgress 進(jìn)度條基礎(chǔ)樣式
  • element-plus/*.scss:Element Plus 組件樣式覆蓋
  • 全局樣式:包含進(jìn)度條顏色等自定義樣式

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 核心配置項(xiàng)

配置項(xiàng)類型默認(rèn)值說(shuō)明
easingstring'ease'CSS3 緩動(dòng)函數(shù)
speednumber200動(dòng)畫(huà)速度(毫秒)
tricklebooleantrue是否自動(dòng)遞增
trickleSpeednumber200自動(dòng)遞增速度
minimumnumber0.08起始百分比
showSpinnerbooleanfalse是否顯示環(huán)形動(dòng)畫(huà)
showUIbooleanfalse是否顯示進(jìn)度條
parentstring'body'父容器選擇器
positionUsingstring''定位方式

5.2 緩動(dòng)函數(shù)推薦

const EASING_FUNCTIONS = {
  // 勻速運(yùn)動(dòng)
  linear: 'linear',

  // 標(biāo)準(zhǔn)緩動(dòng)
  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é)

通過(guò)本文的學(xué)習(xí),你應(yīng)該已經(jīng)掌握了:

  1. 基礎(chǔ)集成:如何在 Vue3 項(xiàng)目中安裝和配置 NProgress
  2. 封裝技巧:如何封裝通用的進(jìn)度條 Hook,提高代碼復(fù)用性
  3. 環(huán)境變量控制:如何通過(guò)環(huán)境變量靈活控制進(jìn)度條的開(kāi)關(guān)
  4. 實(shí)際應(yīng)用:如何與 Axios、Vue Router 等常見(jiàn)庫(kù)配合使用
  5. 全局樣式配置:如何通過(guò)全局樣式統(tǒng)一管理進(jìn)度條外觀

到此這篇關(guān)于從入門到精通詳解Vue3如何集成NProgress進(jìn)度條的文章就介紹到這了,更多相關(guān)Vue3集成NProgress進(jìn)度條內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Vue3框架的搭建及工程目錄

    詳解Vue3框架的搭建及工程目錄

    文章介紹了如何使用Node.js搭建Vue工程,并對(duì)Vue工程目錄進(jìn)行了詳細(xì)解讀,包括各種文件夾和文件的作用,此外,還講解了如何設(shè)置網(wǎng)頁(yè)標(biāo)題和全局樣式,以及如何配置路由,感興趣的朋友一起看看吧
    2025-03-03
  • vuex新手進(jìn)階篇之改變state?mutations的使用

    vuex新手進(jìn)階篇之改變state?mutations的使用

    在vue的項(xiàng)目中不可避免的會(huì)使用到vuex用于數(shù)據(jù)的存儲(chǔ),下面這篇文章主要給大家介紹了關(guān)于vuex新手進(jìn)階篇之改變state?mutations的使用,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • Vue項(xiàng)目移動(dòng)端滾動(dòng)穿透問(wèn)題的實(shí)現(xiàn)

    Vue項(xiàng)目移動(dòng)端滾動(dòng)穿透問(wèn)題的實(shí)現(xiàn)

    這篇文章主要介紹了Vue項(xiàng)目移動(dòng)端滾動(dòng)穿透問(wèn)題的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 淺談validator自定義驗(yàn)證及易錯(cuò)點(diǎn)

    淺談validator自定義驗(yàn)證及易錯(cuò)點(diǎn)

    這篇文章主要介紹了validator自定義驗(yàn)證及易錯(cuò)點(diǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • vue3集成electron的過(guò)程

    vue3集成electron的過(guò)程

    本文詳細(xì)介紹了如何在Vue3項(xiàng)目中集成Electron,包括安裝electron和electron-builder兩個(gè)依賴,以及配置.npmrc文件和手動(dòng)修改鏡像源的方法,整個(gè)過(guò)程詳細(xì)記錄了從創(chuàng)建項(xiàng)目、安裝依賴、修改配置、到最終打包部署的每一步
    2024-10-10
  • Vue使用pdfobject實(shí)現(xiàn)預(yù)覽pdf的示例詳解

    Vue使用pdfobject實(shí)現(xiàn)預(yù)覽pdf的示例詳解

    PDFObject?是一個(gè)?JavaScript?庫(kù)用來(lái)在HTML中動(dòng)態(tài)嵌入?PDF?文檔。這篇文章主要為大家詳細(xì)介紹了使用pdfobject實(shí)現(xiàn)預(yù)覽pdf的功能,需要的可以了解一下
    2023-03-03
  • vue前端HbuliderEslint實(shí)時(shí)校驗(yàn)自動(dòng)修復(fù)設(shè)置

    vue前端HbuliderEslint實(shí)時(shí)校驗(yàn)自動(dòng)修復(fù)設(shè)置

    這篇文章主要為大家介紹了vue前端中Hbulider中Eslint實(shí)時(shí)校驗(yàn)自動(dòng)修復(fù)設(shè)置操作過(guò)程,有需要的朋友可以借鑒參考下希望能夠有所幫助
    2021-10-10
  • vue中使用sessionStorage記住密碼功能

    vue中使用sessionStorage記住密碼功能

    sessionStorage不是一種持久化的本地存儲(chǔ),僅僅是會(huì)話級(jí)別的存儲(chǔ)。這篇文章主要介紹了vue中使用sessionStorage記住密碼功能,需要的朋友可以參考下
    2018-07-07
  • vue2如何使用vue-i18n搭建多語(yǔ)言切換環(huán)境

    vue2如何使用vue-i18n搭建多語(yǔ)言切換環(huán)境

    這篇文章主要介紹了vue2-使用vue-i18n搭建多語(yǔ)言切換環(huán)境的相關(guān)知識(shí),在data(){}中獲取的變量存在更新this.$i18n.locale的值時(shí)無(wú)法自動(dòng)切換的問(wèn)題,需要刷新頁(yè)面才能切換語(yǔ)言,感興趣的朋友一起看看吧
    2023-12-12
  • vue前端如何將任意文件轉(zhuǎn)為base64傳給后端

    vue前端如何將任意文件轉(zhuǎn)為base64傳給后端

    這篇文章主要介紹了vue前端如何將任意文件轉(zhuǎn)為base64傳給后端問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03

最新評(píng)論

汉中市| 平塘县| 阜城县| 安乡县| 灌阳县| 河南省| 泽库县| 达孜县| 九寨沟县| 台中市| 道真| 巩义市| 抚州市| 珠海市| 巴东县| 洛宁县| 香格里拉县| 鹤庆县| 革吉县| 苍山县| 昌都县| 达日县| 碌曲县| 双柏县| 临沭县| 牡丹江市| 吉水县| 永泰县| 丰原市| 扶绥县| 自贡市| 高尔夫| 衡东县| 天水市| 阿勒泰市| 开封县| 英吉沙县| 莱芜市| 扎囊县| 鞍山市| 盐津县|