Vue Router 导航守卫全面解析:掌控路由跳转的每个环节
vue-router 🚦 The official router for Vue 2 项目地址: https://gitcode.com/gh_mirrors/vu/vue-router
什么是导航守卫?
导航守卫是 Vue Router 提供的一套路由拦截机制,它允许开发者在路由跳转的不同阶段插入自定义逻辑,实现对导航流程的精细控制。就像现实中的安检关卡一样,导航守卫可以决定是否允许跳转、是否需要重定向或取消当前导航。
导航守卫的分类
Vue Router 提供了三种类型的导航守卫:
1. 全局守卫(作用于所有路由)
全局前置守卫 beforeEach
router.beforeEach((to, from, next) => {
// 在这里进行权限检查等操作
next() // 必须调用next()才能继续路由跳转
})
全局解析守卫 beforeResolve(2.5.0+)
router.beforeResolve((to, from, next) => {
// 在所有组件内守卫和异步路由组件解析后调用
next()
})
全局后置钩子 afterEach
router.afterEach((to, from) => {
// 导航已经完成,无法改变导航结果
// 适合用于页面统计等操作
})
2. 路由独享守卫(作用于特定路由)
const router = new VueRouter({
routes: [
{
path: '/admin',
component: Admin,
beforeEnter: (to, from, next) => {
// 仅对/admin路由生效
if (!isAdmin()) next('/login')
else next()
}
}
]
})
3. 组件内守卫(作用于特定组件)
const User = {
template: `...`,
beforeRouteEnter(to, from, next) {
// 组件实例尚未创建,无法访问this
next(vm => {
// 通过回调参数vm访问组件实例
})
},
beforeRouteUpdate(to, from, next) {
// 当前路由改变但组件被复用时调用
// 可以访问this
next()
},
beforeRouteLeave(to, from, next) {
// 离开该组件对应路由时调用
// 可以访问this
if (unsavedChanges()) {
if (confirm('有未保存的更改,确定离开吗?')) next()
else next(false)
} else next()
}
}
导航守卫的执行流程
理解导航守卫的执行顺序对于正确使用它们至关重要:
- 导航触发:用户点击链接或调用router.push等方法
- 调用失活组件的beforeRouteLeave
- 调用全局的beforeEach守卫
- 在重用的组件中调用beforeRouteUpdate(2.2+)
- 调用路由配置中的beforeEnter
- 解析异步路由组件
- 调用激活组件的beforeRouteEnter
- 调用全局的beforeResolve(2.5+)
- 导航被确认
- 调用全局的afterEach钩子
- 触发DOM更新
- 执行beforeRouteEnter中传给next的回调函数
导航守卫的核心参数
所有导航守卫方法都接收三个核心参数:
to
:目标路由对象from
:当前路由对象next
:控制导航行为的函数
next函数的四种用法
next()
:继续导航流程next(false)
:中断当前导航next('/path')
或next({ path: '/' })
:重定向到新路径next(error)
:导航出错(2.4.0+)
重要提示:必须调用next函数,否则导航会一直处于等待状态!
常见应用场景
- 权限控制:检查用户是否有权限访问目标路由
- 数据预加载:在进入路由前获取必要数据
- 表单保护:防止用户在未保存表单时意外离开
- 页面访问统计:在afterEach中记录页面访问
- 动态标题设置:根据路由元信息设置页面标题
注意事项
- 参数变化不会触发导航守卫:当路由参数变化但组件复用时,不会触发完整的导航流程,需要使用
beforeRouteUpdate
或监听$route
对象 - 异步守卫:守卫可以返回Promise或使用async/await
- 组件实例访问:
beforeRouteEnter
中无法访问this,需要通过回调获取 - 性能考虑:避免在全局守卫中添加过多复杂逻辑
最佳实践
- 将权限检查等通用逻辑放在全局守卫中
- 将特定路由的逻辑放在路由独享守卫中
- 将组件相关的逻辑放在组件内守卫中
- 对于复杂应用,考虑使用路由元信息(meta)来组织守卫逻辑
通过合理使用导航守卫,开发者可以构建出更加安全、用户体验更好的单页应用。理解并掌握这些守卫的执行时机和用法,是成为Vue Router高级使用者的关键一步。
vue-router 🚦 The official router for Vue 2 项目地址: https://gitcode.com/gh_mirrors/vu/vue-router
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考