前端路由鉴权怎么做才不会闪现未授权页面?
我在用 Vue Router 做后台管理系统,想在进入某些路由前判断用户是否登录。现在的问题是,即使我在 beforeEach 里写了跳转逻辑,页面还是会先闪一下目标组件,然后才跳回登录页,体验很不好。
我试过把路由守卫写成这样:
router.beforeEach((to, from, next) => {
if (to.meta.requiresAuth && !isAuthenticated()) {
next('/login')
} else {
next()
}
})
但还是会有短暂的未授权页面渲染。是不是应该把鉴权逻辑提到更早的地方?或者需要配合组件内的 loading 状态?
首先,最直接的办法是把鉴权逻辑提前到应用初始化阶段,而不是等到路由切换时才做判断。可以在 main.js 里先检查用户状态,如果未登录直接跳转到登录页:
然后,在 beforeEach 守卫中继续做验证,但要注意设置一个 loading 状态来阻止组件渲染:
这里的关键在于利用 loading 状态来延迟组件渲染。当首次进入应用时,通过 setTimeout 给出短暂的等待时间,让页面可以呈现一个加载中的状态而不是直接显示未授权内容。
还需要注意的是,在组件内部也可以配合使用
v-if来控制渲染条件,比如只在用户已认证的情况下才渲染实际内容:这样多管齐下,基本就能解决闪屏问题了。虽然代码看起来复杂了些,但为了用户体验值得这么做。说实话,前端路由这块确实挺折腾人的,尤其是这种细节处理,不过慢慢调总会好的。
首先在 main.js 里加个全局变量来保存登录状态,比如叫 isAuthenticated。然后在 new Vue() 之前就去获取这个状态:
接着在 router.beforeEach 里直接用这个变量判断,不用再调用函数了:
这样就能避免页面闪现的问题了。记得把 token 存储和更新的逻辑处理好就行。有时候前端这活儿就是得折腾细节,累是累了点,但弄明白了还挺有成就感的。