Vue3 使用NProgress进度条 改善页面加载效果

3,390 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

安装依赖

yarn add nprogress @types/nprogress

添加到已有的routes/index.ts文件里

import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

// 页面渲染成功之后,展示进度条(实际效果:Mac的Chrome就是在页面顶部有条2px左右的进度条)
router.beforeEach(async (to, from) => {
  NProgress.start()
})

// 页面加载成功之后,关闭进度条
router.afterEach(to => {
  NProgress.done()
})

完整的路由文件

import { createRouter, createWebHashHistory } from 'vue-router'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

const routes = [
  {
    path: '/',
    name: 'Home',
    component: () => import('@/views/Home.vue'),
  },
  {
    path: '/edit',
    name: 'EditOrder',
    component: () => import('@/views/editOrder.vue'),
  },
]

const router = createRouter({
  history: createWebHashHistory(),
  routes,
})

router.beforeEach(async (to, from) => {
  NProgress.start()
})

router.afterEach(to => {
  NProgress.done()
})

export default router

参考了这篇简洁易懂的博客:xknote.com/blog/351596…

一开始,看的是别的博客(不得不吐槽必应的搜索还有待提升,常常把过时的或是不适合当前场景的博客展示的前几位,即使是给时间加筛、只看去年到现在的,也往往也打开好几个网页,才能找到正确有用的;所以,上班时间能用谷歌还是挺爽的) 别人贴出来的代码是:

router.beforeEach((to,from,next)=>{ 
  NProgress.start() 
}) 
router.afterEach((to,from,next)=>{ 
  NProgress.done() 
})

一运行就报错了:

Error: Invalid navigation guard
    at vue-router.esm-bundler.js:1945:47
triggerError @ vue-router.esm-bundler.js:3302

而且报错之前还有告警提示:

[Vue Router warn]: The "next" callback was never called inside of :
async (to, from, next) => {
  NProgress.start();
}
. If you are returning a value instead of calling "next", make sure to remove the "next" parameter from your function.
warn @ vue-router.esm-bundler.js:72

查了vue-router的官方文档,发现如果无需处理next的话,是可以不把它加进来的 router.vuejs.org/zh/guide/ad…

原文如下:

如果什么都没有,undefined 或返回 true则导航是有效的,并调用下一个导航守卫

总结:资讯的来源一般是官方文档比较靠谱,技术的提升则练习往往是有效的途径~