Vue.js——路由全局前置&后置守卫(钩子)

前言: 不知不觉走在编程的路上已经一个年头多些,在自学的前部分时间都在看别人写的程序。最近这几个月几乎都在自己捣鼓程序…导致很少去吸收别人写的程序的优点。回到正题~最近在玩vue社区的一个很有名的框架iView,并且也在看它生态中的iView Admin模板。刚开始就掉坑了…

全局前置守卫(钩子)

基础语法:

const router = new VueRouter({ ... })

router.beforeEach((to, from, next) => {
  // ...
})

从名字全局前置守卫不难理解,它是全局的,即对 整个单页应用(SPA) 中的所有路由都生效,所以当定义了全局的前置守卫,在进入每一个路由之前都会调用这个回调,那么如果你在回调中对路由的跳转条件判断出错,简单点就是死循环…因为你遗漏了某种路由跳转的情况,守卫会一直执行。所以在使用全局前置守卫的时候一定要判断清楚可能会出现的路由跳转的情况。

应用场景

在iView Admin中全局前置守卫的应用场景就是对用于访问网页的情况进行相应的跳转,例如初次登入,不能访问除登录页面外的页面,已登录会自动跳转自首页等等。
代码:

router.beforeEach((to, from, next) => {
    //开启懒加载
    iView.LoadingBar.start()
	//获取token
	const token = getToken()
	if (!token && to.name !== LOGIN_PAGE_NAME) {
	    // 未登录且要跳转的页面不是登录页
	    next({
	        name: LOGIN_PAGE_NAME // 跳转到登录页
	    })
	} else if (!token && to.name === LOGIN_PAGE_NAME) {
	    // 未登陆且要跳转的页面是登录页
	    next() // 跳转
	} else if (token && to.name === LOGIN_PAGE_NAME) {
	    // 已登录且要跳转的页面是登录页
	    next({
	        name: 'home' // 跳转到homeName页
    	})
	}
})

注:至于代码中的令牌token就是通过cookie存储的一个键值对,详细代码大家可以自行去GitHub下载源码。

全局后置守卫(钩子)

基础语法:

router.afterEach((to, from) => {
  // ...
})

理解了全局前置守卫,那么全局后置守卫也就那么一回事。全局后置守卫是整个单页应用中每一次路由跳转后都会执行其中的回调。所以多用于路由跳转后的相应页面操作,并不像全局前置守卫那样会在回调中进行页面的重定向或跳转。

应用场景

应用场景前面以及提了就是对跳转后的页面进行例如滚动条回调0 0 位置、更新页面title、懒加载结束等等
代码:

router.afterEach((to, from) => {
    setTitle(to, router.app)
    iView.LoadingBar.finish()
    window.scrollTo(0, 0)
})
### 区别 前端路由守卫分为**前置守卫**和**后置守卫**,它们分别在路由跳转的不同阶段执行,用于处理不同的业务逻辑。 - **前置守卫(before guards)** 是在路由跳转之前执行的钩子函数,常用于权限验证、页面加载提示等操作。前置守卫可以通过全局或组件内部注册,允许开发者在导航发生前进行干预,比如阻止用户访问某些页面[^1]。 - **后置守卫(after hooks)** 是在路由跳转完成后执行的钩子函数,通常用于页面统计、日志记录等操作。与前置守卫不同,后置守卫没有 `next` 函数,因此不能阻止导航。它只能全局注册,无法在组件内部局部注册[^4]。 --- ### 实现方法 #### 全局前置守卫 全局前置守卫使用 `router.beforeEach` 方法注册,该方法接收三个参数:`to`(目标路由)、`from`(当前路由)和 `next`(必须调用的函数)。前置守卫可以用来进行权限验证,例如检查用户是否登录。 ```javascript router.beforeEach((to, from, next) => { // 检查目标路由是否需要认证 if (to.meta.requiresAuth && !isAuthenticated()) { // 如果未认证,则跳转到登录页面 next('/login'); } else { // 否则继续导航 next(); } }); ``` #### 组件内前置守卫 组件内前置守卫是通过在组件中定义 `beforeRouteEnter`、`beforeRouteUpdate` 和 `beforeRouteLeave` 钩子函数来实现的。这些钩子函数允许在进入或离开特定组件时执行逻辑。 ```javascript export default { beforeRouteEnter(to, from, next) { // 在渲染该组件的对应路由被确认前调用 next(vm => { // 通过 `vm` 访问组件实例 }); }, beforeRouteLeave(to, from, next) { // 导航离开该组件的对应路由时调用 const answer = window.confirm('Do you really want to leave? you have unsaved changes!'); if (answer) { next(); } else { next(false); } } }; ``` #### 全局后置守卫 全局后置守卫使用 `router.afterEach` 方法注册,该方法只接收两个参数:`to` 和 `from`。由于没有 `next` 函数,后置守卫只能用于执行清理工作或记录日志,而不能阻止导航。 ```javascript router.afterEach((to, from) => { // 记录页面访问日志 console.log(`Navigated from ${from.path} to ${to.path}`); }); ``` #### 独享路由守卫 独享路由守卫是指在特定路由配置中定义的前置守卫,仅对该路由生效。这种方式适用于需要对特定路由进行特殊处理的情况。 ```javascript const routes = [ { path: '/protected', component: ProtectedComponent, beforeEnter: (to, from, next) => { // 仅对该路由生效的前置守卫 if (auth.isLoggedIn()) { next(); } else { next('/login'); } } } ]; ``` --- ### 使用场景 - **前置守卫** 适用于: - 权限验证:确保用户有权访问目标页面。 - 页面加载提示:在页面加载前显示加载动画或提示信息。 - 数据预加载:提前获取页面所需的数据,提升用户体验。 - **后置守卫** 适用于: - 页面统计:记录用户访问的页面,用于数据分析。 - 日志记录:跟踪用户的操作行为,便于后续调试。 - 清理工作:取消未完成的请求、释放资源等。 --- ### 总结 前置守卫和后置守卫Vue 路由中非常重要的功能,它们分别在路由跳转的不同阶段执行,帮助开发者更好地控制应用的行为。前置守卫主要用于权限验证和数据预加载,而后置守卫则用于日志记录和资源清理。通过合理使用这两种守卫,可以显著提升应用的安全性和用户体验。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值