前置路由守卫知识
全局后置路由守卫
router.afterEach((to,from,next)=>{
console.log(to,from,next)})
输出:
{name: 'zhuye', meta: {…}, path: '/home', hash: '', query: {…}, …}
{name: null, meta: {…}, path: '/', hash: '', query: {…}, …}[[Prototype]]: undefined
所以在后置路由守卫中next
是没有的。切换已经完成了,再给你next
有什么用吗?
从某种角度来说,我得有个next
才能控制
后置路由的作用
一般来说好一点的项目他都会做一个功能:
标签确实是你一上来的标题,点击
about
的时候,把你的标签变了,叫关于
点击
home
的时候标签变成主页
登录(要有一个本地存储值为
school-bilibili
)点击News变成信息
,点击Message
标题变成消息
js可以
document.title="名字"
但是这样固定死标题了,所以:
//给每一个路由都添加一个元信息//比如guanyu
meta:{title.'关于'}
然后:
router.beforeEach((to,from,next)=>{
console.log('to=',to,'from=',from)
document.title= to.meta.title//添加这一行if(to.meta.isAuth){if(localStorage.getItem('school')==='bilibili'){next()}else{alert('学校名不对或没有,无权限查看')}}else{next()}})
但是你写的不对,因为一上来undefined
,所以:
document.title= to.meta.title||'学习Vue'
在刷新的时候有一瞬间还是你的项目名,你要么改package里面的名字或者index.html里面的<title>
但是你本地存储没有school-bilibili
但是点击了news
虽然不给你呈现和发出弹窗警告,但是你的title
却改成了News
的名字,所以你直接改改早了
你写在放行前,这里要写俩次,所以放在这里不合适,所以说可以用到后置路由守卫
router.afterEach((to,from)=>{
console.log(to,from)
document.title= to.meta.title||'学习Vue'})
全局后置路由守卫作用:初始化的时候被调用、每次切换路由之后被调用
全局体现在我都是跟router
进行对话的;切换之前都走前置路由守卫
,切换之后都是走后置路由守卫
总结
路由守卫
1.作用:对路由进行权限控制
2.分类:全局守卫、独享守卫、组件内守卫
3.全局守卫:
//全局前置守卫:初始化时执行、每次路由切换前执行
router.beforeEach((to,from,next)=>{
console.log('beforEach',to,from,next)if(to.meta.isAuth){//判断当前路由是否需要进行权限控制if(localStorage.getItem('school')==='bilibili'){next()//放行}else{alert('无权限查看')}}else{next()//放行}})//全局后置守卫:初始化时执行、每次路由切换后执行
router.afterEach((to,from)=>{
console.log('afterEach',to,from)if(to.meta.title){
document.title= to.meta.title//修改网页的title}else{
document.title='项目名'}})
声明:本站所有文章,如无特殊说明或标注,均为网络收集发布。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。