详解Vue中的路由与多种守卫

详解Vue中的路由与多种守卫

在Vue中,路由是前端开发中非常重要的一个概念,它提供了页面之间切换的功能。而在实际开发中,为了更好的控制页面的访问权限和交互行为,我们需要使用路由守卫来进行相关的操作。

路由的基本概念

在Vue中,使用Vue Router来进行路由的管理。Vue Router是Vue.js官方提供的路由管理器,可以实现页面跳转、路由拦截等功能。

路由配置

首先,我们需要在路由文件中配置路由信息,以便Vue Router管理页面跳转。以下是一个示例:

import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    redirect: '/home'
  },
  {
    path: '/home',
    component: () => import('../views/home.vue')
  },
  {
    path: '/about',
    component: () => import('../views/about.vue')
  }
]

const router = new VueRouter({
  routes
})

export default router
  • path: 页面路由路径,可以是字符串或者正则表达式。
  • redirect: 路由重定向,如果用户访问了重定向的路由,Vue Router会把请求重定向到目标路由。
  • component: 路由对应的组件。

路由跳转

在Vue中,使用router-link进行跳转,以下是一个示例:

<router-link to="/home">Home页面</router-link>
<router-link to="/about">About页面</router-link>

在页面中使用router-link组件,可以实现路由跳转,指定to属性为目标路由的path。

路由参数

在实际开发中,页面常常需要根据不同的参数展示不同的内容。在路由中,可以使用参数进行动态路由匹配。

以下是一个动态路由匹配的示例:

{
  path: '/user/:id',
  component: () => import('../views/user.vue'),
}

在上面的路由例子中,:id就是动态路由参数,可以通过$route.params.id来获取。

路由钩子函数

在路由跳转的过程中,我们可以使用路由钩子函数来进行一些自定义操作。Vue Router提供了三种路由钩子函数:

  • 全局守卫
  • 路由独享守卫
  • 组件内守卫

全局守卫

全局守卫会对所有路由进行拦截,可以在路由跳转前后进行一些操作,例如验证用户是否登录等。

以下是一个全局守卫的示例:

const router = new VueRouter({
  routes
})

router.beforeEach((to, from, next) => {
  // to: 即将要进入的目标路由对象
  // from: 当前导航即将离开的路由对象
  // next: 进入到目标路由之前执行的函数,next()表示继续执行路由,next(false)表示中断当前路由,next('/')表示跳转到指定路由

  if (to.path === '/login') {
    next()
  } else {
    const token = sessionStorage.getItem('token')
    if (!token) {
      next('/login')
    } else {
      next()
    }
  }
})

在上面的例子中,我们通过router.beforeEach()注册了一个全局前置守卫,通过to对象获取到目标路由的path,判断如果是登录路由则放行,否则检查用户是否登录,未登录则跳转到登录页面。

路由独享守卫

路由独享守卫只作用于某个路由,可以在该路由跳转前后进行一些操作,例如页面访问权限校验等。

以下是一个路由独享守卫的示例:

{
  path: '/admin',
  component: () => import('../views/admin.vue'),
  beforeEnter: (to, from, next) => {
    const token = sessionStorage.getItem('token')
    if (!token) {
      next('/login')
    } else {
      next()
    }
  }
}

在上面的路由例子中,我们通过beforeEnter属性来定义路由独享守卫,通过to对象获取到目标路由的path,判断用户是否登录,未登录则跳转到登录页面。

组件内守卫

组件内守卫只作用于当前组件,可以在该组件跳转前后进行一些操作,例如表单信息未保存提示等。

以下是一个组件内守卫的示例:

export default {
  data() {
    return {
      formData: {}
    }
  },
  beforeRouteLeave(to, from, next) {
    if (this.$route.meta.dirty) { // 如果表单信息有修改
      if (confirm('表单信息尚未保存,确定要离开页面吗?')) {
        next()
      } else {
        next(false) // 中断当前路由
      }
    } else {
      next()
    }
  }
}

在组件内使用beforeRouteLeave钩子函数来定义组件内守卫,如果表单信息有修改,弹出确认框提示用户是否离开页面,如果用户点击确定则继续路由跳转,否则中断路由跳转。

示例说明

示例1

在公司内部系统中,只有管理员才能访问管理员页面。以下是一个路由独享守卫的示例代码:

{
  path: '/admin',
  component: () => import('../views/admin.vue'),
  beforeEnter: (to, from, next) => {
    const token = sessionStorage.getItem('token')
    const role = sessionStorage.getItem('role')
    if (!token || role !== 'admin') {
      next('/login')
    } else {
      next()
    }
  }
}

在管理员页面路由中使用beforeEnter属性来定义路由独享守卫,判断用户是否登录和用户角色是否为管理员,若登录且角色为管理员则放行,否则跳转到登录页面。

示例2

在一个新闻编辑页面中,如果用户修改了表单信息但未保存,则在离开页面时提示用户是否离开。以下是一个组件内守卫的示例代码:

export default {
  data() {
    return {
      formData: {},
      dirty: false // 用来记录表单信息是否有修改
    }
  },
  methods: {
    saveData() {
      // 表单信息保存操作
      // ...
      this.dirty = false
    }
  },
  watch: {
    formData() {
      this.dirty = true
    }
  },
  beforeRouteLeave(to, from, next) {
    if (this.dirty) { // 如果表单信息有修改
      if (confirm('表单信息尚未保存,确定要离开页面吗?')) {
        next()
      } else {
        next(false) // 中断当前路由
      }
    } else {
      next()
    }
  }
}

在组件内使用beforeRouteLeave钩子函数来定义组件内守卫,使用dirty变量来记录表单信息是否有修改,在表单信息有修改时弹出确认框提示用户是否离开页面,用户点击确定则继续路由跳转,否则中断路由跳转。保存表单信息时需要将dirty标记为false。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Vue中的路由与多种守卫 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • vue组件文档(.md)中如何自动导入示例(.vue)详解

    要在Vue组件文档(.md)中自动导入示例(.vue),需要安装vue-styleguidist这个插件。接下来,我们以vue-cli3创建的项目为例,来讲解如何实现自动导入示例。 第一步:安装vue-styleguidist插件 首先,在项目根目录下使用npm命令行安装vue-styleguidist插件。 npm install vue-stylegui…

    Vue 2023年5月28日
    00
  • VueJS 取得 URL 参数值的方法

    请参考以下攻略: 一、背景介绍 在 VueJS 中,我们通常需要获取 URL 地址中的参数值,以便在页面上或组件内使用。本文就来介绍一下如何在 VueJS 中获取 URL 参数值。 二、获取 URL 参数值的方法 在 VueJS 中获取 URL 参数值有多种方法,这里我们结合两个实例来进行介绍。 方法一:使用 window.location.search 方…

    Vue 2023年5月28日
    00
  • Project Reactor 响应式范式编程

    Project Reactor 响应式范式编程 简介 Project Reactor是一款响应式范式编程框架,用于构建基于流(stream)概念的异步、非阻塞、事件驱动的应用程序。它基于Reactive Streams标准,并提供了一系列工具类和API,能够轻松地创建、组合和执行异步流处理操作。在使用Project Reactor编程时,开发人员通过声明式方…

    Vue 2023年5月28日
    00
  • vue的h5日历组件实现详解

    vue的h5日历组件实现详解 什么是vue的h5日历组件? vue的h5日历组件是一个基于vue框架实现的,适用于手机h5应用的日历组件。它可以方便地实现日历的展示、日期的选择、事件的添加和编辑等功能。 实现步骤 第一步:安装依赖 首先,需要安装两个依赖:vue-calendar 和 moment.js。我们可以使用npm或yarn进行安装: npm ins…

    Vue 2023年5月29日
    00
  • vue项目刷新当前页面的三种方式(重载当前页面数据)

    有关Vue项目刷新当前页面的三种方式,可以从以下三个方面展开说明: 1. 利用location.reload()方法进行页面刷新 在Vue中,可以通过调用浏览器原生的location.reload()方法来实现页面刷新。该方法会重新加载当前页面,重新发起一次网络请求,对页面元素进行重绘,因此能够实现重载当前页面数据的目的。可以在Vue组件中定义一个方法,通过…

    Vue 2023年5月29日
    00
  • Vue项目API接口封装的超详细解答

    下面是关于“Vue项目API接口封装的超详细解答”的完整攻略。 什么是API接口封装 API接口封装是将前端应用与后端应用分离的一种实现方式,通过提供API接口,前端和后端可以独立开发和维护各自的应用。前端通过向后端发送请求,获取数据并返回前端页面进行渲染。 API接口封装的好处包括:- 前后端分离,提高开发效率;- 保障数据的安全性,不会暴露后端实现细节;…

    Vue 2023年5月28日
    00
  • 如何启动一个Vue.js项目

    启动一个Vue.js项目可以分为以下几个步骤: 步骤1:安装Node.js和npm Vue.js是构建于Node.js之上的,所以首先需要安装Node.js和npm。Node.js下载地址为 https://nodejs.org/zh-cn/,下载合适的版本进行安装。npm是自带的包管理工具,不需要单独下载安装。 安装完成之后,可以在命令行中输入如下命令验证…

    Vue 2023年5月28日
    00
  • Vue.component的属性说明

    下面详细讲解一下Vue中的组件属性说明。 Vue.component的属性说明 在Vue中,组件的一些常用属性可以用Vue.component进行定义。下面是Vue.component的主要属性说明: props props属性用于接收父组件传递过来的数据,在组件内部通过 this.$props 访问。它是一个数组或对象,数组中的元素可以是字符串或对象。如果…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部