路由守卫 ( 拦截 )

什么是导航守卫?

正如其名,vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。这里有很多方式植入路由导航中:全局的,单个路由独享的,或者组件级的。

全局前置守卫

可以使用 router.beforeEach() 函数注册一个全局前置守卫

// 创建路由
import { createRouter, createWebHashHistory } from "vue-router";
const router = createRouter({
	history : createWebHashHistory(),
	routes  : routes
});
router.beforeEach((to, from) => {
	console.log(to, from);
	// 自己的路由拦截逻辑代码
});

当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫 resolve 完之前一直处于等待中。每个守卫方法接收两个参数 :

to: 即将要进入的目标对象
from: 当前导航正要离开的路由对象

可以返回的值如下 :

# false : 取消当前的导航。
# 一个路由地址 : 通过一个路由地址跳转到一个不同的地址,就像你调用 router.push() 一样,你可以设置诸如 replace: true 或 name: 'home' 之类的配置。当前的导航被中断,然后进行一个新的导航,就和 from 一样。
# 如果遇到了意料之外的情况 : 可能会抛出一个 Error。这会取消导航并且调用 router.onError() 注册过的回调。
# 如果什么都没有,undefined 或返回 true,则导航是有效的

拦截示例

import { createRouter, createWebHashHistory } from "vue-router";
const router = createRouter({
	history : createWebHashHistory(),
	routes  : routes
});
router.beforeEach((to, from) => {
	console.log(to, from);
	// 自己的路由拦截逻辑代码
	// 比如拦截 User 路由
	console.log(to.path);
	if(to.path == '/User'){
		return false; // 返回 false
	}
});