Vue——路由守卫:全局守卫

69 阅读2分钟

路由守卫(guard)

全局守卫:

router.index.js 文件中配置守卫函数,全局守卫指的是所有路由匹配都会经过它们,进行验证,判断是否可以去访问,(例如:登录、注册,只有登录才可以进入首页)

注意:

  • 只要匹配一次路由,下面的全局守卫函数就会被调用

  • 全局守卫函数必须在配置路由规则下面写。

一、全局前置钩子 router.beforeEach(fn),导航被触发----一般登录验证

router.beforeEach(function(to,from,next){
  // to,from路由信息对象
  console.log("无论进入哪个路由(只要匹配一次路由),都要先调用这个函数")
  console.log(to,from)
  if(to.path=="/car"||to.path=="/info"){
  //取出浏览器中缓存的登录信息
    var str=window.localStorage.getItem("islogin")
    //如果取出的信息是ok就代表用户已经登录过了,可以直接去car页面或info页面
    //注意:这里与ok进行比较,是因为我们在登录页面进行了缓存,如果登录过,就缓存 一些信息
    //缓存信息:window.localStorage.setItem("islogin","ok")
    if(str=="ok"){
      next()
    }else{
    //如果不符合规则,就代表用户并没有登录过
    //就将页面跳转到登录页面
    //让用户去登录
      next("/login")
    }
  }else{
    // 去匹配路由,然后加载组件
    // 注意:最后一个用next(),不然容易导致死循环
    next()
  }
})

二、全局解析钩子 router.beforeResolve(fn),组件初始化

// 全局解析守卫
// 作用:了解它什么时候触发
router.beforeResolve((to,from,next)=>{
  console.log('路由匹配完毕',to,from)
  // 渲染组件
  next()

})

三、全局后置钩子 router.afterEach(fn) ,没有 next ,导航被确认,一般路由跳转以后用 window 把窗口调上去

// 全局后置守卫
// 作用:操作页面
router.afterEach((to, from) => {
  console.log('组件已经渲染了',to,from)
// 滚动页面:是因为切换组件后,我们发现新页面的进度仍旧停留我们刚才页面进度的位置上。
// 这是因为切换组件只是dom操作更改了div标签,但是所有组件的切换都是同一份的html文件,
//所以body标签并没有改变,也就是每一个组件渲染的页面,鼠标在上面的位置都是一致的,
//例如滚动条,当我们页面滚动到页面的末尾,会发现切换组件后,滚动条依旧在页面的末尾处。
// 这种情况的出现会使用户的使用感很差
// 解决这个问题:window.scrollTo(0,0):代表将页面滚动到页面头部。
  window.scrollTo(0,0)
})

便于理解案例:

router.index.js文件:

image.png

login组件:

image.png

结果图:

image.png