vue导航守卫详解

概念

导航守卫又称为路由守卫,实时监控路由跳转时的过程,在路由跳转的各个过程中执行相应的操作,类似于生命周期函数,在开发过程中经常被使用,比如用户点击一个页面,如果未登录就调用到登陆页面,已登录就让用户正常进入。

分类:

全局路由一共分为三类:全局守卫路由独享守卫组件内守卫

一、全局守卫

全局守卫有三种:

1. router.beforeEach (全局前置守卫)
2. router.beforeResolve (全局解析守卫)
3. router.afterEach (全局后置守卫)
1. router.beforeEach (全局前置守卫)

每次跳转,router.beforeEach 都会执行,并且接收三个参数

to: 记录着将要进入的目标路由对象的信息。

from:记录着即将离开的目标路由对象的信息。

next:表示执行下一步。

router.beforeEach就是全局路由跳转时触发执行的函数

import Vue from 'vue'
import Router from 'vue-router'
import home from '@/components/home'
import login from '@/components/login'
import about from '@/components/about'
 
Vue.use(Router)
const ISLOGIN = true   //登录状态模拟
const router = new Router({
  routes: [
    {
      path: '/',
      name: 'home',
      component: home,
    },
    {
      path: '/login',
      name: 'login',
      component: login
    },
    {
      path: '/about',
      name: 'about',
      component: about
    }
  ]
})
 
router.beforeEach((to, from, next) => {   //全局全局前置守卫
  //to : 将要进入的目标路由对象
  //from : 即将离开的目标路由对象
  //执行跳转的下一步钩子
  console.log(to)
  console.log(from)
  if(to.name != 'login'){ //如果不是登录页面
    if(ISLOGIN)next()   //已登录就执行跳转
    else next({name:'login'})   //否则跳转到登录页面
  }else{ //如果是登录页面
    if(ISLOGIN)next({name:'/'}) //已登录就跳转到首页
    else  next()  //否则正常进入登录页面
  }
})
export default router
2. router.beforeResolve(全局解析守卫)

和全局前置守卫类似,区别是在跳转被确认之前,同时在所有组件内守卫和异步路由组件都被解析之后,解析守卫才调用。

3. router.afterEach(全局后置钩子)

只接受 to 和 from ,不会接收 next 函数也不会改变导航本身

二、路由独享守卫

独享守卫只有一种:beforeEnter

该守卫接收的参数与全局守卫是一样的,但是该守卫只在其他路由跳至配置有 beforeEnter 路由表信息时才生效。

router配置文件内容:

{
   path: '/about',
   name: 'about',
   component: about,
   beforeEnter:(to,from,next)=>{
      console.log(to);
      console.log(from);
      next()
   }

三、组件内守卫

组件内守卫一共有三个:

1. beforeRouterEnter(进入该路由时执行), 
2. beforeRouteUpdate(该路由中参数改变时执行),
3. beforeRouteLeave(离开该路由时执行)
<template>
  <div>关于页面</div>
</template>
<script>
  export default {
    name: "about",
    beforeRouteEnter(to, from, next) {
      //进入该路由时执行
    },
    beforeRouteUpdate(to, from, next) {
      //该路由参数更新时执行
    },
    beforeRouteLeave(to, from, next) {
      //离开该路由时执行
    }
  }
</script>
<style scoped>
</style>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值