vue-router路由守卫使用场景
# 1. 动态修改页面 title
每个子路由页的标题即可,在每个子路由对象中添加 meta 属性:
{
path: '/todolist',
name: 'todolist',
component: Todolist,
meta: { title: '每日待办' }
}
1
2
3
4
5
6
2
3
4
5
6
const router = createRouter({
history: createWebHistory(process.env.BASE_URL),
routes
})
router.beforeEach((to, from, next) => {
window.document.title = to.meta.title
next()
})
export default router
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
效果
# 2. 路由鉴权
Vue Router 的权限验证通常可以通过全局前置守卫和路由元信息来实现。
首先,在创建 Vue Router 实例之前,你可以定义一个全局前置守卫函数,用于检查用户是否有权限访问某个路由。
router.beforeEach((to, from, next) => {
const requiresAuth = to.matched.some(record => record.meta.requiresAuth);
const isAuthenticated = // 在此处根据你的验证逻辑判断用户是否已登录
if (requiresAuth && !isAuthenticated) {
next('/login'); // 如果需要认证且用户未登录,则将用户重定向到登录页
} else {
next(); // 否则放行
}
});
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
接下来,在定义路由时,你可以使用路由 meta 来标记需要进行权限验证的路由。
const routes = [
{
path: '/dashboard',
component: Dashboard,
meta: { requiresAuth: true } // 需要登录才能访问
}
// 其他路由定义
]
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
这样,在用户访问这些需要验证权限的路由时,会触发前置守卫函数,从而执行相应的权限验证逻辑。
# 3. 组件懒加载进度条
利用 NProgress 实现顶部加载进度条
// 顶部路由加载进度条
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
NProgress.configure({
easing: 'ease', // 动画方式
speed: 600, // 递增进度条的速度
showSpinner: false, // 是否显示加载ico
trickleSpeed: 200, // 自动递增间隔
minimum: 0.3 // 初始化时的最小百分比
})
router.beforeEach((to: any, from: any, next: any) => {
// 顶部进度条
NProgress.start()
if (!to.matched.length) {
next({ name: 'NotFound' })
}
})
router.afterEach(() => {
// 在即将进入新的页面组件前,关闭掉进度条
NProgress.done()
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
实现效果类似 YouTube 网站顶部 红条
# 4. 路由重定向
与鉴权配合,如果用户无权限或者未登录,跳转到登录页面
router.beforeEach((to, from, next) => {
const requiresAuth = to.matched.some((record) => record.meta.requiresAuth)
// 在此处根据你的验证逻辑判断用户是否已登录
const isAuthenticated = check()
if (requiresAuth && !isAuthenticated) {
next('/login') // 如果需要认证且用户未登录,则将用户重定向到登录页
} else if (to.path === '/login' && isAuthenticated) {
next('/dashboard') // 如果用户已经登录,并且访问的是登录页,则将用户重定向到主页或其他默认页面
} else {
next() // 否则放行
}
})
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
如果用户已经登录(根据你的验证逻辑),并且访问的是登录页,则会将用户重定向到其他默认页面(如 /dashboard)。这样可以防止已经登录的用户再次进入登录页。
上次更新: 2023/06/26, 07:32:29