vue导航守卫实现原理
Vue 导航守卫实现原理
Vue 导航守卫是 Vue Router 提供的核心功能之一,用于在路由跳转前后执行特定逻辑(如权限验证、数据预加载等)。其实现原理主要基于路由钩子函数和异步执行队列。
导航守卫的分类
-
全局守卫
beforeEach:全局前置守卫,路由跳转前触发。beforeResolve:全局解析守卫,在所有组件内守卫和异步路由组件解析后触发。afterEach:全局后置守卫,路由跳转完成后触发。
-
路由独享守卫
- 在路由配置中直接定义
beforeEnter钩子。
- 在路由配置中直接定义
-
组件内守卫

beforeRouteEnter:组件渲染前触发(无法访问this)。beforeRouteUpdate:组件复用时触发(如动态参数变化)。beforeRouteLeave:离开组件前触发。
实现机制
-
钩子函数注册
Vue Router 通过router.beforeEach等方法将守卫函数存入内部队列(如beforeHooks)。例如:router.beforeEach((to, from, next) => { /*逻辑*/ }); -
路由跳转流程
- 调用
router.push或触发路由变更时,Vue Router 会创建一个导航对象(navigation),并依次执行守卫队列。 - 通过
runQueue函数异步执行队列中的钩子,确保顺序性:runQueue(queue, iterator, callback);其中
iterator负责调用每个守卫函数,并处理next回调。
- 调用
-
next函数的作用next():继续执行下一个守卫或完成导航。next(false):中断当前导航。next(path):重定向到新路径。next(error):触发错误处理。
-
组件守卫的注入
组件内守卫通过 Vue 的混入(mixin)机制注入到组件生命周期中。例如:Vue.mixin({ beforeCreate() { if (this.$options.beforeRouteEnter) { // 注册组件钩子 } } });
关键代码片段
Vue Router 的核心逻辑简化如下:
function runQueue(queue, fn, cb) {
const step = index => {
if (index >= queue.length) return cb();
const hook = queue[index];
fn(hook, () => step(index + 1));
};
step(0);
}
queue:守卫函数队列。fn:迭代器,执行钩子并调用next。cb:队列执行完毕后的回调。
注意事项
- 异步守卫:若守卫返回 Promise,Vue Router 会等待其解析后再继续导航。
- 组件内守卫的
this:beforeRouteEnter中无法直接访问组件实例,但可通过next(vm => {})回调获取。 - 错误处理:通过
router.onError捕获导航过程中的异常。
通过上述机制,Vue Router 实现了灵活的路由控制能力,开发者可以基于业务需求自由组合守卫逻辑。






