Vue Vue-route (6)

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue-route 全局和局部路由拦截及应用

目录

全局路由拦截

全局前置守卫

设置全局拦截

是否授权

是否授权逻辑

路由元信息

实现授权验证

登录处理

创建login页面

设置login路由

​编辑优化登录返回

局部路由拦截

路由独享守卫

组件内的守卫

总结


全局路由拦截

具体应用为:判断是否登录,未登录,跳转去登录;已登录,则继续执行原有请求。

全局前置守卫

你可以使用router.beforeEach注册一个全局前置守卫:

当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫resolve完之前一直处于等待中。

每个守卫方法接收三个参数:

to: Route 即将要进入点的目标 路由对象

from: Route 当前导航正要离开的路由

next: Function 一定要调用该方法来resolve这个钩子,执行效果依赖next方法的调用参数

设置全局拦截

在vue中设置全局前置拦截,在router/index.js路由配置设置:

to 去哪

from 从哪来

next 继续执行

是否授权

是否授权逻辑

通过全局拦截,判断是否授权逻辑。

示例如下:

不需要验证登录实现如下:

路由元信息

在路由中设置自定义的meta 字段:

 

实现授权验证

在router/index.js中对需要验证的路由,增加meta字段设置:

{
    path: '/center',
    name: 'center',
    component: Center,
    meta: {
      isLoginRequired: true
    }
  }

在router/index.js中验证meta。

示例如下:

// 全局拦截(守卫)
router.beforeEach((to, from, next) => {
  console.log(to)

  if (to.meta.isLoginRequired) {
    // 进行验证 本地存储中是否有token
    if (!localStorage.getItem('token')) {
      next('/login')
    }
  }
  next()
})

 

登录处理

创建login页面

创建LoginView.vue页面并处理登录业务处理。

示例如下:

<template>
    <div>
        login
        <button @click="handleLogin">登录</button>
    </div>
</template>
<script>
export default {
  methods: {
    handleLogin () {
      setTimeout(() => {
        localStorage.setItem('token', '后端返回的token字段')
        // this.$router.back() //返回

        this.$route.push('/center')
      }, 0)
    }
  }
}
</script>
设置login路由

在router/index.js中设置登录的路由配置。

示例如下:

import Vue from 'vue'
import VueRouter from 'vue-router'
import Films from '@/views/FilmsView'
import Cinemas from '@/views/CinemasView'
import Center from '@/views/CenterView'
import NowPlaying from '@/views/films/NowPlaying'
import ComingSoon from '@/views/films/ComingSoon'
import Search from '@/views/SearchView'
import Detail from '@/views/DetailView'
import Login from '@/views/LoginView'

Vue.use(VueRouter) // 注册路由插件

// 配置表
const routes = [
  {
    path: '/films',
    name: 'films',
    component: Films,
    children: [
      {
        path: '/films/nowplaying',
        component: NowPlaying
      },
      {
        path: '/films/comingsoon',
        component: ComingSoon
      },
      {
        path: '/films',
        redirect: '/films/nowplaying'
      }
    ]
  },
  {
    path: '/detail/:id', // 动态路由
    name: 'detail', // 命名路由
    component: Detail
  },
  {
    path: '/cinemas',
    name: 'cinemas',
    component: Cinemas
  },
  {
    path: '/cinemas/search',
    name: 'search',
    component: Search,
    meta: {
      isLoginRequired: true
    }
  },
  {
    path: '/center',
    name: 'center',
    component: Center,
    meta: {
      isLoginRequired: true
    }
  },
  {
    path: '/login',
    name: 'login',
    component: Login
  },
  {
    path: '*',
    component: Films
  }
]
......

请求搜索效果:

优化登录返回

全局拦截中设置 query;登录后,返回原有要请求路径。

示例如下:

// 全局拦截(守卫)
router.beforeEach((to, from, next) => {
  console.log(to)

  if (to.meta.isLoginRequired) {
    // 进行验证 本地存储中是否有token
    if (!localStorage.getItem('token')) {
      next({
        path: '/login',
        query: { redirect: to.fullPath }
      })
    }
  }
  next()
})

登录完成后,返回原有将要请求路径。

export default {
  methods: {
    handleLogin () {
      setTimeout(() => {
        localStorage.setItem('token', '后端返回的token字段')
        // this.$router.back() //返回

        // 获取query字段中的路由进行跳转
        this.$router.push(this.$route.query.redirect)
      }, 0)
    }
  }
}

 

局部路由拦截

路由独享守卫

在路由配置上直接定义beforeEnter守卫:

这些守卫与全局前置守卫的方法参数是一样的。

组件内的守卫

最后,你可以在路由组件内直接定义以下路由导航守卫:

BeforeRouteEnter

beforeRouteUpdate(2.2新增)

beforeRouteLeave

在组件的生命周期中定义

 

总结

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue-route 全局和局部路由拦截及应用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JSON_L

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

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

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

打赏作者

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

抵扣说明:

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

余额充值