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

yizhihongxing

详解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中elementUI里面一些插件的使用

    下面我来详细讲解vue中elementUI里面一些插件的使用的攻略。 1. 环境配置 在进行elementUI插件的使用之前,需要先配置Vue项目的环境以便引入elementUI依赖。具体流程如下:1. 在命令行中进入Vue项目所在的根目录,输入npm i element-ui -S安装elementUI依赖包。2. 在项目的main.js中引入elemen…

    Vue 2023年5月28日
    00
  • Vue编译器解析compile源码解析

    Vue编译器是一个非常重要的组成部分,它的作用是将Vue组件中的template模板转化为渲染函数,以实现组件的动态渲染。本篇攻略将详细介绍Vue编译器解析compile源码的过程。 什么是compile源码? compile源码是Vue编译器的一部分,它是Vue的编译过程的核心部分。该部分主要负责将Vue组件的模板转化为渲染函数。 compile源码执行过…

    Vue 2023年5月27日
    00
  • webpack安装配置与常见使用过程详解(结合vue)

    一、安装配置 安装 Node.jsWebpack 基于 Node.js,需要先安装 Node.js。官网下载地址:https://nodejs.org/en/ 全局安装 webpack使用 npm 进行安装: npm install webpack -g 全局安装 webpack-cli 使用 npm 进行安装: npm install webpack-cl…

    Vue 2023年5月28日
    00
  • vue数据响应式原理重写函数实现数组响应式监听

    这里我为大家详细讲解一下“Vue数据响应式原理重写函数实现数组响应式监听”这个话题。 什么是Vue数据响应式原理 首先,我们要了解Vue的数据响应式原理。Vue可以实现数据的自动化更新,是因为它采用了数据劫持和发布订阅模式的方式。 Vue在读取数据时,会通过 Object.defineProperty 方法来劫持该数据的 getter 和 setter,一旦…

    Vue 2023年5月28日
    00
  • javascript和jQuery实现网页实时聊天的ajax长轮询

    一、什么是ajax长轮询 Ajax长轮询是指在客户端通过ajax向服务端发起请求,服务端接到请求后,如果有未处理的数据,则返回数据。如果没有未处理的数据,则一直等待,直到有未处理的数据。客户端接收到服务端返回的数据后,再向服务端发送新的请求。这个过程就是长轮询的实现。 二、实现网页实时聊天的ajax长轮询 实现网页实时聊天的ajax长轮询,可以使用JavaS…

    Vue 2023年5月27日
    00
  • 解决vue init webpack 下载依赖卡住不动的问题

    当使用vue-cli的模板生成器vue init webpack脚手架时,有时在安装依赖包的时候会卡在某个包上不动,导致整个过程无法继续。这种情况可能是由于网络问题、依赖版本冲突等多种原因造成的,以至于我们无法轻易判断出原因。但是,我们可以有一些解决办法来尝试解决这个问题。 下面是解决vue init webpack下载依赖卡住不动的问题的完整攻略: 1.更…

    Vue 2023年5月27日
    00
  • 详解vue-cli快速构建vue应用并实现webpack打包

    下面是“详解vue-cli快速构建vue应用并实现webpack打包”的完整攻略: 一、安装vue-cli 在终端中输入以下代码安装vue-cli: npm install -g vue-cli 二、创建vue项目 通过以下命令创建一个基于webpack模板的vue项目: vue init webpack myapp 其中,myapp为项目名称,可根据自己的…

    Vue 2023年5月27日
    00
  • vscode 插件开发 + vue的操作方法

    Vscode 插件开发 + Vue 操作方法 在本文中,我们将介绍如何使用 VSCode 开发插件,并在插件中使用 Vue。 环境要求 在开始使用 Vue 进行开发之前,我们需要先安装好以下环境: Node.js Visual Studio Code Vue CLI 如果您的电脑上还没有这些环境,请先安装好它们。 创建一个 VSCode 插件项目 使用以下命…

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