五分钟速通vue中的路由守卫用法代码

路由守卫是当路由跳转,更新,离开时我们需要一系列操作的时候使用

全局路由守卫
在路由根文件组件中
在这里插入图片描述

//在路由根文件组件中  
import Vue from 'vue'
import VueRouter from 'vue-router'

//这行代码如果注释掉,this上面都不存在$router与$route的api了
Vue.use(VueRouter)  

//引入Films组件
import Films from "@/views/Films"
// import Cinema from "@/views/Cinema"
import Center from "@/views/Center"
import Nowplaying from "@/views/films/Nowplaying"
import Comingsoon from "@/views/films/Comingsoon"
import Error from "@/views/Error"
import Detail from "@/views/Detail"


const routes = [
  {
    path:"/films",
    component:Films,
    //进行二级路由的配置
    children:[
      {
        path:"/films/nowplaying",
        component:Nowplaying,
      },
      {
        path:"/films/comingsoon",
        component:Comingsoon
      },
      {
        path:"",
        redirect:"/films/nowplaying"  //进行一级路由内部的重定向操作  /films ==> /films/nowplaying
      }
    ]
  },
  // {
  //   path:"/films/Nowplaying",
  //   component:Nowplaying
  // },
  {   
    path:"/cinema",
      component:()=>import(/* webpackChunkName:'cinema' */"@/views/Cinema")   //webpack的代码分割?
    // component: resolve => require(['@/views/Cinema'], resolve)
  },
  {
    path:"/center",
    component:Center,
    // beforeEnter(to,from,next){
    //   console.log("进入Center了哦....")
    //   next()
    // }
  },
  {
    name:"detail",
    path:"/detail/:id",
    component:Detail,
    props:true
  },
  {
    path:"/login",
    component:()=>import("@/views/Login")
  },
  {
    path:"/",
    redirect:'/films'  //重定向  / ==> /films ===> /fimls/nowplaying
  },
  {
    path:"*",
    component:Error   //前面的路由都没有匹配上的话,就需要显示Error页面了
  }
]

const router = new VueRouter({
  mode:"hash",//默认采用hash模式
  routes
})

//全局路由守卫
//全局路由的前置守卫
//to:Route  即将要进入的目标
//from:Route 当前导航正要离开的路由
/* router.beforeEach((to,from,next)=>{
  if(from.path==="/cinema"){
    console.log("从影院这边过来的哦...")
  }
  next() //一定需要调用next
}) */


//全局的后置路由守卫
/* router.afterEach((to,from)=>{
  if(to.path === "/center"){
    console.log("进入center了哦...")
  }
}) */



//判断每次路由切换的时候,是否有token令牌
router.beforeEach((to,from,next)=>{
  if(to.path === "/center"){
    if(localStorage.getItem("token")){//说明用户已经登录了
      next()
    }else{
      next("/login") //如果用户没有登录直接跳转到登录界面进行用户登录
    }
  }else{
    next()
  }
})




export default router

单个路由钩子:
只有beforeEnter,在进入前执行,to参数就是当前路由

routes: [
    {
      path: '/foo',
      component: Foo,
      //当进入到foo路由之前,就会触发
      beforeEnter: (to, from, next) => {
        // ...
        next() //必须要执行next之后,对应的Foo组件才可以正常显示出来
      }
    }
  ]

路由组件钩子:
这个路由组件钩子需要在组件中使用,

//进入到某个组件之前的拦截,获取不到组件内部的this
  beforeRouteEnter (to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    // 不!能!获取组件实例 `this`
    // 因为当守卫执行前,组件实例还没被创建
  },
  
  beforeRouteUpdate (to, from, next) {
    // 在当前路由改变,但是该组件被复用时调用     
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 可以访问组件实例 `this`
  },
  
  //离开某个组件之前的拦截,获取到组件内部的this
  beforeRouteLeave (to, from, next) {
    // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 `this`
  }

组件钩子举例
在某组件中

<template>
    <div class="center">
        center...
    </div>
</template>

<script>
export default {
    //进入Center之前
    /* beforeRouteEnter(to,from,next){
        console.log("Center---beforeRouteEnter...",this)
        next()
    }, */

    //从Center离开的时候
    /* beforeRouteLeave(to,from,next){
        console.log("Center-beforeRouteLeave",this)
        next()
    } */



    /* beforeRouteEnter(to,from,next){
        if(localStorage.getItem("token")){//说明用户已经登录了
            next()
        }else{
            next("/login") //如果用户没有登录直接跳转到登录界面进行用户登录
        }
    } */

}
</script>

<style>

</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值