Vue路由守卫

本文详细介绍了VueRouter中的三种路由守卫:全局前置和后置守卫,以及独享路由守卫的使用场景和配置。重点讲解了如何在不同阶段执行验证逻辑和组件级操作。

一、全局路由守卫

作用全局

  1. router.beforeEach全局前置路由守卫—初始化的时候被调用、每次路由切换之前被调用
  2. router.afterEach全局后置路由守卫—初始化的时候被调用、每次路由切换之后被调用

配置

// 该文件专门用于创建整个应用的路由器
import VueRouter from 'vue-router'
//引入组件
import About from '../pages/About'
import Home from '../pages/Home'
import News from '../pages/News'
import Message from '../pages/Message'
import Detail from '../pages/Detail'

//创建并暴露一个路由器
const router =  new VueRouter({
	routes:[
		{
			name:'guanyu',
			path:'/about',
			component:About,
			meta:{title:'关于'}
		},
		{
			name:'zhuye',
			path:'/home',
			component:Home,
			meta:{title:'主页'},
			children:[
				{
					name:'xinwen',
					path:'news',
					component:News,
					meta:{isAuth:true,title:'新闻'}
				},
				{
					name:'xiaoxi',
					path:'message',
					component:Message,
					meta:{isAuth:true,title:'消息'},
					children:[
						{
							name:'xiangqing',
							path:'detail',
							component:Detail,
							meta:{isAuth:true,title:'详情'},

							//props的第一种写法,值为对象,该对象中的所有key-value都会以props的形式传给Detail组件。
							// props:{a:1,b:'hello'}

							//props的第二种写法,值为布尔值,若布尔值为真,就会把该路由组件收到的所有params参数,以props的形式传给Detail组件。
							// props:true

							//props的第三种写法,值为函数
							props($route){
								return {
									id:$route.query.id,
									title:$route.query.title,
									a:1,
									b:'hello'
								}
							}

						}
					]
				}
			]
		}
	]
})

//全局前置路由守卫————初始化的时候被调用、每次路由切换之前被调用
router.beforeEach((to,from,next)=>{
	console.log('前置路由守卫',to,from)
	if(to.meta.isAuth){ //判断是否需要鉴权
		if(localStorage.getItem('school')==='atguigu'){
			next()
		}else{
			alert('学校名不对,无权限查看!')
		}
	}else{
		next()
	}
})

//全局后置路由守卫————初始化的时候被调用、每次路由切换之后被调用
router.afterEach((to,from)=>{
	console.log('后置路由守卫',to,from)
	document.title = to.meta.title || '硅谷系统'
})

export default router

二、独享路由守卫

在Vue Router中,独享路由守卫是一种路由守卫函数,用于在进入或离开特定路由时执行额外的逻辑或验证。独享路由守卫只会应用于特定的路由,而不是全局的所有路由。

  1. beforeEnter:在创建路由时,可以通过在路由配置中定义beforeEnter守卫函数来应用特定的前置逻辑
  2. beforeRouteEnter:在进入特定路由之前执行,但在路由组件实例被创建之前执行。
  3. beforeRouteLeave:在离开特定路由之前执行,用于执行一些离开前的清理逻辑或确认操作。

// 该文件专门用于创建整个应用的路由器
import VueRouter from 'vue-router'
//引入组件
import About from '../pages/About'
import Home from '../pages/Home'
import News from '../pages/News'
import Message from '../pages/Message'
import Detail from '../pages/Detail'

//创建并暴露一个路由器
const router =  new VueRouter({
	routes:[
		{
			name:'guanyu',
			path:'/about',
			component:About,
			meta:{title:'关于'}
		},
		{
			name:'zhuye',
			path:'/home',
			component:Home,
			meta:{title:'主页'},
			children:[
				{
					name:'xinwen',
					path:'news',
					component:News,
					meta:{isAuth:true,title:'新闻'},
					beforeEnter: (to, from, next) => {
						console.log('独享路由守卫',to,from)
						if(to.meta.isAuth){ //判断是否需要鉴权
							if(localStorage.getItem('school')==='atguigu'){
								next()
							}else{
								alert('学校名不对,无权限查看!')
							}
						}else{
							next()
						}
					},
					beforeRouteEnter (to, from, next) {
						//通过回调函数处理进一步的逻辑
						next()
					},
					beforeRouteLeave (to, from, next) {
						// 执行清理逻辑
						// 确认操作或其他逻辑
						next();
					}
				},
				{
					name:'xiaoxi',
					path:'message',
					component:Message,
					meta:{isAuth:true,title:'消息'},
					children:[
						{
							name:'xiangqing',
							path:'detail',
							component:Detail,
							meta:{isAuth:true,title:'详情'},
							//props的第三种写法,值为函数
							props($route){
								return {
									id:$route.query.id,
									title:$route.query.title,
									a:1,
									b:'hello'
								}
							}

						}
					]
				}
			]
		}
	]
})
//全局后置路由守卫————初始化的时候被调用、每次路由切换之后被调用
router.afterEach((to,from)=>{
	console.log('后置路由守卫',to,from)
	document.title = to.meta.title || '硅谷系统'
})

export default router

三、组件内路由守卫

在Vue中,可以利用路由守卫函数来控制在组件内部导航发生前后执行的逻辑。组件内的路由守卫与全局路由守卫相比,更专注于组件级别的导航钩子。

  1. beforeRouteEnter:在进入路由前被调用。在这个守卫内部,无法通过this访问组件实例,因为它在组件实例被创建之前调用。但是,可以通过回调函数来接收组件实例,并在回调函数中访问和操作组件。
    export default {
      beforeRouteEnter (to, from, next) {
        next(vm => {
          // 通过 `vm` 访问组件实例
          vm.doSomething();
        });
      },
      
      methods: {
        doSomething () {
          // 处理业务逻辑
        }
      }
    }
    
  2. beforeRouteUpdate:在当前路由被复用但是参数发生变化时调用,例如,从user/1导航至user/2。可以在该守卫中对组件进行更新操作。
  3. beforeRouteLeave:在组件离开当前路由前调用。可以使用该守卫来执行离开前的逻辑操作,例如保存数据或弹出确认对话框等。

<template>
	<h2>我是About的内容</h2>
</template>

<script>
	export default {
		name:'About',
		//通过路由规则,进入该组件时被调用
		beforeRouteEnter (to, from, next) {
			console.log('About--beforeRouteEnter',to,from)
			if(to.meta.isAuth){ //判断是否需要鉴权
				if(localStorage.getItem('school')==='atguigu'){
					next()
				}else{
					alert('学校名不对,无权限查看!')
				}
			}else{
				next()
			}
		},
		//通过路由规则,离开该组件时被调用
		beforeRouteLeave (to, from, next) {
			console.log('About--beforeRouteLeave',to,from)
			next()
		}
	}
</script>
### Vue 路由守卫的使用方法及示例 Vue.js 中的路由守卫提供了强大的功能,可以用来控制页面之间的跳转行为。以下是详细的说明以及相应的代码示例。 #### 全局路由守卫 全局路由守卫适用于整个应用程序中的所有路由。通过 `router.beforeEach` 和 `router.afterEach` 方法可以在每次导航之前或之后执行某些逻辑[^2]。 ```javascript // 导入 Vue Router 实例 import router from './router'; // 全局前置守卫,在进入任何路由前触发 router.beforeEach((to, from, next) => { console.log('正在导航到:', to.path); // 假设需要登录才能访问目标页面 if (to.meta.requiresAuth && !isAuthenticated()) { // 自定义函数判断用户是否已认证 next('/login'); // 如果未认证则重定向至登录页 } else { next(); // 否则继续导航 } }); // 全局后置守卫,在成功完成导航后触发 router.afterEach((to, from) => { console.log(`从 ${from.path} 到达 ${to.path}`); }); ``` --- #### 路由独享守卫 对于特定的某个路由,可以通过在其配置中设置 `beforeEnter` 来实现单独的守卫逻辑[^4]。 ```javascript const routes = [ { path: '/admin', component: Admin, beforeEnter: (to, from, next) => { const isAdmin = checkAdminPermission(); // 自定义权限校验函数 if (!isAdmin) { alert('您没有管理员权限!'); next('/home'); // 非管理员用户被重定向回首页 } else { next(); // 正常进入 admin 页面 } }, }, ]; ``` --- #### 组件内的路由守卫 如果希望在具体组件内部处理导航逻辑,可以利用组件级别的守卫方法,如 `beforeRouteEnter`, `beforeRouteUpdate`, 和 `beforeRouteLeave`[^3]。 ##### 示例:`beforeRouteEnter` 此方法仅能在导航进入受保护的组件时调用,并且无法获取组件实例 (`this`) 的上下文。 ```javascript export default { name: 'UserProfile', beforeRouteEnter(to, from, next) { fetchUserDetails().then(user => { if (user.isAuthorized) { next(vm => vm.setUserProfile(user)); // 将数据传递给组件实例 } else { next(false); // 阻止加载并留在原位置 } }); }, methods: { setUserProfile(data) { this.user = data; }, }, }; ``` ##### 示例:`beforeRouteLeave` 当离开当前组件对应的路由时会触发该方法,可用于提示用户保存更改等内容。 ```javascript export default { name: 'EditorPage', beforeRouteLeave(to, from, next) { const answer = window.confirm('您的修改尚未保存,确认退出吗?'); if (answer) { next(); // 用户同意退出 } else { next(false); // 取消导航 } }, }; ``` --- ### 总结 以上分别介绍了 **全局路由守卫**、**路由独享守卫** 和 **组件内路由守卫** 的基本概念与实际应用案例。这些工具可以帮助开发者更灵活地管理和优化用户的浏览体验。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝朽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值